Install Kubernetes

برای هر نود hostname را تنظیم میکنیم

hostnamectl set-hostname {HOSTNAME}

برای هر نود نیاز است آدرس زیر ایجاد شود

mkdir -p /home/data

برای هر نود با استفاده از دستورات زیر پکیج های rpm را نصب میکنیم

فرض می شود همه فایل های نصب در دایرکتوری ~/ قرار دارند

tar -xf ./k8s_tools.tar.gz
cd ./k8s-offline
yum install -y --cacheonly --disablerepo=* ./rpm/*.rpm

در یکی از نود های کوبرنتیز، کانتینر registry برای کوبرنتیز را ایجاد میکنیم

(بهتر است یک registry برای ایمیج های کوبرنتیز در یکی از نود های کوبرنتیز و یک registry اصلی برای سایر ایمیج ها بر روی یکی از سرورهای دیتابیس که مقدار storage بالایی دارد ایجاد شود)

cd ./images
docker load -i registry.docker
docker run -d -p 5000:5000 --restart=always --name registry -v rke-registry:/var/lib/registry registry:latest

#test:
curl -X GET http://{IP}:{PORT}/v2/_catalog

بجای IP و PORT اول مشخصات registry مخصوص کوبرنتیز و بجای IP و PORT دوم مشخصات registry اصلی را مشخص میکنیم

(این دستورات روی همه نود ها اجرا میشود)

sudo systemctl enable docker
sudo systemctl start docker

vi /etc/docker/daemon.json
{
"insecure-registries":["{IP}:{PORT}","{IP}:{PORT}"],
"group": "docker"
}
systemctl restart docker

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

adduser mydocker
passwd mydocker
sudo groupadd docker
sudo usermod -aG docker mydocker
newgrp docker

export UUUU=mydocker
sudo chmod go-w /home/$UUUU

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

ssh-keygen
cat ~/.ssh/id_rsa.pub | ssh mydocker@{IP} "mkdir -p /home/mydocker/.ssh && cat >> /home/mydocker/.ssh/authorized_keys && chmod 600 /home/mydocker/.ssh/authorized_keys"

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

export UUUU=mydocker
sudo chmod 700 /home/$UUUU/.ssh
sudo chmod 644 /home/$UUUU/.ssh/authorized_keys
sudo chown $UUUU:$UUUU /home/$UUUU/.ssh/authorized_keys
sudo chown $UUUU:$UUUU /home/$UUUU/.ssh
sudo usermod -d /home/$UUUU $UUUU
sudo systemctl restart sshd

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

nano /etc/ssh/sshd_config

PubkeyAuthentication yes
AllowAgentForwarding yes
AllowTcpForwarding yes

sudo cat /etc/ssh/sshd_config | grep -E "PubkeyAuthentication|AllowAgentForwarding|AllowTcpForwarding"
sudo systemctl restart sshd

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

sudo firewall-cmd --permanent --add-port=5000/tcp
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=2376/tcp
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --permanent --add-port=9099/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10254/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/udp
sudo firewall-cmd --permanent --add-port=2379/tcp
sudo firewall-cmd --permanent --add-port=2380/tcp
sudo firewall-cmd --permanent --add-port=7946/tcp
sudo firewall-cmd --permanent --add-port=7946/udp
sudo firewall-cmd --permanent --add-port=179/tcp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --permanent --add-port=5473/tcp
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 99 -o cali+ -j ACCEPT
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 99 -i cali+ -j ACCEPT
sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 99 -o cali+ -j ACCEPT
sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 99 -i cali+ -j ACCEPT
sudo firewall-cmd --set-log-denied=all
sudo firewall-cmd --reload

مابقی دستورات تنها برای نود اول است:

دستور زیر اجرا می شود تا ایمیج های کوبرنتیز روی رجیستری مخصول پوش شود

(آی پی و پورت registry کوبرنتیز جایگذاری شود)

unzip ~/k8s_images.zip -d ~/
./rancher/rancher-load-images.sh --image-list ./ALL-IMG.txt --images ~/k8s_images.tar.gz --registry {IP}:{PORT} 2>&1 | tee ./load.log

دستور زیر برای نصب helm انجام می شود (به جای {VERSION} مقدار ورژن صحیح فایل موجود جایگذاری شود)

cd ./helm
tar -zxvf helm-{VERSION}.tar.gz
ll /usr/local/bin | grep helm
sudo cp linux-amd64/helm /usr/local/bin/helm
ll /usr/local/bin | grep helm
sudo chmod +x /usr/local/bin/helm

دستور زیر برای نصب kubectl اجام می شود

cd ./kubectl
echo "$(<kubectl.sha256) kubectl" | sha256sum --check
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

با استفاده از دستورات زیر فایل rke را برای نصب آماده میکنیم

cd ./rke
sudo chmod +x ./rke
./rke --version

با دستور زیر وارد محیط کانفیگ rke می شویم

./rke config --name cluster.yml

برای هر نود بصورت زیر پاسخ میدهیم:

[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Number of Hosts [1]: #تعداد نود ها
[+] SSH Address of host (1) [none]: #آی پی نود اول
[+] SSH Port of host (1) [22]: #پاسخ پیشفرض (اینتر میزنیم)
[+] SSH Private Key Path of host (10.10.10.12) [none]: #پاسخ پیشفرض (اینتر میزنیم)
[-] You have entered empty SSH key path, trying fetch from SSH key parameter
[+] SSH Private Key of host (10.10.10.12) [none]: #پاسخ پیشفرض (اینتر میزنیم)
[-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa
[+] SSH User of host (10.10.10.12) [ubuntu]: mydocker
[+] Is host (10.10.10.12) a Control Plane host (y/n)? [y]: y # درصورتیکه نود مورد نظر مستر است y
[+] Is host (10.10.10.12) a Worker host (y/n)? [n]: y # درصورتیکه نود مورد نظر مستر است y
[+] Is host (10.10.10.12) an etcd host (y/n)? [n]: y # درصورتیکه نود مورد نظر ورکر است y
[+] Override Hostname of host (10.10.10.12) [none]: node1 # هاست نیم نود
[+] Internal IP of host (10.10.10.12) [none]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Docker socket path on host (10.10.10.12) [/var/run/docker.sock]: #پاسخ پیشفرض (اینتر میزنیم)

در نهایت جواب سوالات زیر را پاسخ میدهیم:

[+] Network Plugin Type (flannel, calico, weave, canal, aci) [canal]: canal #نوع شبکه
[+] Authentication Strategy [x509]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Authorization Mode (rbac, none) [rbac]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Kubernetes Docker image [rancher/hyperkube:v1.26.8-rancher1]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Cluster domain [cluster.local]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Service Cluster IP Range [10.43.0.0/16]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Enable PodSecurityPolicy [n]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Cluster Network CIDR [10.42.0.0/16]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Cluster DNS Service IP [10.43.0.10]: #پاسخ پیشفرض (اینتر میزنیم)
[+] Add addon manifest URLs or YAML files [no]: #پاسخ پیشفرض (اینتر میزنیم)

فایل cluster.yml ایجاد شده را با ویرایشگر باز میکنیم و موارد زیر را تغییر میدهیم:

kubelet:
  extra_binds:
    - "/home/data:/home/data" 
    
--------------------

ssh_agent_auth: true


--------------------

addons: |-
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: custom-ingress-nginx-controller
    namespace: ingress-nginx
  spec:
    ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
    selector:
      app: ingress-nginx
      app.kubernetes.io/instance: ingress-nginx
    sessionAffinity: None
    type: LoadBalancer

همچنین آی پی و پورت registry را برای همه ایمیج ها در قسمت system_images تنظیم میکنیم (قبل از image ها /{PORT}:{IP} را جایگذاری میکنیم) بطور مثال:

system_images:
  etcd: rancher/mirrored-coreos-etcd:v3.5.6    ----- تبدیل شود به ---->  etcd: {IP}:{PORT}/rancher/mirrored-coreos-etcd:v3.5.6

دستور زیر را اجرا میکنیم (دستور خط 5 برای چک کردن اتصال با ssk-key به همه نود ها انجام میشود)

eval "$(ssh-agent -k)" && eval $(ssh-agent) && ssh-add ~/.ssh/id_rsa
ssh-add -l

#test:
ssh -t mydocker@{IP} "docker ps"

با استفاده از دستور زیر نصب شروع می شود

./rke up

با استفاده از دستورات زیر فایل کانفیگ کوبرنتیز نصب شده را برای استفاده در kubectl در آدرس مربوطه کپی میکنیم

mkdir -p /root/.kube/
cp ./rke/kube_config_cluster.yml /root/.kube/config
kubectl get nodes

با استفاده از دستور زیر از صحت نصب کوبرنتیز اطمینان حاصل میکنیم:

kubectl get nodes -o wide