توی این قسمت میریم به سراغ اینکه بررسی کنیم چطوری میتونیم یه کلاستر کوبرنتیز رو با استفاده از kubeadm ستاپ کنیم و بیاریم بالا.
در این بلاگ پست، راهنمای گامبهگام راهاندازی یک کلاستر Kubernetes با استفاده از Kubeadm را ارائه دادهام.
ابزار Kubeadm ابزاری فوقالعاده برای راهاندازی سریع یک کلاستر Kubernetes است. این ابزار، تمام کارهای سنگین مربوط به تنظیم مؤلفههای کلاستر Kubernetes را انجام میدهد و همچنین از بهترین شیوههای پیکربندی کلاستر پیروی میکند. به صورت اختصار kubernetes admin هست که کمک میکنه تا به راحتی کلاستر ستاپ کنیم. فقط تو ستاپ کمک نمیکنه بلکه در ادامهی نگهداری کلاستر هم بهمون کمک میکنه. مثلا اگر بخواهیم نود اضافه کنیم یا به روز رسانی انجام بدیم کنار دستمون هست تا بتونیم به راحتی هر کاری که لازم است رو باهاش انجام بدیم.
ابزار Kubeadm چیست؟
خب Kubeadm ابزاری برای راهاندازی یک کلاستر Kubernetes حداقلی (minimum viable) بدون پیچیدگی فراوان است. همچنین Kubeadm با اجرای مجموعهای از پیشنیازها و بررسیها، اطمینان حاصل میکند که سرور، پیشنیازها و پیکربندیهای لازم برای اجرای Kubernetes را دارد.
این ابزار توسط کامیونیتی رسمی Kubernetes توسعه و نگهداری میشود. ابزارهای دیگری مانند Minikube و Kind نیز هستند که بهصورت سادهتر و با نیازمندی سختافزاری کمتر، کلاستر Kubernetes راهاندازی میکنند که توی این بلاگ پست در موردشون توضیح دادیم و اینجا هم میتونید بیشتر در موردشون بخونید ولی این ابزارها بیشتر برای تست اپلیکیشنها روی Kubernetes مفید هستند و همواره تو استیج و آرمایشگاهها از آنها استفاده میشود. اما kubeadm به ما این امکان رو میدهد که کلاستر در سطح پروداکشن ستاپ و نگهداری کنیم.
اما اگر قصد دارید با مؤلفههای کلاستر عمیقتر آشنا شوید یا ابزارهایی که مرتبط با مدیریت کلاستر هستند را آزمایش کنید، Kubeadm بهترین انتخاب خواهد بود و میتونید برای ستاپ کردن یه کلاستر production ready ازش استفاده کنید.
بررسی پیشنیازهای راهاندازی
۱. سه تا نود دبیان برای مسترهای کلاستر و سه تا نود دیگه هم برای ورکر نودها، همچنین میتوانید بسته به نیازتان نودهای ورکر بیشتری داشته باشید. این مستند بر اساس سیستمعامل Debian آماده شده است. اما برای نصب و کار با کوبرنتیز شما محدودیتی روی دیسترو ندارید و فقط لینوکس باشه کافیه. البته که روی ویندوز هم میشه ولی خوب من لینوکس بلدم و اونجا آموزش میدم.
۲. نود مستر باید حداقل ۲ vCPU و ۲ گیگابایت رم داشته باشد. نود ورکر میتونه کمتر از این هم داشته باشه ولی بهتره که همین مقدار باشه.
۳. فرقی نمیکنه که ماشینها توی شبکه داخلی باشند یا پابلیک، در هر صورت از اتصال نتورکی اونها به هم مطمئن شید. نودهای مستر و ورکر روی یه سری پورت مشخص با همدیگه صحبت میکنند. باید دستری به این پورتها رو برای هم باز کنید.
نصب یه سری tools اولیه روی نودها
خوبه که قبل از هر هرکاری سرورهامون رو آپدیت کنیم و hardening (مجموعه کارهایی که امنیت سرور رو افزایش میدهد) و tuning (مجموعه کارهایی که کارایی سرور را افزایش میدهد) اونها رو انجام بدیم، که معمولا این کار رو با انسیبل انجام میدن. بعدش یه سری ابزار اولیه رو به شکل زیر نصب میکنیم:
				
					apt install -y wget git vim bash-completion curl htop net-tools dnsutils \
                     atop sudo software-properties-common telnet axel jq iotop \
                     ca-certificates curl gnupg lsb-release apt-transport-https gpg 
				
			
		توی مرحله بعدی باید کانتینر رانتایم موردنظرمون رو نصب کنیم. لازمه که اینجا یادآوری کنم داکر کانتینر رانتایم نیست و خود داکر از کانتینردی برای کانتینر رانتایم داره استفاده میکنه. در ادامه دستورات مربوط به نصب و کانفیگ Containerd رو براتون میذارم:
