توجه داشته باشید. ترجمه: این مقاله که توسط یک مهندس SRE از LinkedIn نوشته شده است، به جزئیات در مورد جادوی درونی Kubernetes می پردازد - به طور دقیق تر، تعامل CRI، CNI و kube-apiserver - که زمانی اتفاق می افتد که به pod بعدی نیاز به تخصیص آدرس IP باشد.
یکی از الزامات اساسی این است که هر پاد باید آدرس IP مخصوص به خود را داشته باشد و هر پاد دیگری در کلاستر باید بتواند در آن آدرس با آن تماس بگیرد. بسیاری از "ارائه دهندگان" شبکه (Flannel، Calico، Canal، و غیره) وجود دارند که به پیاده سازی این مدل شبکه کمک می کنند.
وقتی برای اولین بار کار با Kubernetes را شروع کردم، برای من کاملاً مشخص نبود که پادها دقیقاً چگونه آدرس IP خود را دریافت می کنند. حتی با درک نحوه عملکرد اجزای جداگانه، تصور اینکه آنها با هم کار کنند دشوار بود. برای مثال، من میدانستم که پلاگینهای CNI برای چه هستند، اما نمیدانستم دقیقاً چگونه نامیده میشوند. بنابراین، تصمیم گرفتم این مقاله را بنویسم تا دانشی در مورد اجزای مختلف شبکه و نحوه کار آنها با یکدیگر در یک خوشه Kubernetes به اشتراک بگذارم، که به هر پاد اجازه می دهد آدرس IP منحصر به فرد خود را دریافت کند.
راه های مختلفی برای سازماندهی شبکه در Kubernetes وجود دارد، درست مانند گزینه های زمان اجرا متفاوت برای کانتینرها. این نشریه استفاده خواهد کرد برای سازماندهی یک شبکه در یک خوشه، و به عنوان یک محیط اجرایی - . من همچنین این فرض را میکنم که شما میدانید شبکهسازی بین کانتینرها چگونه کار میکند، بنابراین به طور خلاصه به آن اشاره میکنم، فقط برای زمینه.
چند مفهوم اساسی
کانتینرها و شبکه: مروری کوتاه
نشریات عالی زیادی به صورت آنلاین وجود دارد که توضیح میدهند چگونه کانتینرها از طریق شبکه با یکدیگر ارتباط برقرار میکنند. بنابراین، من فقط یک مرور کلی از مفاهیم اصلی ارائه میدهم و خودم را به یک رویکرد محدود میکنم که شامل ایجاد Linux-پلبندی و کپسولهسازی بسته. جزئیات حذف شدهاند، زیرا موضوع شبکهسازی کانتینرها خود شایسته یک مقاله جداگانه است. لینکهایی به برخی از نشریات آموزنده و بصیرتبخش در زیر ارائه شده است.
کانتینرها روی یک میزبان
یک راه برای سازماندهی ارتباط از طریق آدرسهای IP بین کانتینرهایی که روی یک میزبان اجرا میشوند، شامل ایجاد ... Linux-bridge. برای این کار، دستگاههای مجازی در Kubernetes (و Docker) ایجاد میشوند. . یک سر دستگاه veth به فضای نام شبکه کانتینر متصل می شود، سر دیگر به فضای نام شبکه در شبکه میزبان
تمام کانتینرهای روی یک میزبان واحد، یک سرِ وِت (veth) دارند که به یک پل (bridge) متصل است و از طریق آن میتوانند از طریق آدرسهای IP با یکدیگر ارتباط برقرار کنند. Linuxاین پل همچنین دارای یک آدرس IP است و به عنوان دروازهای برای ترافیک خروجی (خروجی) از پادها به مقصد سایر گرهها عمل میکند.

کانتینرها روی میزبان های مختلف
بسته بندی بسته روشی است که به کانتینرهای گره های مختلف اجازه می دهد تا با استفاده از آدرس های IP با یکدیگر ارتباط برقرار کنند. در Flannel، فناوری مسئول این فرصت است. ، که بسته اصلی را در یک بسته UDP "بسته بندی" می کند و سپس آن را به مقصد می فرستد.
در یک خوشه Kubernetes، Flannel یک دستگاه vxlan ایجاد می کند و جدول مسیر را در هر گره متناسب با آن به روز می کند. هر بسته ای که برای یک کانتینر در یک میزبان متفاوت است از دستگاه vxlan عبور می کند و در یک بسته UDP محصور می شود. در مقصد، بسته تودرتو استخراج شده و به غلاف مورد نظر ارسال می شود.

