Step by Step!Rancher 2-2-K3s 集成部署實踐教程
作者:iLemonrain
https://blog.ilemonrain.com/docker/rancher-with-k3s.html
在生產環境中,很多時候我們都會有這樣的需求:
-
業務彈性需求較大,反覆安裝卸載修改配置文件會對環境造成極大破壞,甚至需要重裝系統以清理環境
-
將業務遷移到 Docker 架構,但使用傳統的 Docker CLI (Docker 命令行) 方式進行管理,效率低下還容易誤操作
-
將業務遷移到 K8s 架構,但因爲 K8s 過於佔用系統資源,往往在開發環境或者小型的生產環境,K8s 剛跑起來系統就沒可用性能資源了
-
K8s 手動部署起來一路盡是無底深坑,歷盡千辛終於配好了,稍稍改動下配置文件整個集羣開始出現問題
-
需要個簡單直觀管理工具,能夠簡單快速的管理各個 K8s 集羣,靈活創建 Pod
在我接觸 K8S 架構之初,也遇到了類似的問題:使用 Rancher2.x+K8s 這樣的架構,在一臺 1C2G 的阿里雲上面部署,部署完成後發現系統內存早就被喫得一乾二淨,業務部署更是無從談起;使用傳統的 Docker Swarm,感覺用起來沒有 K8S 那樣順手舒服。
2019 年 2 月 26 日,業界領先的容器管理軟件提供商 Rancher Labs 推出了輕量級 Kubernetes 發行版 K3s ,這款產品專爲在資源有限的環境中運行 Kubernetes 的研發和運維人員設計。這對於一些小型的開發 / 生產環境、邊緣計算節點甚至性能極其有限的設備(比如樹莓派 3)來講無疑是福音。
但問題來了,K3s 相對於 K8s,精簡了不少功能。那麼如何正確的對接 Rancher 2.x 和 K3s 呢?思考了許久,也在自己的時間環境埋頭研究了一週,終於做出來一套完整的部署教程。好東西當然要共享,也爲那些部署 Rancher+K3s 架構的同好們提供一些常見問題的解決思路。
那麼,教程,現在開始。
Step 0: 配置環境要求
雖然 K3S 是 K8S 的輕量版,但也不能無視配置要求。官方配置要求如下:
-
系統內核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
-
K3S Server 端最低內存要求:512 MB
-
K3S Agent 端內存最低要求:75MB
-
磁盤空間最低要求:200 MB
-
支持的硬件架構:x86_64, ARMv7, ARM64
相對於 K8S 那種性能殺手,K3S 可以輕量到部署在大多數虛擬機上(比如常見的 1C512M,不過如果部署在生產環境,建議 1C2G 及以上以保證穩定性)。如果你還要再同一臺 Server 上同時跑 Rancher 2.x Server 的話,我建議最低配置要求如下:
-
系統內核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
-
CPU 最低核心數:1 核心
-
Rancher 2.x Server + K3S Server + K3S Agent 端最低內存要求:2 GB
-
磁盤空間最低要求:5 GB
-
建議使用的硬件架構:x86_64
雖然 K3S 足夠輕量,但也請不要忘記,Rancher Server 本身也是需要佔用掉大量內存的。所以如果是爲了做成 AIO (All In One) 的效果,建議按照上述的配置要求準備 Server。
Step 1: 安裝 Docker 環境
雖然 K3S 默認集成的是 Containerd,但出於多方面原因,爲了後續部署方便起見,這裏我們將 Containerd 換成 Docker。具體的原因我會在下文解釋。
本文以 Debian 9 x64 系統作爲示例,Ubuntu 可以直接照搬 Debian 的安裝過程,CentOS 用戶我會特殊標註操作步驟。
如果你的服務器在中國大陸境內:
curl -fsSL "https://mirrors4.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg" | apt-key add -
echo "deb [arch=amd64] https://mirrors4.tuna.tsinghua.edu.cn/docker-ce/ stretch stable" > /etc/apt/sources.list.d/docker.list
apt-get update && apt-get install -y docker-ce
如果你的服務器在海外:
curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -
echo "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable" > /etc/apt/sources.list.d/docker.list
apt-get update && apt-get install -y docker-ce
CentOS 系統或者以上方法無法安裝的,請使用官方安裝腳本:
curl -fsSL get.docker.com | sh
也許會有人問,安裝的時候爲什麼去掉了 --no-install-recommends 參數?
因爲需要用到裏面的 cgroup 支持,當然,你也可以加上這個參數,來只安裝基礎的 Docker 組件,同樣能夠支持運行。
在安裝完成後,如果你的服務器位於中國大陸境內,你很有可能需要一個 Docker 鏡像加速器。國內提供 Docker 鏡像加速器的服務商很多,這裏我們以阿里雲的鏡像加速服務爲例:
-
打開 https://cr.console.aliyun.com ,並登錄你的阿里雲賬戶
-
點擊左方的【鏡像中心 - 鏡像加速器】,然後在下方會有一個操作文檔,複製其中的命令,粘貼到你的 SSH 窗口中即可完成鏡像源的更換。
如果報錯誤 sudo: command not found ,只需要去掉每行命令中的 sudo 即可 (前提是你的當前登錄用戶爲 root)
Step 2: 安裝 Rancher Server
此部分可以參考教程:
https://www.cnrancher.com/quick-start
Rancher Server 名字聽起來感覺像是又要裝很多東西,其實並非如此。Rancher Server 只是一個 Docker 鏡像,整個 Rancher 的程序都使用 Docker 打包起來了。所以相對來講配置很簡單,只需要一條命令:
docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 80:80 -p 443:443 rancher/rancher:stable
然後等待幾分鐘,之後訪問你的 Server IP 即可進入 Rancher Server 的首次配置界面。
如果你不想讓 Rancher 佔用你的 80/443 端口(比如前端要放個 Caddy 反代),只需要按照以下步驟操作:
-
修改啓動命令行:
docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 80:80 -p 443:443 rancher/rancher:stable
將裏面的 80 和 443,替換爲你需要的端口(注意:請不要佔用 Kubernetes 的 6443 端口,這一步很容易翻車!),換完的效果大概是這樣:
docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 9080:9080 -p 9443:9443 rancher/rancher:stable
-
啓動 Rancher Server 容器
-
執行命令,確認 Rancher Server 容器的 Container ID,本例中的容器 ID 爲 31aa94998b75:
docker ps | grep "rancher/rancher:stable"
-
執行命令,切入到 Rancher Server 容器的 Bash Shell 中 (TTY):
docker exec -it 31aa94998b75 bash
此時你會發現你的提示符變成了這個樣子:
root@31aa94998b75:/var/lib/rancher#
這時候你控制的就是 Rancher Server 的容器,如果你能夠成功切入 Shell,那麼請繼續下一步,如果未能切入,請使用 docker logs 31aa94998b75 來確認容器是否出現故障。
-
我們先看下要改的文件長什麼樣子:
#!/bin/bash set -e exec tini -- rancher --http-listen-port=80 --https-listen-port=443 --audit-log-path=${AUDIT_LOG_PATH} --audit-level=${AUDIT_LEVEL} --audit-log-maxage=${AUDIT_LOG_MAXAGE} --audit-log-maxbackup=${AUDIT_LOG_MAXBACKUP} --audit-log-maxsize=${AUDIT_LOG_MAXSIZE} "${@}"
-
執行命令,替換默認的端口:
sed -i "s/80/9080/g" /usr/bin/entrypoint.sh sed -i "s/443/9443/g" /usr/bin/entrypoint.sh
-
執行後看下變成了什麼樣子
#!/bin/bash set -e exec tini -- rancher --http-listen-port=9080 --https-listen-port=9443 --audit-log-path=${AUDIT_LOG_PATH} --audit-level=${AUDIT_LEVEL} --audit-log-maxage=${AUDIT_LOG_MAXAGE} --audit-log-maxbackup=${AUDIT_LOG_MAXBACKUP} --audit-log-maxsize=${AUDIT_LOG_MAXSIZE} "${@}""
-
確認修改成功後,使用 exit 命令退出容器的 Bash Shell,之後執行命令重新啓動 Rancher Server 容器:
docker restart 31aa94998b75
-
之後使用新的端口訪問 Rancher Server 的 UI(下面的連接爲例子):
訪問會提示 SSL 證書無效,無視錯誤繼續即可https://rancher.example.com:9443/
- 此時我們會來到 Rancher 的初始化部署頁面,在此頁面輸入默認的全局管理員密碼,創建全局管理員賬戶。
- 這一步輸入我們的 Rancher API Endpoint,注意這裏輸入的 URL 一定要保證整個集羣內的所有節點都可以正常連接。
- 之後我們會來到主界面,如果對英文操作看着頭疼的話,右下角可以切換語言。
具體方法是點擊右下角的 English ,然後下拉選擇 簡體中文 (zh-hans) 即可。
漢化設置會跟隨你的 Cookies 走,所以不換電腦或者不重裝系統的話應該不會自動換回英語。
- 我們接下來在 Rancher 中創建一個新的集羣,點擊頁面上的【創建集羣】按鈕,開始創建一個新的 K8S/K3S 集羣。
注意:在這裏請選擇 導入現有的 Kubernetes 集羣 (Import),而不是其他的新建選項!
- 下方的集羣名稱隨意輸入一個即可,反正以後可以隨意改。
成員角色目前無需改動,直接點擊【創建】完成嚮導。
- 完成後我們會得到導入 K3S 集羣所需的命令,請保存好第三條命令以備後用。
爲什麼不是第二條?因爲目前訪問 HTTPS API 使用的是自簽證書,直接用第二條會產生證書不信任的報錯。
- 如果你一不小心關掉了窗口,可以在首頁點擊右側的三個點,然後點擊升級,就可以看到上面的集羣導入命令。
到這一步,我們已經完成了 Rancher Server 端的準備工作。接下來,我們將着手準備部署 K3S 集羣。
Step 3: 安裝 K3S 集羣 - 國內服務器的準備工作
如果你的服務器中國大陸境內,請參考下面的步驟執行;如果你的服務器在海外,請直接跳到 Step 4。
鑑於國內拉取 AWS S3 Bucket 的速度,以及 k8s.gcr.io 被牆的無奈,我在這裏額外增加了針對中國大陸境內服務器的步驟。如果你使用的是海外的服務器,這一步你無需操作,請繼續下面的教程。
首先,我們下載 K3S 所需的 Binary 到本地服務器(或者在服務器端掛 VPN 進行下載):
https://github.com/rancher/k3s/releases/download/v0.5.0/k3s-arm64
之後上傳此 Binary 到服務器端的 /usr/local/bin/k3s,並賦予可執行屬性:
chmod +x /usr/local/bin/k3s
這一步完成後,我們來着手解決最頭疼的問題:pause 鏡像被牆無法拉取。
這個鏡像對於很多剛接觸 K8S 的用戶來講非常頭疼,我也是在這裏卡了好久最後纔算弄出來個解決方案。
出於大家的部署方便考慮,我將這份鏡像製成了多份副本並分發出來,大家可以根據自己的需求選擇最佳的解決方案。
阿里雲北京鏡像分流:
docker pull registry.cn-beijing.aliyuncs.com/ilemonrain/pause-amd64:3.1
docker tag registry.cn-beijing.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
阿里雲上海鏡像分流:
docker pull registry.cn-shanghai.aliyuncs.com/ilemonrain/pause-amd64:3.1
docker tag registry.cn-shanghai.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
阿里雲廣州鏡像分流:
docker pull registry.cn-shenzhen.aliyuncs.com/ilemonrain/pause-amd64:3.1
docker tag registry.cn-shenzhen.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
Google Mirror 分流 (Docker Hub):
docker pull mirrorgooglecontainers/pause:3.1
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
本地鏡像分流 (tar 包格式):
wget -qO- https://download.ilemonrain.com/Kubernetes/pause-amd64/pause.tar | docker load
完成鏡像導入後確認是否導入成功:
docker images | grep "k8s.gcr.io/pause"
如果出現類似於這樣的結果:
k8s.gcr.io/pause 3.1 da86e6ba6ca1 17 months ago 742kB
則說明導入成功,可以繼續接下來的步驟。
Step 4: 安裝 K3S 集羣
接下來,我們開始 K3S 集羣的部署。
官方提供了很好用的一鍵安裝腳本,我們只需要使用一鍵腳本即可完成 K3S 環境的安裝:
curl -sfL https://get.k3s.io | sh -
安裝完成後,我們需要調整下 K3S 的服務配置文件,以將 K3S 的默認容器引擎從 Containerd 切換到 Docker。
修改 K3S 服務的配置文件:
vim /etc/systemd/system/multi-user.target.wants/k3s.service
文件內容如下:
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target
[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
[Install]
WantedBy=multi-user.targe
在這裏我們需要修改 ExecStart 的值,將其修改爲:
/usr/local/bin/k3s server --docker --no-deploy traefik
之後保存退出,執行命令重新加載新的服務配置文件:
systemctl daemon-reload
完成後重啓 K3S 服務:
service k3s restart
稍等數十秒,之後通過命令確認 K3S 集羣是否就緒:
k3s kubectl get node
如果得到類似如下的結果:
NAME STATUS ROLES AGE VERSION
k3s01.ilemonrain.io Ready <none> 3m34s v1.14.1-k3s.4
則說明 K3S 集羣啓動成功。
Step 5: 導入 K3S 集羣到 Rancher
還記得在 Step 2 中保存好的導入命令麼?是時候該派上用場了。
現在的 Rancher Server 上,顯示集羣狀態爲 Pending,就像這樣:
這是因爲我們還未導入集羣,這一步我們將導入集羣,並建立 Rancher Server 與 K3S 集羣的聯繫。
在 K3S 的主控節點(一般情況下,第一個節點都是主控制器,也叫 Server 節點)上,執行命令,導入集羣:
curl --insecure -sfL https://10.248.21.2/v3/import/jr42wvdhk4w94htxxtf5hv424rsjjz6hzq9vl2lj8q9dnb8dgcwgzn.yaml | kubectl apply -f -
注意:每個集羣的導入命令都不一樣,請不要直接照搬教程中的導入命令!
之後 Shell 中會返回一下信息,說明集羣導入配置成功:
namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-7c9ef0a created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.extensions/cattle-cluster-agent created
daemonset.extensions/cattle-node-agent created
回到 Rancher 界面,稍微等數十秒,我們會發現 Pending 狀態變成了 Waiting 狀態:
出現這個提示說明 Rancher 已經收到 K3S 的註冊請求,正在完成 K3S 集羣的註冊工作,再等數十秒種的時間即可完成 K3S 集羣的導入工作:
到這裏,我們成功完成了 Rancher 2.x 和 K3S 的對接工作,可以像操作 K8S 集羣那樣操作 K3S 集羣了。
Step X: 一點小小的總結
爲什麼我會用 K3S 來取代 K8S,主要是因爲自己手裏的服務器配置不太夠,如果貿然上 K8S 的話,會導致系統資源全被 K8S 喫光,從而沒有資源再去跑其他的業務。謹以此文,希望能夠做各位運維、開發、Geeker 前行路上的指路明燈,爲大家掃清前進的障礙,加速業務容器化的遷移進程。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s?__biz=MzIyMTUwMDMyOQ==&mid=2247491899&idx=1&sn=3ed1aad7fee70ff4e97eb0d63bf952e8&chksm=e83967fddf4eeeebac76960fa018123c612b85c6a767f53ea98b9ae5b38f1b5cd137cc7bcf1f&scene=21#wechat_redirect