ابتدا GPG key رسمی داکر را به شکل زیر به کلیدهای apt اضافه میکنیم.
				
					sudo mkdir -p /etc/apt/keyrings && sudo chmod -R 0755 /etc/apt/keyrings 
				
			
		
				
					curl -fsSL "https://download.docker.com/linux/debian/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg 
				
			
		اگه توی ایران هستید و این دستور کرل اذیت میکنه باید از یه طریق مطمئن اون کلید رو با روشهایی که هر ایرانی بلده، بردارید و توی اون مسیر قرار بدید یا یه جایی که بشه ازش گرفت برای خودتون بذارید صرفا برای مثال به این شکل میشه فرآیند بعدش:
				
					curl -fsSL "https://store.dockerme.ir/Software/docker.gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg 
				
			
		بعدشم مخزن داکر رو به لیست مخزنهای apt اضافه کنید.
				
					chmod a+r /etc/apt/keyrings/docker.gpg 
				
			
		
				
					echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable" > /etc/apt/sources.list.d/docker.list
# Check docker repository
cat /etc/apt/sources.list.d/docker.list 
				
			
		اگه ایرانی هستی و میخوای از ریپوزیتوریهایی استفاده کنی که تحریم نباشه این مدلی میزنی برای مثال کامند این قسمت رو به جای روش بالا:
				
					echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://repo.mecan.ir/repository/debian-docker bookworm stable" > /etc/apt/sources.list.d/docker.list 
				
			
		
				
					# Check docker repository
cat /etc/apt/sources.list.d/docker.list 
				
			
		نهایتا containrerd رو نصب میکنیم و سرویسش رو استارت میکنیم.
				
					sudo apt update
# Install containerd service
sudo apt install containerd.io
# Start and enable Containerd service
sudo systemctl enable containerd
sudo systemctl restart containerd
sudo systemctl status containerd 
				
			
		بعدش کانفیگش رو انجام میدیم و درایور Cgroup رو عوض میکنیم.
				
					sudo mkdir -p /etc/containerd 
				
			
		
				
					sudo containerd config default | sudo tee /etc/containerd/config.toml 
				
			
		
				
					# Change Cgroup driver
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml 
				
			
		
				
					# Check Cgroup driver
sudo cat /etc/containerd/config.toml | grep SystemdCgroupsudo apt-get update 
				
			
		
				
					# Restart  Containerd service
sudo systemctl restart containerd
sudo systemctl status containerd 
				
			
		مجدد اگه ایرانی هستی و نیاز داری برای containerd رجیستری میرور ست کنی اینجوریه👇🏼
