上一篇我們完成了HAproxy 與 Keepalived的建置部署,本篇我們就進入實際建置Kubernetes Cluster的流程。
本文目標將說明搭配上一篇文章的內容,如何繼續完成您的第一組Kubernetes Cluster的建構流程。
正在看文章的您完全可以按照本文來一步一步完成您的容器平台,話不多說,以下是本章將討論到的幾個章節:
(以下內容請跟據角色在每個節點上進行設定)
#------------------------------------------------------
# S1-1. FW設定 (control-planes)
#------------------------------------------------------
[root]# systemctl enable --now firewalld ; systemctl status firewalld
[root]# vim set_firewall_master.sh
#!/bin/bash
firewall-cmd --zone=public --add-service=kube-apiserver --permanent
firewall-cmd --zone=public --add-service=etcd-client --permanent
firewall-cmd --zone=public --add-service=etcd-server --permanent
firewall-cmd --zone=public --add-port=10250/tcp --permanent
firewall-cmd --zone=public --add-port=10251/tcp --permanent
firewall-cmd --zone=public --add-port=10252/tcp --permanent
firewall-cmd --zone=public --add-port=179/tcp --permanent
firewall-cmd --reload
[root]# chmod +x set_firewall_master.sh
[root]# ./set_firewall_master.sh; firewall-cmd --list-all
#------------------------------------------------------
# S1-2. FW設定 (workers)
#------------------------------------------------------
[root]# systemctl enable --now firewalld ; systemctl status firewalld
[root]# vim set_firewall_worker.sh
#!/bin/bash
firewall-cmd --zone=public --add-port=10250/tcp --permanent
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent
firewall-cmd --zone=public --add-port=179/tcp --permanent
firewall-cmd --reload
[root]# chmod +x set_firewall_worker.sh ;
[root]# ./set_firewall_worker.sh; firewall-cmd --list-all
#------------------------------------------------------
# S1-3. time sync (all nodes)
#------------------------------------------------------
[root]# systemctl enable --now chronyd ; chronyc sources
#------------------------------------------------------
# S1-4. 關閉SWAP (all nodes)
#------------------------------------------------------
[master]# swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#------------------------------------------------
# S1-5. Lode module (all nodes)
# 預設linux禁止資料轉發,需要加載br_netfilter來解決
#------------------------------------------------
[root]# vim /etc/modules-load.d/k8s.conf
overlay
br_netfilter
[root]# modprobe overlay ; modprobe br_netfilter
[root]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root]# sysctl --system
本節將安裝以下軟體套件:
#------------------------------------------------
# S2-1. 安裝CRIO (all k8s nodes)
#------------------------------------------------
[root]# export VERSION=1.27
[root]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/devel:kubic:libcontainers:stable.repo
[root]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo
[root]# yum install cri-o -y
[root]# systemctl enable --now crio ; systemctl status crio
[root]# crio version
[root]# yum list cri-o --showduplicates|sort -r > crio.version
#------------------------------------------------
# S2-2. 修改CRIO的cgroup
# Linux使用systemd時,會建立一個cgroup,
# 此時必須要確保CRIO,kubelet和systemd是使用同一個cgroup, 不然可能出現不可預期的問題,
# 將CRIO, kubelet都配置成使用systemd來作為cgroup來驅動,系統較穩定
#------------------------------------------------
[root]# cat /etc/crio/crio.conf | grep cgroup_manager
# cgroup_manager = "systemd"
=> 取消#
[root]# systemctl restart crio ; systemctl status crio
#------------------------------------------------
# S2-3. 安裝kubelet,kubeadm,kubectl (all k8s nodes)
# 安裝時,官方文件上的REPO內容有誤,會導致無法取得套件,故改用此
#------------------------------------------------
[root]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
[root]# yum clean all ; yum repolist
#----------------------------
# S2-4. Check available version
# 選擇1.27.x
#----------------------------
[root]# yum list kubelet --showduplicates|sort -r > kubelet.version
[root]# yum list kubeadm --showduplicates|sort -r > kubeadm.version
[root]# yum list kubectl --showduplicates|sort -r > kubectl.version
kubeadm: 1.27.6-0
kubectl: 1.27.6-0
kubelet: 1.27.6-0
#------------------------------------------------
# S2-5. Install kubeadm, kubelet, kubectl (all nodes)
#------------------------------------------------
[root]# yum install kubelet-1.27.6-0 kubeadm-1.27.6-0 kubectl-1.27.6-0
[root]# systemctl enable --now kubelet ; systemctl status kubelet
#------------------------------------------------
# S3-1. 建立第一個control plane node (master01)
# PS. 若執行有問題,執行kubeadm reset重來
#------------------------------------------------
[root@master01]# kubeadm init --control-plane-endpoint "10.107.88.9:6443" --upload-certs --pod-network-cidr=192.168.0.0/16
※ --upload-certs: 自動將control plane會用到的certificates儲存到名為kubeadm-certs的secret中,若要使用自已的憑證,移除此參數。
** RESULT **
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
kubeadm join 10.107.88.9:6443 --token 1s990r.atf22thmail583k6 \
--discovery-token-ca-cert-hash sha256:68cb14ed46cc2454d11cc9127856ee2df3cf45cb9d7a7c34fd97c624e86ce6ab \
--control-plane --certificate-key 0e5614062d18ae699e4f79609992908cd8e25b9409abdeeee0bb842dfcb28208
kubeadm join 10.107.88.9:6443 --token 1s990r.atf22thmail583k6 \
--discovery-token-ca-cert-hash sha256:68cb14ed46cc2454d11cc9127856ee2df3cf45cb9d7a7c34fd97c624e86ce6ab
※ 如果忘記join command,用以下指令重新列出:
[master]# kubeadm token create --print-join-command
#------------------------------------------------
# S3-2. 基本檢查 (master01)
#------------------------------------------------
[master]# kubectl get nodes
[master]# kubectl get pod -n kube-system (檢查master元件是否正常)
[master]# crictl images
[master]# crictl ps
[master]# nc -v 10.107.88.9 6443 (測試API server LB是否正常)
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 10.107.88.9:6443
#------------------------------------------------
# S3-3. TOKEN的時限是24HR,如果想要在24HR後還會加新的節點,要重新產生TOKEN (master01)
# 重新產生後,必須要將cluster reset, 重新init
# token expire: 24HR
# certificate-key: 2HR
#------------------------------------------------
※ 超過24Hr後,在master02執行join後出現的訊息(如圖)
解決方式:
(1) 重建cluster : 在master01執行`kubeadm reset`,直接全部重來
(2) Initial前建立不會過期的token: `kubeadm token create --ttl 0 --print-join-command`
#------------------------------------------------
# S3-4. 建立不會過期的token
#------------------------------------------------
[master]# kubeadm token create --ttl 0 --print-join-command (生成worker)
kubeadm join 10.107.88.9:6443 --token 19j12t.veocwjglauw623fb --discovery-token-ca-cert-hash sha256:68cb14ed46cc2454d11cc9127856ee2df3cf45cb9d7a7c34fd97c624e86ce6ab
[master]# kubeadm init phase upload-certs --upload-certs --v=999
6f4a4de6273d5dbd4288814e4156b98334ca927cfdcca51beec7f37a7a9463bd
#------------------------------------------------
# S3-5. 結合worker指令,產生master join指令 (master02, maser03)
#------------------------------------------------
[master]# kubeadm join 10.107.88.9:6443 --token 19j12t.veocwjglauw623fb --discovery-token-ca-cert-hash sha256:68cb14ed46cc2454d11cc9127856ee2df3cf45cb9d7a7c34fd97c624e86ce6ab --certificate-key 6f4a4de6273d5dbd4288814e4156b98334ca927cfdcca51beec7f37a7a9463bd --control-plane --v=999
#------------------------------------------------
# S3-6. 確認token (master01)
#------------------------------------------------
[master01]# kubeadm token list
#------------------------------------------------
# S3-7. Control-plane is done
#------------------------------------------------
[master]# kubectl get nodes
以上就完成了Control-Plane的建置,實務上可以在取得S3–1的結果後,直接到其他節點上去執行即可,後面的步驟是因為我在部署完第一個節點後又超過24hr之後才繼續進行其他節點的部署時所需要的做法,實務上會一口氣將三個control-plane節點一口氣完成,如果來不及的話,則會用reset指令全部重來比較快。
加入運算節點(compute)也很簡單,將S3–1的輸出複製到compute節點上執行即可。
#------------------------------------------------
# S4-1. add workers (all workers)
#------------------------------------------------
[worker]# kubeadm join 10.107.88.9:6443 --token p9gw5v.lepwj4nbkrshrqpl --discovery-token-ca-cert-hash sha256:2c2a0626f4c11150ba9a2ce101a5fdf99ceb6072c78555ff2a23b50542a81387 81387
本篇很快速的帶大家將Kubernetes Cluster建立起來,可以看到整個過程其實不會太難,但我自已的心得是這個解決方案最困難的部分是從完成建置後才開始,實務上以目前的狀態是完全不足夠服務使用的。
下一篇會說明我在安裝完畢之後,首先會加入的幾個基礎服務,這些服務可以讓這個剛出生的Cluster能夠更進一步具備服務運作或是進行管理的能力。
謝謝大家看完這篇文章,我們下期再見!