天天看點

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程

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-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           

然後等待幾分鐘,喝杯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} "${@}""
               
  • 确認修改成功後,使用

    exit

    指令退出容器的Bash Shell,之後執行指令重新啟動Rancher Server容器:
    docker restart 31aa94998b75
               
  • 之後使用新的端口通路Rancher Server的UI(下面的連接配接為例子):

    通路會提示SSL證書無效,無視錯誤繼續即可。

https://rancher.example.com:9443/
你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 此時我們會來到Rancher的初始化部署頁面,在此頁面輸入預設的全局管理者密碼,建立全局管理者賬戶。
你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 這一步輸入我們的Rancher API Endpoint,注意這裡輸入的URL一定要保證整個叢集内的所有節點都可以正常連接配接。
你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 之後我們會來到主界面,如果對英文操作看着頭疼的話,右下角可以切換語言。

    具體方法是點選右下角的 English ,然後下拉選擇 簡體中文(zh-hans) 即可。

漢化設定會跟随你的Cookies走,是以不換電腦或者不重裝系統的話應該不會自動換回英語。

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 我們接下來在Rancher中建立一個新的叢集,點選頁面上的 建立叢集 按鈕,開始建立一個新的K8S/K3S叢集。

    注意:在這裡請選擇 導入現有的Kubernetes叢集 (Import) ,而不是其他的建立選項!

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 下方的叢集名稱随意輸入一個即可,反正以後可以随意改。

    成員角色目前無需改動,直接點選 建立 完成向導。

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 完成後我們會得到導入K3S叢集所需的指令,請儲存好第三條指令以備後用。

    為什麼不是第二條?因為目前通路HTTPS API使用的是自簽證書,直接用第二條會産生證書不信任的報錯。

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程
  • 如果你一不小心關掉了視窗,可以在首頁點選右側的三個點,然後點選更新,就可以看到上面的叢集導入指令。
你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程

到這一步,我們已經完成了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,就像這樣:

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程

這是因為我們還未導入叢集,這一步我們将導入叢集,并建立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狀态:

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + K3S內建部署過程

出現這個提示說明Rancher已經收到K3S的注冊請求,正在完成K3S叢集的注冊工作,再等數十秒種的時間即可完成K3S叢集的導入工作:

你的第一次輕量級K8S體驗 —— 記一次Rancher 2.2 + 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/ilemonrain

Telegram Chatbot:

https://t.me/ilemonrain_chatbot

繼續閱讀