توی همون فایل config.toml که داره بعد از اینکه پترن پلاگین هارو دیدی مثل این:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]زیرش موارد زیر رو اضافه میکنید برای مخزن های مختلف:
				
					        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://hub.mecan.ir"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
          endpoint = ["https://k8s.mecan.ir"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
          endpoint = ["https://quay.mecan.ir"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."mirror.gcr.io"]
          endpoint = ["https://gcr.mecan.ir"] 
				
			
		اگر هم نیاز دارید که http proxy ست کنید براش میتونید اینجوری انجامش بدید:
				
					# Check and create directory path
DIR_PATH=/etc/systemd/system/containerd.service.d
[ -d "${DIR_PATH}" ] || sudo mkdir "${DIR_PATH}" 
				
			
		
				
					# Create config file
cat <${DIR_PATH}/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://HTTP_PROSY_DOMAIN:PORT"
Environment="HTTPS_PROXY=http://HTTP_PROSY_DOMAIN:PORT"
Environment="NO_PROXY=localhost,127.0.0.1,10.233.0.0/18,10.233.64.0/18,.mecan.ir"
EOF  
				
			
		
				
					# Check config file
cat ${DIR_PATH}/http-proxy.conf 
				
			
		بعد از همه اینها هم یه ریلود و یه ری استارت لازمه تا چنج کانفیگهاتون اعمال شه و بریم مرحله بعدی:
				
					sudo systemctl daemon-reload
sudo systemctl restart containerd
sudo systemctl status containerd 
				
			
		نصب و کانفیگ ابزارهای کوبرنتیز و پیشنیازهاشون روی تمام سرورها
ازونجایی که kube-proxy برای کار کردن به پکت فیلترینگ نیاز داره و تو این مستند ما مودش رو iptables قرار میدیم، این متغیرهای کرنلی زیر رو هم بایستی ست کنید:
				
					cat >>/etc/sysctl.d/kubernetes.conf<
				  
			
		
				
					# apply new sysctl config
sysctl --system >/dev/null 2>&۱ 
				
			
		بعدش برای فعال کردن این فیچرهای ترافیک bridge ماژول br-netfilter رو لود میکنیم:
				
					modprobe br_netfilter 
				
			
		برای اینکه کوبرنتیز بتونه بهتر فیچرهای memory management که داره رو اجرایی کنه swap رو برمیداریم:
				
					# Disable swap in fstab file
sed -i '/swap/d' /etc/fstab 
				
			
		
				
					# off swap
swapoff -a 
				
			
		در قدم بعدی میریم سراغ اضافه کردن مخزنها و نهایتا نصب ابزارهای کوبرنتیز:
ابتدا نصب چنتا ابزار لینوکسی که نیازمون میشه:
				
					sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg 
				
			
		اضافه کردن کلید مخزنها به apt:
				
					# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings 
				
			
		
				
					curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg 
				
			
		
				
					# OR Download from Store.DockerMe.ir
curl -fsSL https://repo.mecan.ir/repository/apt-kube/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg 
				
			
		
				
					# Check gpg key
sudo ls -alh /etc/apt/keyrings/kubernetes-apt-keyring.gpg 
				
			
		اضافه کردن مخزن کوبرنتیز به لیست مخازن apt:
				
					# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list 
				
			
		
				
					# Check kubernetes repo
cat /etc/apt/sources.list.d/kubernetes.list 
				
			
		
				
					# Update your repository
apt-get update -y 
				
			
		مجدد اگه ایرانی هستی و نیاز داری که مخزن میرور ست کنی میشه یه چیزی شبیه این:
				
					# for kubernetes 1.30
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://repo.mecan.ir/repository/apt-kube/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list 
				
			
		
				
					# Update your repository
cat /etc/apt/sources.list.d/kubernetes.list 
				
			
		
				
					# Update your repository
apt-get update 
				
			
		چک نهایی و نصب kubelet و kubectl و kubeadm :
				
					# check package version:
apt-cache policy kubelet kubectl kubeadm 
				
			
		
				
					# install kubernetes tools:
sudo apt-get install -y kubelet kubeadm kubectl 
				
			
		
				
					# check install versions:
kubelet --version
kubeadm version
kubectl version 
				
			
		نکته مهم اینجا این هست که پکیجهایی که نصب میکنید رو hold کنید تا بعدا ناخواسته ورژن اونها رو عوض نکنید، مگر اینکه در حال آپدیت نود باشید و خودتون بدونید که دارید چیکار میکنید. اگر اونها رو hold نکنید و ریپوی جدید کوبرنتیز رو داشته باشید با هر آپدیت سیستمعامل نسخهی جدیدترش نصب میشه که اگر حواستون نباشه اذیتتون میکنه.
				
					sudo apt-mark hold kubelet kubeadm kubectl 
				
			
		سرویس kubelet رو enable و استارت میکنیم:
				
					systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet 
				
			
		کانفیگ crictl رو هم انجام میدیم که بتونیم در صورت نیاز از کامندش استفاده کنیم:
				
					cat << EOF > /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 0
debug: false
EOF 
				
			
		
				
					# Check config file
cat /etc/crictl.yaml 
				
			
		
				
					# check crictl command and mirror containerd registry
crictl info 
				
			
		باید تو این قسمت میرورها و کانفیگهایی که قبلا برای کانتینردی انجام دادیم رو بتونیم ببینیم.
نیازمندیهای پورت در Kubeadm
لطفاً به تصویر زیر مراجعه کنید و اطمینان حاصل کنید که همه این پورتها برای کنترلپلین (مستر) و ورکرها باز هستند و اونها رو در فایروال باز کنید. باید سرورهای شما دسترسی به این پورتها روی همدیگه داشته باشند.
											یه کاری که میتونید بکنید این هست که نودهای کلاستر رو توی هم باز کنید! یعنی بر اساس ip توی فایروال دسترسی نودهای خود کلاستر رو به همدیگه اکسپت کنید به شکل زیر مثلا یه سری rule رو توی etc/iptables/rules.v4/ به صورت persist اضافه میکنیم. البته که با توجه به نکات امنیتی که رعایت میکنید ممکنه این کار برای شما مناسب نباشه. از این رو اگر فقط پورتها رو هم باز کنید کافی هست. نکتهی دیگه این که این دسترسیها رو تو تمام نودها باید ایجاد کنید.
				
					iptables -A INPUT -s ${master1_ip} -j ACCEPT -m comment --comment "The Trusted ${master1_name}"
iptables -A INPUT -s ${master2_ip} -j ACCEPT -m comment --comment "The Trusted ${master2_name}"
iptables -A INPUT -s ${master3_ip} -j ACCEPT -m comment --comment "The Trusted ${master3_name}"
iptables -A INPUT -s ${worker1_ip} -j ACCEPT -m comment --comment "The Trusted ${worker1_name}"
iptables -A INPUT -s ${worker2_ip} -j ACCEPT -m comment --comment "The Trusted ${worker2_name}" 
				
			
		بالای سر api-server ها باید یه لودبالانسر بذاریم که تا زمان استفاده از کلاستر HA داشته باشیم، اینجا یه داکیومنت گذاشتم که میتونید با استفاده ازش این کار رو انجام بدید. چون میخواهیم کلاستر HA داشته باشیم و ۳ تا مستر داریم لازم داریم با استفاده از لودبالانسر همواره به مستر درست برسیم.
خب حالا دیگه آماده شدیم تا کانفیگ kubeadm رو انجام بدیم و کلاستر رو ایجاد کنیم، ابتدا وریبل های زیر رو طبق کلاستر خودتون اضافه کنید:
اول یه سری وریبل ست میکنیم که وقتی کانفیگ رو میسازیم همه چیز درست باشه. لازمه که مقادیر اینها رو با مقادیری که خودتون دارید عوض کنید.
				
					# set specific variables content
vip_ip=192.168.200.10
master1_ip=192.168.200.11
master2_ip=192.168.200.12
master3_ip=192.168.200.13
domain_name=mecan.ir
master1_name=master1
master2_name=master2
master3_name=master3
vip_api_name=vip.kubeadm 
				
			
		و در مرحله بعدی دستورات زیر رو بزنید تا فایل کانفیگ kubeadm ایجاد شود:
				
					cat </opt/kubeadm_config.yml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: ${master1_ip}
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: ${master1_name}
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
  extraArgs:
    authorization-mode: "Node,RBAC"
  certSANs:
    - "${vip_ip}"
    - "${master1_ip}"
    - "${master2_ip}"
    - "${master3_ip}"
    - "${master1_name}"
    - "${master2_name}"
    - "${master3_name}"
    - "${vip_api_name}"
    - "${vip_api_name}.${domain_name}"
    - "${master1_name}.${domain_name}"
    - "${master2_name}.${domain_name}"
    - "${master3_name}.${domain_name}"
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
etcd:
  local:
    imageRepository: "quay.io/coreos"
    imageTag: "v3.5.9"
    dataDir: "/var/lib/etcd"
    serverCertSANs:
      - "${master1_ip}"
      - "${master2_ip}"
      - "${master3_ip}"
      - "${vip_ip}"
      - "${master1_name}"
      - "${master2_name}"
      - "${master3_name}"
      - "${vip_api_name}"
      - "${vip_api_name}.${domain_name}"
      - "${master1_name}.${domain_name}"
      - "${master2_name}.${domain_name}"
      - "${master3_name}.${domain_name}"
    peerCertSANs:
      - "${master1_ip}"
      - "${master2_ip}"
      - "${master3_ip}"
      - "${vip_ip}"
      - "${master1_name}"
      - "${master2_name}"
      - "${master3_name}"
      - "${vip_api_name}"
      - "${vip_api_name}.${domain_name}"
      - "${master1_name}.${domain_name}"
      - "${master2_name}.${domain_name}"
      - "${master3_name}.${domain_name}"
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.30.5
controlPlaneEndpoint: "${vip_api_name}.${domain_name}:6443"
networking:
  dnsDomain: cluster.local
  serviceSubnet: "10.233.0.0/18"
  podSubnet: "10.233.64.0/18"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOT  
				
			
		
				
					# check kubeadm config file
cat /opt/kubeadm_config.yml 
				
			
		فایل این کانفیگ رو میتونید از اینجا دانلود کنید.
قبل از اینکه کلاستر رو ایجاد کنید خوبه که ایمیجهایی که لازم هست رو اول دریافت کنید. مخصوصا اگه توی ایران هستید و دریافت ایمیجها ممکن اذیت کننده بشه، به این صورت میتونید لیست ایمیجها رو بگیرید و اونها رو pull کنید:
				
					kubeadm config images list --config /opt/kubeadm_config.yml 
				
			
		
				
					kubeadm config images pull --config /opt/kubeadm_config.yml 
				
			
		نهایتا با زدن دستور زیر ایجاد اولیه کلاستر رو شروع میکنید:
				
					kubeadm init --config /opt/kubeadm_config.yml 
				
			
		ابزار kubeadm ابتدا یه سری precheck هارو انجام میده تا مطمئن شه که سرور آماده ران کردن کوبرنتیز هست، این precheckها ممکنه یه سری وارنینگ بده و یا به یه سری ارور بخوره و exit کنه اما نهایتا اگه مشکلی نباشه کامپوننتهای control plane رو نصب میکنه و نهایتا یه پیامی شبیه این رو بهمون نشون میده:
				
					Your Kubernetes control-plane has initialized successfully! 
				
			
		
				
					To start using your cluster, you need to run the following as a regular user: 
				
			
		
				
					  mkdir -p $HOME/.kube 
				
			
		
				
					  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
				
			
		
				
					  sudo chown $(id -u):$(id -g) $HOME/.kube/config 
				
			
		
				
					You should now deploy a Pod network to the cluster. 
				
			
		
				
					Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: 
				
			
		
				
					  /docs/concepts/cluster-administration/addons/ 
				
			
		
				
					You can now join any number of machines by running the following on each node 
				
			
		
				
					as root: 
				
			
		
				
					  kubeadm join : --token  --discovery-token-ca-cert-hash sha256:    
				
			
		
											الان کلاستر شما نصب شده و با استفاده از دستور kubectl میتونید وضعیت اون رو چک کنید. اگر لیست کل پادها رو بگیرید میبینید که پادهای coredns تو حالت pending مونده که به دلیل نبود CNI هست. یکی از کارهایی که CNI برای ما انجام میده اینه که به پادهای ما IP میده. پادهای Coredns منتظر گرفتن IP هستند. پس بریم سراغ نصب CNI روی کلاستر کوبرنتیز که آماده کردیم.
در ادامه میمونه نصب CNI و اضافه کردن باقی نودها به کلاستر که به صورت زیر انجامشون میدیم:
				
					# install calico CNI:
kubectl create -f https://docs.tigera.io/calico/latest/manifests/calico.yaml 
				
			
		
				
					# check calico pods on kube-system namespace:
kubectl -n kube-system get pod | grep calico 
				
			
		ابتدا سرتیفیکیت های مستر اول رو به بقیه نودهای مستر هم کپی میکنیم:
				
					# copy certificate directory to localhost:
scp -r adm-master1:/etc/kubernetes/pki . 
				
			
		
				
					# copy certificate directory to master2 and master3:
scp -r pki adm-master2:/etc/kubernetes/
scp -r pki adm-master3:/etc/kubernetes/ 
				
			
		دستور گرفتن کامند Join برای اضافه کردن نود بعدی به کلاستر رو هم در ادامه براتون میذارم، دقت کنید که اگر نود مستر میخواید اضافه کنید یه سوئیچ control-plane– هم بهش اضافه کنید.
				
					# create join command:
kubeadm token create --print-join-command 
				
			
		
				
					# sample output:
kubeadm join 37.32.9.196:6443 --token   --discovery-token-ca-cert-hash sha256:  
				
			
		دیگه تموم شد. میتونید از کلاستر کوبرنتیز که دارید استفاده کنید. تمام این مسیر رو هم میتونید اینجا بینید و داشته باشید.
											اشکالات احتمالی در Kubeadm
در زیر، به برخی اشکالات رایجی که ممکن است حین راهاندازی با آن روبهرو شوید اشاره شده است:
- پادها با خطای کمبود رم و CPU مواجه میشوند: مطمئن شوید نود مستر حداقل ۲ vCPU و ۲ گیگابایت رم دارد.
 - نودها نمیتوانند به مستر متصل شوند: بررسی کنید در فایروال، همه پورتهای مورد نیاز باز باشند و نودها بتوانند از طریق شبکه، به یکدیگر متصل شوند.
 - پادهای Calico مرتب ریاستارت میشوند: معمولاً اگر آدرس IP نودها با رنج IP پادها همپوشانی داشته باشد، Calico به مشکل برمیخورد. مطمئن شوید رنج IP نود و پاد یکسان نیست.
 - خطاهای دیگر پاد: برای خطاهای پاد میتوانید راهنمای عیبیابی پادها را ببینید.
 
اگر CPU سرور مستر کمتر از ۲ هسته باشد، ممکن است خطای زیر را ببینید:
				
					[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2 
				
			
		اگر از پارامتر --apiserver-advertise-address با IP عمومی استفاده کنید، ممکن است کامپوننتهای مستر با خطای زیر روبهرو شوند:
				
					timed out waiting for the condition 
				
			
		برای رفع مشکل در IP عمومی، از پارامتر --control-plane-endpoint استفاده کنید.
در صورتی که پس از ریستکردن مستر با دستور kubeadm reset، با یک توکن جدید قصد دارید نود ورکر را Join کنید و خطای زیر را بگیرید، با دستور kubeadm reset روی ورکر مشکل را حل کنید:
				
					[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
[ERROR Port-10250]: Port 10250 is in use
[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists 
				
			
		این دستور برای پاک کردن کلاستر استفاده میشود. بهش دقت کنید و تنها در مواقعی که میخواهید کلاستر ایجاد شده رو پاک کنید ازش استفاده کنید. همهچیز رو پاک میکنه حواستون باشه.
ابزار Kubeadm چگونه کار میکند؟
زمانی که با دستور kubeadm init یک کلاستر Kubernetes را راهاندازی میکنید، مراحل زیر رخ میدهد:
- مرحلهی Preflight Checks: ابتدا بررسی میکند که پیشنیازهای سیستمی مهیا هستند و ایمیجهای مورد نیاز از 
registry.k8s.ioدانلود میشود. - مرحلهی TLS Certificates: گواهیهای لازم ایجاد شده و در مسیر 
/etc/kubernetes/pki/ذخیره میشوند. - مرحلهی Kubeconfig Files: فایلهای kubeconfig برای مؤلفههای مختلف در مسیر 
/etc/kubernetes/تولید میشوند. - راهاندازی Kubelet: سرویس Kubelet شروع به کار میکند و پادهای استاتیک (Static Pods) برای مؤلفههای کنترلپلین را در 
/etc/kubernetes/manifests/میسازد. - اجرای مؤلفههای مستر: پادهای مستر (api-server، controller-manager و scheduler) بالا میآیند.
 - نصب CoreDNS و Kubeproxy.
 - ایجاد توکن: توکن راهاندازی (Bootstrap Token) برای نودهای ورکر تولید میشود تا به کنترلپلین متصل شوند.
 
بدین ترتیب، همه پیکربندیهای اصلی در مسیر /etc/kubernetes/ قرار میگیرد.
چند سوال متداول:
۱. چگونه از CA سفارشی در Kubeadm استفاده کنیم؟
بهصورت پیشفرض، kubeadm گواهیهای CA مخصوص خود را ایجاد میکند. اما اگر بخواهید از CA سفارشی استفاده کنید، فایلهای گواهیتان باید در مسیر /etc/kubernetes/pki/ قرار داشته باشند. وقتی kubeadm فایلهای گواهی را در آنجا بیابد، دیگر آنها را بازنویسی نخواهد کرد.
۲. چگونه دستور Kubeadm Join را مجدداً تولید کنیم؟
کافی است از دستور زیر استفاده کنید:
				
					kubeadm token create --print-join-command 
				
			
		در این مطلب، نحوه نصب Kubernetes را بهصورت قدمبهقدم با Kubeadm یاد گرفتیم.
برای یک مهندس DevOps، درک اجزای کلاستر Kubernetes اهمیت زیادی دارد. در حالی که بسیاری از شرکتها از سرویسهای مدیریتشده (Managed Kubernetes) استفاده میکنند، یادگیری مؤلفههای پایهای و مبانی Kubernetes، ضروری است.
راهاندازی Kubeadm برای یادگیری و تمرین مناسب است. همچنین قابلیت آزمایش روی VMهای لوکال را فراهم میکند تا همه تنظیمات کلاستر را بررسی کرده و نحوه عیبیابی مؤلفههای مختلف را بیاموزید.
توی بلاگ پستهای بعدی مطالب مربوط به کوبرنتیز رو ادامه میدیم و بیشتر با هم یاد میگیریم.
مراقب خودتون باشید. 🌹🐳🌹
															در مسیر Observability، الک (قسمت دوم) توی این پست استک قدرتمند ELK رو بررسی کردیم.
در مسیر Observability، جمع بندی استک الک (قسمت سوم) توی این پست بقیه کامپوننتهای استک الک رو بررسی کردیم و fluentd و fluentbit رو مقایسه کردیم و نهایتا یه معرفی هم روی opensearch داشتیم.
در مسیر Observability، استک پرومتئوس (قسمت چهارم) توی این پست یه معرفی اولیه داشتیم روی استک پرومتئوس.
در مسیر Observability، استک پرومتئوس (قسمت پنجم) توی این پست یه مقدار کامپوننت های استک پرومتئوس رو بیشتر بررسی کردیم.
								
															

