در این قسمت ابتدا کوبرنتیز را روی یک ماشین با سیستم عامل ubuntu 20.04 نصب میکنیم سپس یک ایمیج فرانتاند را توسط کوبرنتیز اجرا میکنیم. به دلیل تحریم ما قادر نیستیم که خود کوبرنتیز را دانلود کنیم به همین علت از یک نمونه مشابه آن به نام k3s استفاده میکنیم که یک توزیع از کوبرنتیز اما سبکتر از آن و پیچیدگی های نصب کامپوننتهای مختلف کوبرنتیز در این توزیع وجود ندارد و ما میتوانیم توجه خود را معطوف استفاده از این برنامه کنیم لینک سایت و گیتهاب این پروژه. نکته جالب درباره اسم این پروژه این است که خود کوبرنتیز با علامت اختصاری k8s شناخته میشود که ۸ مخفف ۸ حرف وسط آن است و از آنجایی که این توزیع نصف کوبرنتیز حجم دارد از k3s استفاده کرده است. در ادامه به پیاده سازی یک سرویس k3s شامل یک node کارگر و یک master میپردازیم.
ما در این قسمت سعی داریم معماری بالا را پیاده سازی کنیم. همانطور که در تصویر بالا قابل مشاهده است این معماری شامل یک Master Node و تعداد Worker Node است که در قسمت قبل درباره آن صحبت کردهایم. ما در پیاده سازی قسمت بعد تنها از یک Worker Node استفاده میکنیم. قسمت load balancer را نیز پیاده سازی نمیکنیم زیرا تنها یک نود داریم و خارج از حوصله این نوشته است.
پیش از شروع نصب k3s ما باید دو ماشین داشته باشیم تا بتوانیم در یکی از آنها Master Node و در دیگری Worker Node را پیادهسازی کنیم. برای اینکار من از VirtualBox استفاده کردهام در پایین آموزش مختصر آن را
را میآوردم.
پس از نصب دانلود این برنامه با استفاده از این لینک میتوانید یک ماشین مجازی ایجاد کنید. همانطور که در قسمت قبل توضیح داده شد ما به دو ماشین مجازی نیاز داریم. سیستم عامل هر یک از این ماشین ها در این مثال ubuntu live server 20.04 LTS است که اگر با ترمینال آشنایی ندارید یا کار با آن برای شما سخت است میتوانید ابونتوی عادی را نیز نصب کنید.
پس از نصب و راهاندازی سرور ها برای اینکه بتوانید از ماشین خود به آنها دسترسی ssh داشته باشید در setting و در قسمت Network نتورک را از حالت Nat به حالت bridge در آورید سپس میتوانید از سیستم عامل خود به این ماشین ها ssh بزنید.
ابتدا برای نصب آن دستور زیر را میزنیم:
curl -sfL https://get.k3s.io | sh -s - --no-deploy traefik --write-kubeconfig-mode 644 --node-name master
متغییر اول این باعث میشود load balancer غیر فعال شود و متغیر دوم تغییرات متغیرها را انجام میدهد و متغیر سوم نام نود است. پس از زدن دستور بالا این دستور میتواند چندین دقیقه طول بکشد و زمانی که تمام شد برای اطمینان از درستی آن دستور زیر را بزنید :
kubectl get nodes
باید نتیجهای مانند زیر را دریافت کنید:
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 10m v1.22.5+k3s1
این موضوع نشان دهنده آن است که نود مستر به درستی در حال اجرا شدن است و کار ما در این قسمت تمام است.
در این قسمت باید مطمئن شویم که دو ماشین مجازی به یکدیگر ping دارند زیر در نصب worker باید مشخص کنیم که این نود مختص کدام نود Master است. برای این کار باندا در ماشین Master باید یک توکن را کپی کنیم تا در نود Worker آن را وارد کنیم. برای این کار دستور زیر را بزنید و خروجی حاصل را کپی کنید.
sudo cat /var/lib/rancher/k3s/server/node-token
K10c0170e30504120ffe8cb696d6391c6623b6667954e3ad51be09f540e1bfadf9d::server:aa33e4e0133f721bd1f812528dd4af5b
حال به ماشین Worker بروید و دستور زیر را اجرا کنید. و به جای IP باید IP نود مستر را قرار دهید و به جای TOKEN نیز توکن قسمت قبل را کپی کنید.
curl -sfL https://get.k3s.io | K3S_NODE_NAME=k3s-worker-01 K3S_URL=https://<IP>:6443 K3S_TOKEN=<TOKEN> sh -
برای مثال آدرس IP ماشین مستر من 192.168.4.7 بود و دستور برای من به شکل زیر شد:
url -sfL https://get.k3s.io | K3S_NODE_NAME=worker K3S_URL=https://192.168.4.7:6443 K3S_TOKEN=K10c0170e30504120ffe8cb696d6391c6623b6667954e3ad51be09f540e1bfadf9d::server:aa33e4e0133f721bd1f812528dd4af5b sh -
پس از راه اندازی این قسمت که باز ممکن است چندین دقیقه به طول بیانجامد درستی آن را چک میکنیم برای این کار باید به ماشین Master برویم و دستور زیر را که در قسمت قبل زده بودیم دوباره تکرار کنیم:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 31m v1.22.5+k3s1
worker Ready <none> 78s v1.22.5+k3s1
همانطور که مشاهده میشود به لیست ما در ماشین Master نود Worker اضافه شده است. حال ما یک k3s با یک نود Master و یک نود Worker پیاده سازی کرده ایم و تنها یک Ingress برای دیدن برنامه از بیرون و یک image برای اجرا شدن روی این نود ها نیاز داریم.
پس از مراحل بالا ما حال به یک فایل yaml نیاز داریم که به نود مستر اطلاعات مورد نیاز برای دیپلوی کردن image داده شده را بدهد برای اینکار یک فایل با محتویات زیر نیازمندیم.
apiVersion: apps/v1
kind: Deployment
metadata:
name: sharif-web-course
spec:
replicas: 4
selector:
matchLabels:
app: sharif-web-course
template:
metadata:
labels:
app: sharif-web-course
spec:
containers:
- image: frontend
imagePullPolicy: "Always"
name: sharif-web-course
ports:
- containerPort: 8080
-------------------------------------
apiVersion: v1
kind: Service
metadata:
labels:
app: sharif-web-course
name: sharif-web-course
spec:
ports:
- name: http
port: 80
targetPort: 8080
selector:
app: sharif-web-course
---------------------------------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sharif-web-course
spec:
rules:
- http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: sharif-web-course
port:
number: 80
که دو قسمتی که با خط تیره جدا شده اند نقش Ingress را بازی میکنند و در اینجاا از ingress-nginx استفاده شده است. این دیپلوی منت از این جا برداشته شده است و متانسب با image ما تغییر یافته است ضمنا قسمت آخر این مانیفست حذف شده است زیرا کاربرد DNS را دارد که برای ما مورد نیاز نیست.
در جلوی تگ image به جای front باید آدرس ایمیج از یک رجیستری داده شود. اما این قسمت را به دلیل فیلتر بودن از سمت داکر رجیستری نتوانستیم راه حلی برای آن پیاده سازی کنیم.
امیدوارم لذت برده باشید.