Kubernetes新手必看實務流程-Part2: 建立您的第一組K8S 叢集

2024/01/15閱讀時間約 21 分鐘

上一篇我們完成了HAproxy 與 Keepalived的建置部署,本篇我們就進入實際建置Kubernetes Cluster的流程。

開工

開工

本文目標將說明搭配上一篇文章的內容,如何繼續完成您的第一組Kubernetes Cluster的建構流程。

正在看文章的您完全可以按照本文來一步一步完成您的容器平台,話不多說,以下是本章將討論到的幾個章節:

  1. 節點安裝前設定
  2. 軟體套件安裝
  3. Control-Plane部署
  4. 加入運算節點
  5. 結論

1. 節點安裝前設定

(以下內容請跟據角色在每個節點上進行設定)

#------------------------------------------------------
# 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
raw-image
#------------------------------------------------------
# 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

2. 軟體套件安裝

本節將安裝以下軟體套件:

  • CRIO
  • kubelet
  • kubeadm
  • kubectl
#------------------------------------------------
# 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
raw-image
#------------------------------------------------
# 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
raw-image
#------------------------------------------------
# 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
raw-image

3. Control-Plane部署

#------------------------------------------------
# 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
raw-image
#------------------------------------------------
# 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
raw-image
#------------------------------------------------
# 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`
raw-image
raw-image
#------------------------------------------------
# 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
raw-image
#------------------------------------------------
# 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
raw-image
raw-image
#------------------------------------------------
# S3-6. 確認token (master01)
#------------------------------------------------
[master01]# kubeadm token list
raw-image
#------------------------------------------------
# S3-7. Control-plane is done
#------------------------------------------------
[master]# kubectl get nodes
raw-image

以上就完成了Control-Plane的建置,實務上可以在取得S3–1的結果後,直接到其他節點上去執行即可,後面的步驟是因為我在部署完第一個節點後又超過24hr之後才繼續進行其他節點的部署時所需要的做法,實務上會一口氣將三個control-plane節點一口氣完成,如果來不及的話,則會用reset指令全部重來比較快。


4. 加入運算節點

加入運算節點(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
raw-image

5. 結論

本篇很快速的帶大家將Kubernetes Cluster建立起來,可以看到整個過程其實不會太難,但我自已的心得是這個解決方案最困難的部分是從完成建置後才開始,實務上以目前的狀態是完全不足夠服務使用的。

下一篇會說明我在安裝完畢之後,首先會加入的幾個基礎服務,這些服務可以讓這個剛出生的Cluster能夠更進一步具備服務運作或是進行管理的能力。

謝謝大家看完這篇文章,我們下期再見!














8會員
39內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!