در این مقاله به نحوه ایجاد کلاستر Kubernetes در حالت مالتی مستر می پردازیم و اصطلاحا یک کلاستر کاملا پایدار (Highly available Kubernetes cluster) را از طریق ابزار kubeadm نصب و راه اندازی خواهیم کرد. برای شروع پیشنهاد می کنیم از توپولوژی Stacked ETCD استفاده نمایید و پس از تسلط کامل به معماری کلاستر کوبرنتیز، اقدام به راه اندازی توپولوزی های دیگر نمایید. شایان ذکر است در این توپولوژی، کامپوننت ETCD با سایر کامپوننت های control plane کلاستر (Kube-apiserver / kube-scheduler / kube-contoller-manager) در یک نود قرار گرفته و تشکیل یک کلاستر پایدار را می دهند.
در نظر داشته باشید برای راه اندازی این کلاستر به حداقل سه نود بعنوان مستر نود، چند نود ورکر و یک نود بعنوان لودبالانسر نیاز داریم. تمام این نودها می توانند بصورت فیزیکی یا ماشین مجازی ایجاد و استفاده شوند.
طبق جدول زیر ماشین های مجازی را ساخته و تنظیمات لازم از قبیل پیکربندی فایل hosts، تنظیمات دسترسی به اینترنت و tcp/ip را بر روی ماشین های مجازی اعمال میکنیم
۱۹۲٫۱۶۸٫۹۰٫۱۲۰ | kube-master1 |
۱۹۲٫۱۶۸٫۹۰٫۱۲۱ | kube-master2 |
۱۹۲٫۱۶۸٫۹۰٫۱۲۲ | kube-master3 |
۱۹۲٫۱۶۸٫۹۰٫۱۲۳ | kube-worker1 |
۱۹۲٫۱۶۸٫۹۰٫۱۲۴ | kube-worker2 |
۱۹۲٫۱۶۸٫۹۰٫۱۲۵ | lb1 |
پیش نیازها:
- راه اندازی و پیکربندی لودبالانسر
- نصب داکر و کوبرنتیز روی همه نودها
- برپایی و ایجاد کلاستر بر روی نود مستر
- اضافه کردن سایر نودهای مستر به کلاستر
- توسعه پلاگین شبکه در سطح کلاستر
- اضافه کردن نودهای ورکر به کلاستر
- بررسی کلاستر
در ادامه با مراحل و پروسه نصب پیش نیازها و سایر مراحل پیکربندی ایجاد کلاستر آشنا خواهید شد.
- راه اندازی و پیکربندی لودبالانسر
برای لود بالانسر از لودبالانسر نرم افزاری HAProxy استفاده کرده ایم. برای اینکار در یک ماشین مجازی اقدام به نصب haproxy نمایید و تنظیمات لازم را بصورت زیر انجام دهید.
apt update && apt install -y haproxy
بعد از نصب نرم افزار haproxy کافیست فایل پیکربندی آنرا در مسیر /etc/haproxy/haproxy.cfg باز کرده و محتوای زیر را به آن اضافه کنید.
frontend kubernetes-frontend
bind 172.16.16.100:6443
mode tcp
option tcplog
default_backend kubernetes-backend
backend kubernetes-backend
mode tcp
option tcp-check
balance roundrobin
server kube-master1 192.168.90.120:6443
server kube-master2 192.168.90.121:6443
server kube-master3 192.168.90.122:6443
|
بعد از انجام تنظیمات فوق و ذخیره آن در فایل پیکربندی، یکبار سرویس haproxy را با دستور systemctl restart haproxy راه اندازی مجدد کنید.
- نصب داکر و کوبرنتیز روی همه نودها
در ادامه بایستی داکر و کوبرنتیز بر روی تمام نودهای کلاستر نصب شود. از این رو، اجرای دستورات ذیل بر روی همه نودها صورت می گیرد.
ابتدا فایروال لینوکس را خاموش کرده و swap را بصورت غیرفعال تنظیم کنید. برای انجام این موارد اجرای این دستورات الزامی هست.
ufw disable
swapoff -a; sed -i '/swap/d' /etc/fstab
سپس تنظیمات sysctl را برای فراخوانی و تنظیم ماژول شبکه کوبرنتیز با دستورات زیر بصورت صحیح اعمال کنید.
cat >>/etc/sysctl.d/kubernetes.conf<<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update && apt install -y docker-ce=5:19.03.10~3-0~ubuntu-focal containerd.io
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
در پایان و پس از اضافه کردن GPG-Key و به روزرسانی لیست ریپازیتوری ها، اقدام به نصب کامپوننت ها و فایلهای کوبرنتیز نمایید. برای اینکار نصب سه کامپوننت kubeadm, kubelet, kubectl برای مدیریت کلاستر الزامی هست.
apt update && apt install -y kubeadm=1.19.2-00 kubelet=1.19.2-00 kubectl=1.19.2-00
- ایجاد کلاستر کوبرنتیز
بعد از نصب کوبرنتیز بر روی نودها، بایستی اقدام به ایجاد کلاستر نمایید. برای تعریف و ایجاد کلاستر از دستور kubeadm init استفاده می شود ولی بایستی در نظر داشته باشید فقط یکبار این دستور بایستی بر روی یکی از نودهای مستر اجرا شود. بنابراین دستور زیر را بر روی اولین نود master1 اجرا می کنیم.
kubeadm init --control-plane-endpoint="Load_balancer_IP:6443" --upload-certs --apiserver-advertise-address=Master_node_1 --pod-network-cidr=192.168.0.0/16
با اجرای موفقیت آمیز دستور بالا مشاهده می کنید که کلاستر کوبرنتیز ایجاد گردید و در انتهای خروجی دو فرمان همراه با یک رشته توکن جهت متصل کردن سایر نودها به این کلاستر نمایش داده می شود.
نکته مهم: بسیار مهم هست که پارامتر –apiserver-advertise-address در هنگام join کردن نودها به کلاستر به انتهای دستور kubeadm join پاس داده شود. مقدار این پارامتر هم با آدرس آی پی همان سروری که قصد اتصال به کلاستر را دارد تعیین می گردد.
یادآوری: بعد از اجرای موفقیت آمیز دستور kubeadm init، بایستی سه دستور انتهایی که در خروجی ترمینال نمایش داده شده است را جهت ایجاد و تنظیم فایل پیکربندی کلاستر kubeconfig اجرا کنید. این دستورات عبارتند از :
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- اضافه کردن سایر نودها به کلاستر
همانطور که در مرحله قبل توضیح داده شد، با استفاده از خروجی نمایش داده شده بایستی اقدام به join کردن سایر نودها به کلاستر نمایید. در صورتیکه قصد دارید دیگر نودهای مستر را به کلاستر اضافه کنید از دستور بالاتر استفاده شود و در صورتیکه قصد دارید نودهای ورکر را به عضویت کلاستر درآورید از دستور دیگری که در قسمت پایین تر خروجی وجود دارد استفاده نمایید.
این دستورات به صورت زیر در خروجی ترمینال kubeadm init روی اولین نودمستر قابل مشاهده بودند که بایستی در جایی کپی و نگهداری شود.
نکته (ایجاد مجدد توکن): چنانچه به هر دلیلی فراموش کردید عبارت و توکن تولید شده در خروجی دستور init را یادداشت کنید، می توانید مجددا رشته و توکن مخصوص برای join کردن نودها را ایجاد کنید اما ایجاد مجدد آن نیازمند کمی دقت بوده که بصورت زیر قابل اجرا می باشد!
برای اینکار بایستی به اولین نود مستر متصل شوید. می توانید در ابتدا لیست توکن ها و رشته هشینگ ایجاد شده قبلی در مستر نود را با دستور kubeadm token list مشاهده کنید. حال فرض کنید قصد دارید یک توکن جدید ایجاد کنید. کافیست دستور زیر را اجرا کنید.
kubeadm init phase upload-certs --upload-certs
بعد از اجرای دستور، یک رشته در خروجی تولید و نمایش داده می شود. حال بایستی این رشته را برداشته و با دستور زیر اقدام به ایجاد و تولید توکن جدید برای اتصال نودها کنید.
kubeadm token create --certificate-key <string_code> --print-join-command
با اجرای موفقیت آمیز دستور بالا می توانید رشته کامل همراه با توکن، هشینگ گواهینامه و کلید مربوطه را در قالب یک دستور kubeadm join مشاهده کنید. از همین رشته کامل (دستور) می توانید برای متصل کردن و join کردن سایر مسترنودها به کلاسترتان استفاده کنید.
- توسعه پلاگین شبکه در سطح کلاستر
تا این مرحله موفق شده اید یک کلاستر کوبرنتیز را ایجاد کنید و تعدادی نود (مستر + ورکر) به آن اضافه کنید. در ادامه ضروری هست از یک پلاگین شبکه جهت ایجاد و توسعه زیرساخت شبکه کلاسترتان استفاده کنید. با توجه به بررسی ها و نیازمندی های پروژه تان می توانید یکی از CNI های رایج مانند calico، flannel یا weave و … را نصب و مورد استفاده قرار دهید. در این سناریو، ما از شبکه Calico استفاده کرده و با دستور زیر آنرا در سطح کلاستر ایجاد و توسعه می دهیم.
رفع خطا: یکی از خطاهای محتمل در فاز نصب پلاگین شبکه مربوط به عدم دانلود صحیح ایمیج های تعیین شده در فایل yaml می باشد. برای رفع این مشکل ابتدا بایستی مطمئن شوید که با حساب کاربری مناسبی به داکر رجیستری لاگین کرده اید در غیراینصورت با دستور docker login اقدام به ورود به رجیستری داکر کنید.
سپس جهت رفع خطای ImagePullBackOff، پیشنهاد میکنم دانلود ایمیج ها را بصورت دستی انجام دهید. بنابراین، ابتدا نام دقیق ایمیج ها را از فایل calico.yaml بدست بیاورید. برای اینکار دستور cat calico.yaml | grep -i image باعث نمایش تمام ایمیج های موردنیاز پلاگین کالیکو می شود.
پس از شناسایی ایمیج ها، کافیست با دستور docker pull Image_name تک تک ایمیج ها را بصورت دستی دانلود و روی نودها بارگذاری نمایید و سپس اقدام به اجرای دستور زیر نمایید.
kubectl --kubeconfig=/etc/kubernetes/admin.conf create -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
- اضافه کردن ورکر نودها به کلاستر
بعد از ایجاد شبکه کوبرنتیز، حال زمان آن است که نودهای ورکر را به کلاستر خود اضافه کنید. اینکار به سادگی با اجرای دستور kubeadm join انجام می شود. فقط در نظر داشته باشید از دستور و عبارت صحیح که حاوی پارامترهای صحیح می باشد برای اتصال ورکرنودها استفاده کنید که با فرمان join کردن مسترنودها کمی متفاوت هست!
- بررسی کلاستر
اگر تا اینجا بدون مشکل پیش آمده اید، بایستی به شما تبریک بگوییم. شما یک کلاستر پایدار ایجاد کرده اید و در این مرحله می توانید صحت عملکرد کلاستر را مورد بررسی قرار دهید.
پیشنهاد می کنم برای تست پایداری کلاستر، یکی از نودهای master را بصورت ناگهانی خاموش کرده و از پایداری و عملکرد صحیح کامپوننت های ETCD, Scheduler, Apiserver و … و همچنین sync بودن آنها با یکدیگر اطمینان کامل حاصل نمایید.