Step by Step!Rancher 2-2-K3s 集成部署實踐教程

作者:iLemonrain

https://blog.ilemonrain.com/docker/rancher-with-k3s.html

在生產環境中,很多時候我們都會有這樣的需求:

在我接觸 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 的輕量版,但也不能無視配置要求。官方配置要求如下:

相對於 K8S 那種性能殺手,K3S 可以輕量到部署在大多數虛擬機上(比如常見的 1C512M,不過如果部署在生產環境,建議 1C2G 及以上以保證穩定性)。如果你還要再同一臺 Server 上同時跑 Rancher 2.x Server 的話,我建議最低配置要求如下:

雖然 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 鏡像加速器的服務商很多,這裏我們以阿里雲的鏡像加速服務爲例:

如果報錯誤 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 反代),只需要按照以下步驟操作:

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片

到這一步,我們已經完成了 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==&amp;mid=2247491899&amp;idx=1&amp;sn=3ed1aad7fee70ff4e97eb0d63bf952e8&amp;chksm=e83967fddf4eeeebac76960fa018123c612b85c6a767f53ea98b9ae5b38f1b5cd137cc7bcf1f&amp;scene=21#wechat_redirect