i> 此文章為 Rancher+K3S 部署指南 系列中的一篇文章, 更多教程請點選 >> 在生産環境中,很多時候我們都會有這樣的需求:
- 業務彈性需求較大,反複安裝解除安裝修改配置檔案會對環境造成極大破壞,甚至需要重裝系統以清理環境
- 将業務遷移到Docker架構,但使用傳統的Docker CLI (Docker指令行) 方式進行管理,效率低下還容易誤操作
- 将業務遷移到K8S架構,但因為K8S過于占用系統資源,往往在開發環境或者小型的生産環境,K8S剛跑起來系統就沒可用性能資源了
- K8S手動部署起來一路盡是無底深坑,好不容易配好了稍稍改動下配置檔案整個叢集全炸了
- 需要個簡單直覺管理工具,能夠簡單快速的管理各個K8S叢集,靈活建立Pod
在我接觸K8S架構之初,也遇到了類似的問題:使用Rancher2+K8S這樣的架構,在一台1C2G的阿裡雲上面部署,部署完成後發現系統記憶體早就被吃的一幹二淨,無從談起業務部署;使用傳統的Docker Swarm,感覺用起來沒有K8S那樣順手舒服。
2019年2月26日,業界領先的容器管理軟體提供商Rancher Labs(以下簡稱Rancher)宣布推出輕量級Kubernetes發行版
K3S。這對于一些小型的開發/生産環境、邊緣計算節點甚至性能極其有限的裝置(比如樹莓派3)來講無疑是福音。
但問題來了,K3S相對于K8S,精簡了不少功能。那麼如何正确的對接Rancher 2和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的話,我給出的建議最低配置要求如下:
- 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。具體的原因我會在下文講到。
i> 本文以 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視窗中即可完成鏡像源的更換。
i> 如果報錯誤 sudo: command not found ,隻需要去掉每行指令中的sudo即可 (前提是你的目前登入使用者為root)
Step 2: 安裝Rancher Server
i> 此部分你也可以參考官方教程:
https://www.cnrancher.com/quick-startRancher 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
然後等待幾分鐘,喝杯82年的雪碧壓壓驚(劃掉),之後通路你的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} "${@}""
- 确認修改成功後,使用
指令退出容器的Bash Shell,之後執行指令重新啟動Rancher Server容器:exit
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到本地伺服器(或者在伺服器端挂V*P*N進行下載下傳):
https://github.com/rancher/k3s/releases/download/v0.5.0/k3s-arm64
之後上傳此Binary到伺服器端的
/usr/local/bin/k3s
,并賦予可執行屬性:
chmod +x /usr/local/bin/k3s
這一步完成後,我們來着手解決最頭疼的問題:pause-amd64 鏡像被牆無法拉取。
這個鏡像對于很多剛接觸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-amd64: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-amd64: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-amd64: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叢集啟動成功。
i> 此教程目前隻做單機K3S叢集的部署講解,後續教程會講如何組建多機K3S叢集,以及通過一個Rancher控制多個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: 一點小小的總結
整個Rancher+K3S過程中最大的難點在于國内伺服器因Google Container Platform被牆導緻K3S初始化叢集卡在了第一步,這個希望Rancher Labs在後續的版本中能夠改進拉取鏡像的動作吧,因為對于初接觸K8S/K3S的使用者來講,這一步足夠勸退新人的。
同時為什麼我會用K3S來取代K8S,主要是因為自己手裡的伺服器配置不太夠,如果貿然上K8S的話,會導緻系統資源全被K8S吃光,進而沒有資源再去跑其他的業務。謹以此文,希望能夠做各位運維、開發、Geeker前行路上的指路明燈,為大家掃清前進的障礙,加速業務容器化的遷移程序。
本文章歡迎各大平台轉載使用,但請注明出處。
我的聯系方式:
站務相關E-mail: [email protected]
工作生活相關E-mail: [email protected]
Telegram:
https://t.me/ilemonrainTelegram Chatbot:
https://t.me/ilemonrain_chatbot