بازگشت به بلاگ
کوبرنتیز: راهنمای مبتدی
۶ بهمن ۱۴۰۳
۲۵ دقیقه مطالعه
محمد مهدی افشار

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

راهنمای کامل نصب کوبرنتیز روی VM شما. یاد بگیرید که چگونه یک کلاستر کامل کوبرنتیز را از صفر راه‌اندازی کنید.

کوبرنتیزداکرکلودDevOpsزیرساخت

راهنمای نصب کوبرنتیز برای مبتدی‌ها

این راهنما برای مبتدی‌هاست. مثل من.

این ساده‌ترین روش نصب کوبرنتیز روی VM شماست که من از آن برای نصب کلاستر خودم استفاده کردم. ۸ ساعت وقت صرف تحقیق و نصب آن کردم.

پیش‌نیازها

  • یک VM تازه با اوبونتو نصب شده
  • یک دامنه (اجباری نیست ولی پیشنهاد می‌شود)

ایجاد یک ماشین آماده برای کلاستر

قدم ۱: مطمئن شوید که VM تازه‌ای دارید

اگر ندارید، ممکن است با خطاهایی مواجه شوید. من این مشکلات را داشتم و تصمیم گرفتم روی VM تازه‌ای انجام دهم.

قدم ۲: مخازن و بسته‌ها را به‌روزرسانی کنید

example.sh
sudo apt update && sudo apt upgrade -y

قدم ۳: swap را غیرفعال کرده و پیکربندی‌های kernel لازم را فعال کنید

example.sh
sudo swapoff -a

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

این پیکربندی‌های kernel برای کارکرد صحیح کوبرنتیز ضروری هستند.

example.sh
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.ipv4.ip_unprivileged_port_start=0
EOF

sudo sysctl --system

net.ipv4.ip_unprivileged_port_start=0 برای استفاده از traefik مهم به نظر می‌رسد. در غیر این صورت خطای bind to:80/443 دریافت خواهید کرد.

وقتی داشتم کلاستر خودم را پیکربندی می‌کردم، با این مشکل مواجه شدم. traefik نمی‌توانست به پورت‌های ۸۰/۴۴۳ متصل شود.

مجبور شدم net.ipv4.ip_unprivileged_port_start=0 را تنظیم کنم و سپس همه چیز درست کار کرد.

قدم ۴: مخازن مورد نیاز را اضافه کنید

همیشه مخازن خود را به‌روزرسانی کرده و بسته‌های مورد نیاز را نصب کنید.

example.sh
sudo apt update -y

سپس curl، software-properties-common، apt-transport-https و ca-certificates را نصب کنید.

example.sh
sudo apt install -y curl software-properties-common apt-transport-https ca-certificates

حالا مخازن kubernetes، docker و containerd را اضافه کنید.

example.sh
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

مخازن را به‌روزرسانی کنید.

example.sh
sudo apt update -y

قدم ۵: containerd را نصب و پیکربندی کنید

ابتدا آن را نصب کنید

example.sh
sudo apt install -y containerd.io

سپس پیکربندی را در /etc/containerd/config.toml بنویسید و SystemdCgroup = true را تنظیم کنید

example.sh
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

containerd را فعال کنید

example.sh
sudo systemctl restart containerd
sudo systemctl enable containerd

قدم ۶: بسته‌های kubernetes را نصب کنید

example.sh
sudo apt install -y kubelet kubeadm kubectl

از apt-mark استفاده کنید تا از به‌روزرسانی، حذف یا تغییر آن‌ها جلوگیری کنید.

example.sh
sudo apt-mark hold kubelet kubeadm kubectl

ماشین را ریبوت کنید.

example.sh
sudo reboot

ایجاد کلاستر

قدم ۱: گره را مقداردهی اولیه کنید

ابتدا آدرس IP ماشین را دریافت کنید.

example.sh
export MACHINE_IP=$(hostname -I | awk '{print $1}')

سپس گره را مقداردهی اولیه کنید. (می‌توانید فقط با sudo kubeadm init مقداردهی اولیه کنید اما من چند flag اضافه کردم تا عیب‌یابی آسان‌تر باشد)

example.sh
sudo kubeadm init --pod-network-cidr=10.96.0.0/12 --control-plane-endpoint=${MACHINE_IP} --v=5

نگران join token نباشید، می‌توانیم بعداً دوباره آن را ایجاد کنیم :)

example.sh
sudo kubeadm token create --print-join-command

قدم ۲: فایل kubeconfig را ایجاد کنید

example.sh
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

قدم ۳: پیکربندی شبکه را اعمال کنید

من ترجیح می‌دهم از calico برای پیکربندی شبکه استفاده کنم. می‌توانید از هر پلاگین شبکه دیگری که می‌خواهید استفاده کنید. مثل flannel، cilium و غیره.

example.sh
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

قدم ۴: منتظر آماده شدن گره‌ها باشید (باید منتظر آماده شدن podهای شبکه باشید)