توجه: این تنها یک راه برای سازماندهی ارتباطات شبکه بین کانتینرها است.
CRI چیست؟
افزونه ای است که به Kubelet اجازه می دهد تا از محیط های زمان اجرا کانتینر مختلف استفاده کند. CRI API در زمانهای اجرا مختلف تعبیه شده است، بنابراین کاربران میتوانند زمان اجرا مورد نظر خود را انتخاب کنند.
CNI چیست؟
یک است برای سازماندهی یک راه حل شبکه جهانی برای Linux-کانتینرها علاوه بر این، شامل موارد زیر نیز میشود ، در هنگام راه اندازی یک شبکه پاد، وظایف مختلفی را بر عهده دارد. افزونه CNI یک فایل اجرایی است که با مشخصات مطابقت دارد (در زیر به برخی از افزونه ها خواهیم پرداخت).
تخصیص زیرشبکه ها به گره ها برای تخصیص آدرس های IP به پادها
از آنجایی که هر پاد در یک کلاستر باید یک آدرس IP داشته باشد، مهم است که اطمینان حاصل شود که این آدرس منحصر به فرد است. این امر با تخصیص به هر گره یک زیرشبکه منحصربفرد حاصل میشود که از آن آدرسهای IP به پادهای آن گره اختصاص داده میشود.
Node IPAM Controller
وقتی که nodeipam به عنوان یک پارامتر پرچم ارسال شد --controllers ، یک زیرشبکه جداگانه (podCIDR) به هر گره از CIDR خوشه (یعنی محدوده آدرس های IP برای شبکه خوشه) اختصاص می دهد. از آنجایی که این podCIDR ها با هم همپوشانی ندارند، این امکان وجود دارد که به هر پاد یک آدرس IP منحصر به فرد اختصاص داده شود.
یک گره Kubernetes زمانی که در ابتدا در خوشه ثبت می شود، یک podCIDR اختصاص می یابد. برای تغییر podCIDR گرهها، باید آنها را لغو ثبت کنید و سپس مجدداً ثبت کنید، و در این بین تغییرات مناسبی در پیکربندی لایه کنترل Kubernetes ایجاد کنید. با استفاده از دستور زیر می توانید podCIDR یک گره را نمایش دهید:
$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubelet، Container Runtime و پلاگین های CNI: چگونه کار می کند
برنامه ریزی یک غلاف در هر گره شامل مراحل آماده سازی زیادی است. در این بخش فقط به مواردی می پردازم که مستقیماً با راه اندازی یک شبکه پاد مرتبط هستند.
زمانبندی یک غلاف برای یک گره خاص، زنجیرهای از رویدادهای زیر را آغاز میکند:

راهنما: .
تعامل بین زمان اجرا کانتینر و پلاگین های CNI
هر ارائه دهنده شبکه پلاگین CNI خود را دارد. زمان اجرا کانتینر آن را اجرا می کند تا شبکه را برای پاد هنگام راه اندازی پیکربندی کند. در مورد کانتینر، پلاگین CNI توسط افزونه راه اندازی می شود .
علاوه بر این، هر ارائه دهنده نماینده خود را دارد. بر روی تمام گره های Kubernetes نصب شده است و مسئولیت پیکربندی شبکه pods را بر عهده دارد. این عامل یا با پیکربندی CNI گنجانده شده است یا به طور مستقل آن را روی گره ایجاد می کند. این پیکربندی به پلاگین CRI کمک می کند تا تعیین کند که کدام افزونه CNI را فراخوانی کند.
محل پیکربندی CNI را می توان سفارشی کرد. به طور پیش فرض در است /etc/cni/net.d/<config-file>. مدیران کلاستر همچنین مسئول نصب پلاگین های CNI در هر گره خوشه هستند. مکان آنها نیز قابل تنظیم است. دایرکتوری پیش فرض - /opt/cni/bin.
هنگام استفاده از Containerd، مسیرهای پیکربندی افزونه و باینری ها را می توان در بخش تنظیم کرد [plugins.«io.containerd.grpc.v1.cri».cni] в .
از آنجایی که ما از Flannel به عنوان ارائه دهنده شبکه خود استفاده می کنیم، اجازه دهید کمی در مورد راه اندازی آن صحبت کنیم:
- Flanneld (شیب فلانل) معمولاً در یک خوشه به عنوان DaemonSet با
install-cniمانند . Install-cniایجاد می کند (/etc/cni/net.d/10-flannel.conflist) روی هر گره.- Flanneld یک دستگاه vxlan ایجاد می کند، ابرداده های شبکه را از سرور API بازیابی می کند و به روز رسانی های پاد را نظارت می کند. همانطور که آنها ایجاد می شوند، مسیرها را به همه غلاف ها در سراسر خوشه توزیع می کند.
- این مسیرها به پادها اجازه می دهند تا از طریق آدرس های IP با یکدیگر ارتباط برقرار کنند.
برای اطلاعات دقیق تر در مورد کار فلانل، توصیه می کنم از پیوندهای انتهای مقاله استفاده کنید.
در اینجا نموداری از تعامل بین پلاگین Containerd CRI و پلاگین های CNI آورده شده است:

همانطور که در بالا می بینید، kubelet برای ایجاد پاد، پلاگین Containerd CRI را فراخوانی می کند، که سپس پلاگین CNI را برای پیکربندی شبکه پاد فراخوانی می کند. با انجام این کار، پلاگین CNI ارائه دهنده شبکه، سایر پلاگین های اصلی CNI را برای پیکربندی جنبه های مختلف شبکه فراخوانی می کند.
تعامل بین پلاگین های CNI
پلاگین های مختلف CNI وجود دارد که وظیفه آنها کمک به راه اندازی ارتباط شبکه بین کانتینرها در هاست است. این مقاله سه مورد از آنها را مورد بحث قرار خواهد داد.
پلاگین CNI Flannel
هنگام استفاده از Flannel به عنوان یک ارائه دهنده شبکه، مؤلفه Containerd CRI تماس می گیرد با استفاده از فایل پیکربندی CNI /etc/cni/net.d/10-flannel.conflist.
$ cat /etc/cni/net.d/10-flannel.conflist
{
"name": "cni0",
"plugins": [
{
"type": "flannel",
"delegate": {
"ipMasq": false,
"hairpinMode": true,
"isDefaultGateway": true
}
}
]
}
افزونه Flannel CNI در ارتباط با Flanneld کار می کند. در طول راه اندازی، Flanneld podCIDR و سایر جزئیات مربوط به شبکه را از سرور API بازیابی می کند و آنها را در یک فایل ذخیره می کند. /run/flannel/subnet.env.
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
افزونه Flannel CNI از داده های موجود استفاده می کند /run/flannel/subnet.env برای پیکربندی و فراخوانی پلاگین CNI bridge.
پلاگین CNI Bridge
این افزونه با تنظیمات زیر فراخوانی می شود:
{
"name": "cni0",
"type": "bridge",
"mtu": 1450,
"ipMasq": false,
"isGateway": true,
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24"
}
}
در اولین فراخوانی، ایجاد میکند Linux-پل با «name»: «cni0»که در پیکربندی مشخص شده است. سپس، یک جفت veth برای هر Pod ایجاد میشود. یک سر آن به فضای نام شبکه کانتینر متصل میشود و سر دیگر آن در ... قرار میگیرد. Linux-پل در شبکه میزبان. تمام کانتینرهای میزبان را به هم متصل میکند Linux-پل در شبکه میزبان.
پس از اتمام راهاندازی جفت veth، افزونه Bridge افزونه IPAM CNI میزبان-محلی را فراخوانی میکند. نوع پلاگین IPAM را می توان در پیکربندی CNI که پلاگین CRI برای فراخوانی افزونه Flannel CNI استفاده می کند، پیکربندی کرد.
پلاگین های میزبان محلی IPAM CNI
تماس های CNI بریج با پیکربندی زیر:
{
"name": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24",
"dataDir": "/var/lib/cni/networks"
}
}
پلاگین IPAM میزبان محلی (IP Address Mمدیریت - مدیریت آدرس IP) آدرس IP کانتینر را از زیر شبکه برمی گرداند و IP اختصاص داده شده را در هاست در دایرکتوری مشخص شده در بخش ذخیره می کند. dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. این فایل حاوی شناسه کانتینری است که این آدرس IP به آن اختصاص داده شده است.
هنگام فراخوانی افزونه IPAM میزبان محلی، داده های زیر را برمی گرداند:
{
"ip4": {
"ip": "10.244.4.2",
"gateway": "10.244.4.3"
},
"dns": {}
}
خلاصه
Kube-controller-manager یک podCIDR را به هر گره اختصاص می دهد. پادهای هر گره آدرس های IP را از فضای آدرس در محدوده اختصاص داده شده podCIDR دریافت می کنند. از آنجایی که podCIDR های گره ها همپوشانی ندارند، همه پادها آدرس های IP منحصر به فردی را دریافت می کنند.
مدیر خوشه Kubernetes، kubelet، زمان اجرا کانتینر، عامل ارائه دهنده شبکه را پیکربندی و نصب می کند و پلاگین های CNI را در هر گره کپی می کند. در طول راه اندازی، عامل ارائه دهنده شبکه یک پیکربندی CNI را ایجاد می کند. هنگامی که یک pod برای یک گره برنامه ریزی می شود، kubelet پلاگین CRI را برای ایجاد آن فراخوانی می کند. در مرحله بعد، در صورت استفاده از Containerd، افزونه Containerd CRI، افزونه CNI مشخص شده در پیکربندی CNI را برای پیکربندی شبکه غلاف فراخوانی میکند. در نتیجه، پاد یک آدرس IP دریافت می کند.
مدتی طول کشید تا تمام ظرافت ها و ظرایف همه این تعاملات را درک کنم. امیدوارم این تجربه به شما در درک بهتر نحوه عملکرد Kubernetes کمک کند. اگر در مورد چیزی اشتباه می کنم، لطفا با من تماس بگیرید یا در آدرس . اگر مایلید در مورد جنبه های این مقاله یا هر چیز دیگری صحبت کنید، با خیال راحت تماس بگیرید. من دوست دارم با شما چت کنم!
مراجع
کانتینرها و شبکه
فلانل چگونه کار می کند؟
CRI و CNI
PS از مترجم
در وبلاگ ما نیز بخوانید:
- «"؛
- "راهنمای مصور برای شبکه سازی در Kubernetes": , ;
- «'.
منبع: www.habr.com
