Rancher with K8S cluster 之旅 (4) - OneTouchDeployRancher

Posted by Jimmy's Blog on February 20, 2021

前言

今天這篇是 Rancher 之旅的尾聲,也就是最後一篇了。前面文章提到了筆者如何在離線 On-Premise 的環境下安裝 Rancher,操作了許多 Rancher API。那身為一個軟體工程師,怎麼能夠忍受需要手動這件事情呢XD,另個原因當然是一定要整合進 CI/CD 裡面的。所以,筆者這邊開發了一套工具,能夠輕易地安裝 Rancher v2.5.5、K8S v1.19.6 的 bare-metal 安裝包。因為只需下一個 command,所以稱作為 OneTouchDeployRancher。除此之外,也會介紹一些輔助功能方便使用者操作。所有的 source code 筆者都已經放在 Github 上了,歡迎享用。最後,筆者會分享在 Rancher 之旅當中,跌跌撞撞碰到的大坑小坑。好了! 那開始吧!

OneTouchDeployRancher

這個 project 的主要宗旨以及所有的操作方式已經在 README.md 有說明了。不過,這邊還是會簡單地帶過一下。首先,二話不說先把此 project clone 下來吧!

Prerequisite

我們要先在有網路的環境,準備必要的離線資源,這部分在前一篇文章也有敘述到了。有兩大部分: 1. 主機上的必要套件 2. Rancher 及 K8S 的必要映像檔。

主機上的必要套件

前一篇文章已經有描述過了,讀者可以回去看一下。注意你的 Master node 跟 Worker node 都要有各自所需的套件。

Rancher 及 K8S 的必要映像檔

使用者需準備 rancher-images.tar.gz 以及 registry2.7.tar 兩個檔案。

1
2
3
cd scripts

sudo bash rancher-save-images.sh --image-list ../images/rancher-images.txt

執行完就能夠產生 rancher-images.tar.gz。這個官方給的 script 筆者也已經包進此 project 中,可以安心享用。另外,此 project 的 rancher-images.txt 是筆者修改過的,主要是移除一些八輩子也用不到(誤XD)比較不常用的映像檔來進行瘦身,全部抓下來只需要接近 3G 而已。但要注意的是,這個就是只能安裝 K8S v1.19.6 及 Rancher v2.5.5 的版本喔! 其餘的若是使用者想要,比如說你想裝 K8S v1.18.X 的版本,你可自行修改 rancher-images.txt 即可。

官方每個 Release 都有附上各自的 rancher-images.txt,你可以依自己的需求去新增刪除裡面的映像檔。另外,Weave plugin 的映像檔官方是沒有的,所以你如果是離線安裝並且使用 Weave 當作 CNI 會有錯誤,所以筆者也已經將 Weave 的 image 加進 rancher-images.txt

1
2
3
docker pull registry:2.7

docker save -o registry2.7.tar registry:2.7

接著打包 registry 的 Image,前面文章也有講述過就不多說明了。

Deploy

準備好上面的一切之後,你就可以把整個 project 都放到離線環境(你要安裝的Master node)上,並且把你剛剛準備好的 rancher-images.tar.gz 以及 registry2.7.tar 兩個檔案放到 project 底下的 images folder 裡面,就可以開始了! 首先,我們都先切換到 Root。

1
sudo su

Deploy registry

接下來,我們來佈署 registry。

1
2
3
cd scripts

sudo bash deploy --master-ip $(your_master_ip) -- deploy-registry

$(your_master_ip) 填入你 Master node 的對外 IP,也就是會跟其他 Worker node 溝通的網段。就這麼簡單,registry 就完成囉!

1
2
3
docker ps -a | grep registry

55720354de32   registry:2.7   "/entrypoint.sh /etc…"   9 days ago    Up 6 hours   0.0.0.0:5000->5000/tcp      registry

可以查看一下是否運作正常。

Deploy Rancher and K8S cluster (master node)

接著就來佈署 Rancher 以及 K8S 吧!

1
2
3
cd scripts

sudo bash deploy --master-ip $(your_master_ip) --cluster-name $(your_cluster_name) --cni $(your_cni_plugin) -- deploy-master

$(your_master_ip) 填入你 Master node 的對外 IP,$(your_cluster_name) 填入你想取的名稱,$(your_cni_plugin) 填入你想使用的 CNI plugin。目前支援 4 種: flannel、canal、calico 、weave。安裝會花十幾二十分鐘,完成之後便可以直接登入 UI https://$(your_master_ip):8443 看一下狀態囉! 安裝完也同時可以使用 kubectl 的 command,查看一下 cluster status:

1
2
3
4
5
6
7
8
9
10
11
12
kubectl cluster-info

