Skip to content

پیوست الف — ساخت کلاستر Kubernetes روی Raspberry Pi

در حالی که Kubernetes اغلب از طریق دنیای مجازی cloud computing عمومی تجربه می‌شود — جایی که نزدیک‌ترین فاصلهٔ شما تا کلاستر یک مرورگر وب یا ترمینال است — می‌تواند تجربهٔ بسیار رضایت‌بخشی باشد که فیزیکی یک کلاستر Kubernetes روی bare metal بسازید. به همان اندازه، هیچ چیز با کشیدن فیزیکی برق یا شبکه از یک node و تماشای واکنش Kubernetes برای heal کردن برنامهٔ شما قابل مقایسه نیست تا به کاربرد آن متقاعد شوید.

ساخت کلاستر خود ممکن است هم چالش‌برانگیز و هم پرهزینه به نظر برسد، اما خوشبختانه هیچ‌کدام نیست. امکان خرید بردهای کامپیوتر system-on-chip کم‌هزینه، و همچنین کار زیاد جامعه برای آسان‌تر کردن نصب Kubernetes، یعنی می‌توان در چند ساعت یک کلاستر Kubernetes کوچک ساخت.

در دستورالعمل‌های زیر، روی ساخت کلاستری از ماشین‌های Raspberry Pi تمرکز می‌کنیم، اما با تطبیق‌های جزئی همان دستورالعمل‌ها می‌توان برای انواع مختلف ماشین‌های تک‌بردی هم به کار برد.

فهرست قطعات

اولین کار جمع‌آوری قطعات کلاستر است. در همهٔ مثال‌های اینجا، فرض می‌کنیم کلاستری چهار node داریم. می‌توانید کلاستر سه node یا حتی صد node بسازید اگر بخواهید، اما چهار عدد خوب است.

برای شروع باید (یا پیدا کنید) قطعات لازم برای ساخت کلاستر را بخرید. این فهرست خرید است، با قیمت‌های تقریبی در زمان نگارش:

  1. چهار برد Raspberry Pi 3 (Raspberry Pi 2 هم کار می‌کند) — ۱۶۰ دلار
  2. چهار کارت حافظه SDHC، حداقل ۸ گیگابایت (کیفیت بالا بخرید!) — ۳۰–۵۰ دلار
  3. چهار کابل Ethernet Cat. 6 به طول ۱۲ اینچ — ۱۰ دلار
  4. چهار کابل USB A–Micro USB به طول ۱۲ اینچ — ۱۰ دلار
  5. یک سوئیچ Fast Ethernet 10/100 پنج‌پورت — ۱۰ دلار
  6. یک شارژر USB پنج‌پورت — ۲۵ دلار
  7. یک قاب stackable Raspberry Pi برای نگه‌داشتن چهار Pi — ۴۰ دلار (یا خودتان بسازید)
  8. یک USB-to-barrel plug برای تغذیهٔ سوئیچ Ethernet (اختیاری) — ۵ دلار

جمع کل کلاستر حدود ۳۰۰ دلار می‌شود که می‌توانید با ساخت کلاستر سه node و حذف قاب و کابل USB تغذیهٔ سوئیچ به ۲۰۰ دلار کاهش دهید (هرچند قاب و کابل واقعاً کل کلاستر را مرتب می‌کنند).

یک نکتهٔ دیگر دربارهٔ کارت‌های حافظه: اینجا صرفه‌جویی نکنید. کارت‌های حافظهٔ ارزان رفتار غیرقابل پیش‌بینی دارند و کلاستر را واقعاً ناپایدار می‌کنند. اگر می‌خواهید پول کمتر خرج کنید، کارت کوچک‌تر با کیفیت بالا بخرید. کارت‌های ۸ گیگابایت باکیفیت را می‌توان آنلاین حدود ۷ دلار برای هر کدام پیدا کرد.

وقتی قطعات را دارید، آمادهٔ ساخت کلاستر هستید.

این دستورالعمل‌ها همچنین فرض می‌کنند دستگاهی دارید که بتواند کارت SDHC را flash کند. اگر ندارید، باید یک USB → memory card reader/writer بخرید.

