مجازی سازی و Cloud

راه اندازی کلاستر مالتی مستر در کوبرنتیز

در این مقاله به نحوه ایجاد کلاستر 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 بودن آنها با یکدیگر اطمینان کامل حاصل نمایید.

 

منبع ۱ و ۲

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.