example.sh
watch kubectl get nodes -A

تبریک! شما اولین کلاستر کوبرنتیز خود را ایجاد کردید.

اگر می‌خواهید گره‌های بیشتری اضافه کنید (همیشه باید تعداد فرد باشد)، باید فرآیند مقداردهی اولیه را روی گره جدید تکرار کنید. سپس از دستور join که قبلاً ایجاد کردیم استفاده کنید تا گره جدید را به کلاستر اضافه کنید.

نصب helm، ingress و ابزارهای دیگر

قدم ۱: helm را نصب کنید

من ترجیح می‌دهم helm را با apt نصب کنم. هر طور که می‌خواهید می‌توانید انجام دهید.

example.sh
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

سپس package manager را به‌روزرسانی کنید

example.sh
sudo apt update

سپس helm را نصب کنید

example.sh
sudo apt install helm

قدم ۲: ingress را نصب کنید

من ترجیح می‌دهم از traefik برای ingress استفاده کنم. می‌توانید از هر ingress controller دیگری که می‌خواهید استفاده کنید. مثل nginx و غیره.

example.sh
helm install traefik traefik/traefik --namespace traefik --create-namespace -f traefik-values.yaml

من ترجیح می‌دهم از فایل values خودم برای traefik استفاده کنم. می‌توانید از فایل values پیش‌فرض استفاده کنید.

example.yml
ports:
  web:
    port: 80
  websecure:
    port: 443
service:
  type: LoadBalancer

additionalArguments:
  - "--api.dashboard=true"

قدم ۳: longhorn را برای مدیریت ذخیره‌سازی نصب کنید

example.sh
helm install longhorn longhorn-system/longhorn-manager --namespace longhorn-system --create-namespace

قدم ۴: Rancher را نصب کنید

می‌توانید از rancher هر طور که می‌خواهید استفاده کنید. اما این روشی است که من استفاده می‌کنم:

ابتدا مخزن rancher را اضافه کنید

example.sh
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

سپس یک namespace ایجاد کنید

example.sh
kubectl create namespace cattle-system

سپس ممکن است به cert-manager نیاز داشته باشیم اگر از قبل نداریم، می‌توانیم دستور زیر را برای نصب آن اعمال کنیم

example.sh
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.3/cert-manager.yaml

مخزن آن را اضافه کنید

example.sh
helm repo add jetstack https://charts.jetstack.io

سپس آن را نصب کنید

example.sh
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace

سپس chart rancher را نصب کنید

example.sh
helm install rancher rancher-stable/rancher \
--namespace cattle-system --create-namespace \
--set hostname=${RANCHER_DOMAIN} \
--set ingress.tls.source=secret \
--set ingress.tls.secretName=rancher-cert-tls \
--set bootstrapPassword=admin

${RANCHER_DOMAIN} را با نام دامنه خود جایگزین کنید.

و سپس یک گواهی‌نامه اعمال کنید

example.sh
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
 name: rancher-cert
 namespace: cattle-system
spec:
 secretName: rancher-cert-tls
 issuerRef:
   name: letsencrypt-prod
   kind: ClusterIssuer
 dnsNames:
 - ${RANCHER_DOMAIN}
EOF

منتظر آماده شدن rancher باشید، سپس به https://${RANCHER_DOMAIN}/dashboard?setup=admin بروید و با admin و admin وارد شوید.

سپس صفحه‌ای خواهید دید که می‌گوید You have access to the dashboard.

روی آن کلیک کنید و صفحه‌ای خواهید دید که می‌گوید You have access to the dashboard.

اگر از کلاستر تک‌گره استفاده می‌کنید، گره خود را UnTaint کنید

گره را untainted تنظیم کنید

example.sh
export NODE_NAME=$(hostname)
example.sh
kubectl taint nodes ${NODE_NAME} node-role.kubernetes.io/control-plane-

اگر بخواهید دوباره گره را taint کنید، می‌توانید از دستور زیر استفاده کنید:

example.sh
kubectl taint nodes ${NODE_NAME} node-role.kubernetes.io/control-plane:NoSchedule

آیا واقعاً باید از کوبرنتیز استفاده کنید؟

خب، نه.

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

اگر VMهای متعددی دارید و نیاز به مدیریت آن‌ها و سرویس‌های زیادی دارید، آنگاه بله، باید از کوبرنتیز استفاده کنید.

اما اگر یک VM دارید و نیاز به مدیریت چند سرویس دارید، آنگاه نیازی به استفاده از کوبرنتیز ندارید.

و یادتان باشد، همیشه آسان‌تر است که یک مهندس DevOps برای راه‌اندازی کلاستر خود بگیرید. سپس تنها کاری که باید انجام دهید مدیریت آن است :)

علاقه‌مند به همکاری هستید؟

سوالی درباره این موضوعات دارید یا می‌خواهید درباره پروژه‌ای صحبت کنید؟ بیایید ارتباط برقرار کنیم!

تماس بگیرید