flash کردن imageها

image پیش‌فرض Raspbian حالا Docker را از طریق روش‌های نصب استاندارد پشتیبانی می‌کند، اما برای آسان‌تر شدن، پروژهٔ Hypriot imageهایی با Docker از پیش نصب‌شده ارائه می‌دهد.

به صفحهٔ دانلود Hypriot سر بزنید و آخرین image پایدار را دانلود کنید. image را unzip کنید و باید فایل .img داشته باشید. پروژهٔ Hypriot همچنین مستندات عالی برای نوشتن این image روی کارت حافظه برای هر یک از این پلتفرم‌ها دارد:

  • macOS
  • Windows
  • Linux

همان image را روی هر یک از کارت‌های حافظه بنویسید.

اولین بوت: Master

اولین کار بوت کردن فقط node master است. کلاستر را مونتاژ کنید و تصمیم بگیرید کدام master خواهد بود. کارت حافظه را وارد کنید، برد را به خروجی HDMI وصل کنید و کیبورد را به پورت USB وصل کنید.

بعد، برق را وصل کنید تا برد بوت شود.

در prompt با نام کاربری pirate و رمز عبور hypriot وارد شوید.

اولین کاری که باید با Raspberry Pi (یا هر دستگاه جدید) انجام دهید تغییر رمز عبور پیش‌فرض است. رمز عبور پیش‌فرض برای هر نوع نصب در همه‌جا برای افرادی که با login پیش‌فرض به سیستم بد رفتار می‌کنند شناخته‌شده است. این اینترنت را برای همه ناامن‌تر می‌کند. لطفاً رمزهای عبور پیش‌فرض را تغییر دهید!

راه‌اندازی شبکه

گام بعدی راه‌اندازی شبکه روی master است.

اول WiFi را راه بیندازید. این لینک بین کلاستر و دنیای بیرون خواهد بود. فایل /boot/user-data را ویرایش کنید. SSID و رمز عبور WiFi را با محیط خودتان به‌روز کنید. اگر بخواهید شبکه عوض کنید، همین فایلی است که باید ویرایش کنید. وقتی ویرایش کردید، با sudo reboot reboot کنید و تأیید کنید شبکه کار می‌کند.

گام بعدی در شبکه، تنظیم آدرس IP ثابت برای شبکهٔ داخلی کلاستر است. برای این کار /etc/network/interfaces.d/eth0 را طوری ویرایش کنید که بخواند:

allow-hotplug eth0
iface eth0 inet static
    address 10.0.0.1
    netmask 255.255.255.0
    broadcast 10.0.0.255
    gateway 10.0.0.1

این interface اصلی Ethernet را با آدرس تخصیص‌یافتهٔ ثابت 10.0.0.1 تنظیم می‌کند.

ماشین را reboot کنید تا آدرس 10.0.0.1 را بگیرد.

بعد، DHCP را روی این master نصب می‌کنیم تا به worker nodeها آدرس تخصیص دهد. اجرا کنید:

$ apt-get install isc-dhcp-server

سپس سرور DHCP را به‌صورت زیر پیکربندی کنید (/etc/dhcp/dhcpd.conf):

# Set a domain name, can basically be anything
option domain-name "cluster.home";

# Use Google DNS by default, you can substitute ISP-supplied values here
option domain-name-servers 8.8.8.8, 8.8.4.4;

# We'll use 10.0.0.X for our subnet
subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.1 10.0.0.10;
    option subnet-mask 255.255.255.0;
    option broadcast-address 10.0.0.255;
    option routers 10.0.0.1;
}
default-lease-time 600;
max-lease-time 7200;
authoritative;

ممکن است همچنین نیاز باشد /etc/defaults/isc-dhcp-server را ویرایش کنید تا متغیر محیطی INTERFACES را روی eth0 بگذارید.

سرور DHCP را با sudo systemctl restart isc-dhcp-server restart کنید.

حالا ماشین باید آدرس IP تخصیص دهد. می‌توانید با وصل کردن ماشین دوم به سوئیچ از طریق Ethernet آزمایش کنید. این ماشین دوم باید آدرس 10.0.0.2 را از سرور DHCP بگیرد.