Kubernetes master is running at https://192.168.131.130:8443/k8s/clusters/c-mqgms
CoreDNS is running at https://192.168.131.130:8443/k8s/clusters/c-mqgms/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


kubectl get nodes

NAME     STATUS   ROLES                      AGE     VERSION
master   Ready    controlplane,etcd,worker   6h24m   v1.19.6

Deploy worker node

1
2
3
cd scripts

sudo bash deploy -- worker-command

把 output 出來的 docker command 貼到你的 worker node 機器上去執行,就可以囉!

Remove Rancher and K8S cluster

筆者這邊也準備了一個 script 可以方便地移除所有 Rancher 及 K8S 相關的東西。適用於 master and worker node。

1
2
3
cd scripts

sudo bash clean.sh

若是想移除 registry :

1
2
3
cd scripts

sudo bash clean.sh registry-flush

跌進去過的坑

這邊分享一下筆者遇到過的問題,或許可以幫到讀者們。

Coredns crashloopback

這問題滿常見的,丟去餵狗應該會看到很多人遇到,這邊提供一些筆者找到的資料:

Metrics-server image pull policy

若是遇到了 metrics-server 起不來是因為他嘗試去 Internet 拉 Image,而你環境是離線的而造成錯誤的話。可以執行下面:

1
kubectl patch Deployment/metrics-server -n kube-system -p '{"spec": {"template": {"spec":{"containers":[{"name":"metrics-server","imagePullPolicy":"IfNotPresent"}]}}}}'

主要是改變它的 image pull policy,就可以囉。

Rancher v2.5.5, rancher-image-list does not contain weave image

這問題我上面也有提到,官方出的 rancher-images.txt 並沒有包含 Weave 的 image,原因是因為這個,當你選擇 Weave 做 CNI 時就會有錯誤,不過當然你若是有網路的環境安裝 Rancher 的話不會有這問題。

Network interface (Weave, flannel,…) should be removed when you reuse the node

當 Interface 沒有清乾淨,重新安裝時會有問題。筆者提供的 clean.sh 已經會去清掉所有 CNI 有可能會創建的 Interfaces 了。所以若是用 clean.sh再去使用相同 Node 去裝就不會有此問題。另外,執行完 clean.sh 可以重開機確保乾淨,之前也有遇過裝完 Weave 後再清除但卻還是會有問題,但有重開機就不會囉!

kubectl shell UI is not working, trying to pull image from docker hub

此 Issue 也已經有人 report 至 Rancher。目前筆者使用 kubectl 都是在 host 上面。

Close selinux and firewalld

之前有遇過滿多問題,像是筆者遇到 etcd unhealthy 的問題,log:

1
2
3
4
2019-07-13 11:14:24.030026 I | embed: rejected connection from "10.3.1.20:40787" (error "EOF", ServerName "")
2019-07-13 11:14:32.866684 I | embed: rejected connection from "10.3.1.20:58550" (error "tls: failed to verify client's certificate: x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"kube-ca\")", ServerName "")
2019-07-13 11:14:37.882558 I | embed: rejected connection from "10.3.1.20:58552" (error "tls: failed to verify client's certificate: x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"kube-ca\")", ServerName "")
2019-07-13 11:14:42.905844 I | embed: rejected connection from "10.3.1.20:58554" (error "tls: failed to verify client's certificate: x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"kube-ca\")", ServerName "")

找了滿多解法都無法解決,很多都是說因為之前有殘留的舊資料 (/etc/kubernetes/ssl) 下面的東西,的確筆者是使用舊的 Node 但是也確定舊資料都清掉了,也有一篇文章說是 Timezone 不對也會造成 certificate 有問題。最終解法我做的是調整到對的時區,然後關閉 selinux 還有 firewalld,以及 swap,再重新安裝一次就可以了。所以讀者若是不放心,在安裝前可以做以下的步驟:

關閉 selinux

1
2
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

關閉防火牆

1
systemctl stop firewalld && systemctl disable firewalld

關閉 swap

1
swapoff -a

後記

終於,Rancher 之旅要在這篇畫下句點囉。其實還有很多地方可以做加強,像是前面安裝必要的套件,若是能夠利用 Ansible 就可以幫助使用者準備好所有 Node 的套件安裝,像是 docker 等等,然後就可以進行安裝 Rancher 的流程。整體上就會更簡單,就是準備幾台乾淨機器有 IP 可以互通,然後把安裝包放到 Master node,進行安裝,連 Worker node 的 command 都直接用 Ansible 幫你送過去執行,全部一次到位!

由於公司研究最終是選擇另一個 Solution : Openshift,所以筆者的 Rancher 之旅就暫時告一段落啦! 未來有機會將會再跟大家分享有關 Openshift 的更多技術。

Contact me

有任何疑問或是建議歡迎聯絡 Jimmy!

Gmail: jimmyw86878@gmail.com