یادتان باشد فایل /etc/hostname را ویرایش کنید تا این ماشین را به node-1 تغییر نام دهید.

گام نهایی در راه‌اندازی شبکه، تنظیم network address translation (NAT) است تا nodeها به اینترنت عمومی دسترسی داشته باشند (اگر بخواهید بتوانند).

/etc/sysctl.conf را ویرایش کنید و net.ipv4.ip_forward=1 را بگذارید تا IP forwarding روشن شود. سپس سرور را reboot کنید تا اثر کند. یا می‌توانید sudo sysctl net.ipv4.ip_forward=1 اجرا کنید تا بدون reboot تغییر کند. اگر این را انتخاب کردید، همچنان می‌خواهید /etc/sysctl.conf را ویرایش کنید تا تنظیم دائمی شود.

سپس /etc/rc.local (یا معادل) را ویرایش کنید و قوانین iptables برای forwarding از eth0 به wlan0 (و برگشت) اضافه کنید:

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -i wlan0 -o eth0 -m state \
  --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT

در این نقطه، راه‌اندازی پایهٔ شبکه باید کامل باشد. دو برد باقی‌مانده را وصل و روشن کنید (باید آدرس‌های 10.0.0.3 و 10.0.0.4 به آن‌ها تخصیص داده شود). فایل /etc/hostname روی هر ماشین را ویرایش کنید تا node-2 و node-3 نام‌گذاری شوند.

با نگاه کردن به /var/lib/dhcp/dhcpd.leases و سپس SSH به nodeها تأیید کنید (یادتان باشد اولین کار تغییر رمز عبور پیش‌فرض است). تأیید کنید nodeها به اینترنت خارجی وصل می‌شوند.

امتیاز اضافه

چند گام اضافی هست که مدیریت کلاستر را آسان‌تر می‌کند.

اولی ویرایش /etc/hosts روی هر ماشین برای نگاشت نام‌ها به آدرس‌های درست است. روی هر ماشین اضافه کنید:

...
10.0.0.1 kubernetes
10.0.0.2 node-1
10.0.0.3 node-2
10.0.0.4 node-3
...

حالا می‌توانید از آن نام‌ها هنگام اتصال به آن ماشین‌ها استفاده کنید.

دومی راه‌اندازی دسترسی SSH بدون رمز عبور است. برای این کار ssh-keygen اجرا کنید و سپس فایل $HOME/.ssh/id_rsa.pub را در /home/pirate/.ssh/authorized_keys روی node-1، node-2 و node-3 کپی کنید.

نصب Kubernetes

در این نقطه باید همهٔ nodeها بالا باشند، با آدرس IP و قادر به دسترسی به اینترنت. حالا وقت نصب Kubernetes روی همهٔ nodeهاست.

با SSH، دستورات زیر را روی همهٔ nodeها برای نصب ابزارهای kubelet و kubeadm اجرا کنید. برای اجرای این دستورات باید root باشید. از sudo su برای ارتقا به کاربر root استفاده کنید.

اول، کلید رمزنگاری برای packageها را اضافه کنید:

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

سپس مخزن را به فهرست مخازن اضافه کنید:

# echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" \
  >> /etc/apt/sources.list.d/kubernetes.list

در نهایت به‌روزرسانی کنید و ابزارهای Kubernetes را نصب کنید. این هم همهٔ packageهای سیستم را برای احتیاط به‌روز می‌کند:

# apt-get update
$ apt-get upgrade
$ apt-get install -y kubelet kubeadm kubectl kubernetes-cni

Kubernetes هنگام شروع از تعداد زیادی cgroup هسته استفاده می‌کند. انتظار دارد این قابلیت‌ها حضور داشته باشند و اگر نباشند ممکن است شروع نشود. مطمئن شوید آخرین kernel موجود در توزیع Raspberry Pi را اجرا می‌کنید.

راه‌اندازی کلاستر

روی node master (همان که DHCP اجرا می‌کند و به اینترنت وصل است)، اجرا کنید:

$ sudo kubeadm init --pod-network-cidr 10.244.0.0/16 \
        --apiserver-advertise-address 10.0.0.1 \
        --apiserver-cert-extra-sans kubernetes.cluster.home

توجه کنید آدرس IP رو به داخل را advertise می‌کنید، نه آدرس خارجی.

در نهایت، دستوری برای join کردن nodeها به کلاستر چاپ می‌کند. چیزی شبیه این خواهد بود:

$ kubeadm join --token=<token> 10.0.0.1

با SSH به هر worker node در کلاستر بروید و آن دستور را اجرا کنید.

وقتی همهٔ این‌ها تمام شد، باید بتوانید این دستور را اجرا کنید و کلاستر کاری خود را ببینید:

$ kubectl get nodes

راه‌اندازی شبکهٔ کلاستر

شبکهٔ سطح node را راه انداخته‌اید، اما باید شبکهٔ Pod-to-Pod را راه بیندازید. چون همهٔ nodeها در کلاستر روی همان شبکهٔ فیزیکی Ethernet اجرا می‌شوند، می‌توانید ساده قوانین routing درست را در kernelهای host تنظیم کنید.

آسان‌ترین راه مدیریت این، استفاده از ابزار Flannel ساخته‌شده توسط CoreOS است. Flannel از چند حالت routing مختلف پشتیبانی می‌کند؛ از حالت host-gw استفاده می‌کنیم. می‌توانید پیکربندی نمونه را از صفحهٔ پروژهٔ Flannel دانلود کنید:

$ curl https://rawgit.com/coreos/flannel/master/Documentation/kube-flannel.yml \
  > kube-flannel.yaml

پیکربندی پیش‌فرضی که CoreOS ارائه می‌دهد به‌جای آن از حالت vxlan استفاده می‌کند، و همچنین معماری AMD64 به‌جای ARM. برای اصلاح، آن فایل پیکربندی را در ویرایشگر مورد علاقه‌تان باز کنید؛ vxlan را با host-gw جایگزین کنید و همهٔ نمونه‌های amd64 را با arm جایگزین کنید.

همچنین می‌توانید با ابزار sed درجا این کار را انجام دهید:

$ curl https://rawgit.com/coreos/flannel/master/Documentation/kube-flannel.yml \
  | sed "s/amd64/arm/g" | sed "s/vxlan/host-gw/g" \
  > kube-flannel.yaml

وقتی فایل kube-flannel.yaml به‌روزشده را دارید، می‌توانید راه‌اندازی شبکهٔ Flannel را با این دستور بسازید:

$ kubectl apply -f kube-flannel.yaml

این دو شیء می‌سازد: یک ConfigMap برای پیکربندی Flannel و یک DaemonSet که daemon واقعی Flannel را اجرا می‌کند. می‌توانید با این دستورات بررسی کنید:

$ kubectl describe --namespace=kube-system configmaps/kube-flannel-cfg
$ kubectl describe --namespace=kube-system daemonsets/kube-flannel-ds

راه‌اندازی GUI

Kubernetes با یک GUI غنی عرضه می‌شود. می‌توانید با اجرای این دستور نصبش کنید:

$ DASHSRC=https://raw.githubusercontent.com/kubernetes/dashboard/master
$ curl -sSL \
  $DASHSRC/src/deploy/recommended/kubernetes-dashboard-arm-head.yaml \
  | kubectl apply -f -

برای دسترسی به این UI می‌توانید kubectl proxy اجرا کنید و سپس مرورگر را به http://localhost:8001/ui ببرید، جایی که localhost محلی به node master در کلاستر شماست. برای مشاهده از لپ‌تاپ/دسکتاپ ممکن است نیاز باشد tunnel SSH به root node راه بیندازید با ssh -L8001:localhost:8001 <master-ip-address>.

خلاصه

در این نقطه باید یک کلاستر Kubernetes کاری روی Raspberry Piهای خود داشته باشید. این می‌تواند برای کاوش Kubernetes عالی باشد. چند job زمان‌بندی کنید، UI را باز کنید، و با reboot کردن ماشین‌ها یا قطع شبکه کلاستر را بشکنید و ببینید چه می‌شود.