作者簡介
王海龍,Rancher中國社群技術經理,負責Rancher中國技術社群的維護和運營。擁有6年的雲端計算領域經驗,經歷了OpenStack到Kubernetes的技術變革,無論底層作業系統Linux,還是虛擬化KVM或是Docker容器技術都有豐富的運維和實踐經驗。
前 言
K3s 是一個輕量級的 Kubernetes 發行版,在 2020 年統計的 K3s 下載量中,K3s 的全球下載量已經超過 100 萬次,每週平均被安裝超過 2 萬次,其中 30%的下載量來自於中國。在國內已經有許多使用者將 K3s 應用到了各種邊緣計算和物聯網裝置中,同時也被廣泛應用於智慧工廠部署的生產線機器人和一些世界上最大型的風力發電廠當中。
針對生產環境下的 K3s,一個不可逾越的問題就是離線安裝。在你的離線環境需要準備以下 3 個元件:
-
K3s 的安裝指令碼
-
K3s 的二進位制檔案
-
K3s 依賴的映象
以上三個元件都可以通過K3s Release頁面(https://github.com/k3s-io/k3s/releases )下載,如果在國內使用,推薦從 http://mirror.cnrancher.com 獲得這些元件。
筆者認為離線安裝的重點在於K3s 依賴的映象部分,因為 K3s 的"安裝指令碼"和"二進位制檔案"只需要下載到對應目錄,然後賦予相應的許可權即可,非常簡單。但K3s 依賴的映象的安裝方式取決於你使用的是手動部署映象還是私有映象倉庫,也取決於容器執行時使用的是containerd還是docker。
針對不同的組合形式,可以分為以下幾種形式來實現離線安裝:
-
Containerd + 手動部署映象方式
-
Docker + 手動部署映象方式
-
Containerd + 私有映象倉庫方式
-
Docker + 私有映象倉庫方式
Containerd + 手動部署映象方式
假設你已經將同一版本的 K3s 的安裝指令碼(k3s-install.sh)、K3s 的二進位制檔案(k3s)、K3s 依賴的映象(k3s-airgap-images-amd64.tar)下載到了/root目錄下。
如果你使用的容器執行時為containerd
,在啟動 K3s 時,它會檢查/var/lib/rancher/k3s/agent/images/
是否存在可用的映象壓縮包,如果存在,就將該映象匯入到containerd
映象列表中。所以我們只需要下載 K3s 依賴的映象到/var/lib/rancher/k3s/agent/images/
目錄,然後啟動 K3s 即可。
1、匯入映象到 containerd 映象列表
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp /root/k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
2、將 K3s 安裝指令碼和 K3s 二進位制檔案移動到對應目錄並授予可執行許可權
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
3、安裝 K3s
INSTALL_K3S_SKIP_DOWNLOAD=true /root/k3s-install.sh
稍等片刻,即可檢視到 K3s 已經成功啟動:
root@k3s-docker:~# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/coredns-coredns 1.8.0 296a6d5035e2d 42.6MB
docker.io/rancher/klipper-helm v0.3.2 4be09ab862d40 146MB
docker.io/rancher/klipper-lb v0.1.2 897ce3c5fc8ff 6.46MB
docker.io/rancher/library-busybox 1.31.1 1c35c44120825 1.44MB
docker.io/rancher/library-traefik 1.7.19 aa764f7db3051 86.6MB
docker.io/rancher/local-path-provisioner v0.0.14 e422121c9c5f9 42MB
docker.io/rancher/metrics-server v0.3.6 9dd718864ce61 41.2MB
docker.io/rancher/pause 3.1 da86e6ba6ca19 746kB
root@k3s-docker:~# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-7c458769fb-zdg9z 1/1 Running 0 38s
kube-system coredns-854c77959c-696gk 1/1 Running 0 38s
kube-system metrics-server-86cbb8457f-hs6vw 1/1 Running 0 38s
kube-system helm-install-traefik-4pgcr 0/1 Completed 0 38s
kube-system svclb-traefik-bq7wl 2/2 Running 0 17s
kube-system traefik-6f9cbd9bd4-jccd7 1/1 Running 0 17s
Docker + 手動部署映象方式
假設你已經將同一版本的 K3s 的安裝指令碼(k3s-install.sh)、K3s 的二進位制檔案(k3s)、K3s 依賴的映象(k3s-airgap-images-amd64.tar)下載到了/root目錄下。
與 containerd 不同,使用 docker 作為容器執行時,啟動 K3s 不會匯入/var/lib/rancher/k3s/agent/images/目錄下的映象。所以在啟動 K3s 之前我們需要將 K3s 依賴的映象手動匯入到 docker 映象列表中。
1、匯入映象到 docker 映象列表
sudo docker load -i /root/k3s-airgap-images-amd64.tar
2、將 K3s 安裝指令碼和 K3s 二進位制檔案移動到對應目錄並授予可執行許可權
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
3、安裝 K3s
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='--docker' /root/k3s-install.sh
稍等片刻,即可檢視到 K3s 已經成功啟動:
root@k3s-docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rancher/klipper-helm v0.3.2 4be09ab862d4 7 weeks ago 145MB
rancher/coredns-coredns 1.8.0 296a6d5035e2 2 months ago 42.5MB
rancher/library-busybox 1.31.1 1c35c4412082 7 months ago 1.22MB
rancher/local-path-provisioner v0.0.14 e422121c9c5f 7 months ago 41.7MB
rancher/library-traefik 1.7.19 aa764f7db305 14 months ago 85.7MB
rancher/metrics-server v0.3.6 9dd718864ce6 14 months ago 39.9MB
rancher/klipper-lb v0.1.2 897ce3c5fc8f 19 months ago 6.1MB
rancher/pause 3.1 da86e6ba6ca1 3 years ago 742kB
root@k3s-docker:~# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system metrics-server-86cbb8457f-8ckr6 1/1 Running 0 30s
kube-system local-path-provisioner-7c458769fb-vhkjr 1/1 Running 0 30s
kube-system helm-install-traefik-4b46c 0/1 Completed 0 31s
kube-system coredns-854c77959c-4ql8t 1/1 Running 0 30s
kube-system svclb-traefik-kbtbx 2/2 Running 0 27s
kube-system traefik-6f9cbd9bd4-rbm6k 1/1 Running 0 27s
Containerd + 私有映象倉庫方式
假設你已經將同一版本的 K3s 的安裝指令碼(k3s-install.sh)、K3s 的二進位制檔案(k3s)下載到了/root目錄下。並且 K3s 所需要的映象已經上傳到了映象倉庫(本例的映象倉庫地址為:http://192.168.64.44:5000)。K3s 所需的映象列表可以從 K3s Release頁面的k3s-images.txt獲得。
1、配置 K3s 映象倉庫
啟動 K3s 預設會從docker.io拉取映象。使用containerd容器執行時在離線安裝時,我們只需要將映象倉庫地址配置到docker.io下的endpoint即可,更多配置說明請參考配置 containerd 映象倉庫完全攻略或K3s 官方文件:
https://docs.rancher.cn/docs/k3s/installation/private-registry/_index/
sudo mkdir -p /etc/rancher/k3s
sudo cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"docker.io":
endpoint:
- "http://192.168.64.44:5000"
- "https://registry-1.docker.io"
EOF
2、將 K3s 安裝指令碼和 K3s 二進位制檔案移動到對應目錄並授予可執行許可權
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
3、安裝 K3s
INSTALL_K3S_SKIP_DOWNLOAD=true /root/k3s-install.sh
稍等片刻,即可檢視到 K3s 已經成功啟動:
root@k3s-containerd:~# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/coredns-coredns 1.8.0 296a6d5035e2d 12.9MB
docker.io/rancher/klipper-helm v0.3.2 4be09ab862d40 50.7MB
docker.io/rancher/klipper-lb v0.1.2 897ce3c5fc8ff 2.71MB
docker.io/rancher/library-traefik 1.7.19 aa764f7db3051 24MB
docker.io/rancher/local-path-provisioner v0.0.14 e422121c9c5f9 13.4MB
docker.io/rancher/metrics-server v0.3.6 9dd718864ce61 10.5MB
docker.io/rancher/pause 3.1 da86e6ba6ca19 326kB
root@k3s-containerd:~# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-7c458769fb-7w8hb 1/1 Running 0 37s
kube-system coredns-854c77959c-f8m2n 1/1 Running 0 37s
kube-system helm-install-traefik-9lbrx 0/1 Completed 0 38s
kube-system svclb-traefik-x8f6f 2/2 Running 0 29s
kube-system metrics-server-86cbb8457f-f7lb7 1/1 Running 0 37s
kube-system traefik-6f9cbd9bd4-4s66r 1/1 Running 0 29s
Docker + 私有映象倉庫方式
假設你已經將同一版本的 K3s 的安裝指令碼(k3s-install.sh)、K3s 的二進位制檔案(k3s)下載到了/root目錄下。並且 K3s 所需要的映象已經上傳到了映象倉庫(本例的映象倉庫地址為:http://192.168.64.44:5000)。K3s 所需的映象列表可以從 K3s Release頁面的k3s-images.txt獲得。
1、配置 K3s 映象倉庫
Docker 不支援像 containerd 那樣可以通過修改 docker.io 對應的 endpoint(預設為 https://registry-1.docker.io)來間接修改預設映象倉庫的地址。但在Docker中可以通過配置registry-mirrors
來實現從其他映象倉庫中獲取K3s映象。這樣配置之後,會先從registry-mirrors
配置的地址拉取映象,如果獲取不到才會從預設的docker.io
獲取映象,從而滿足了我們的需求。
cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["http://192.168.64.44:5000"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、將 K3s 安裝指令碼和 K3s 二進位制檔案移動到對應目錄並授予可執行許可權
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
3、安裝 K3s
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='--docker' /root/k3s-install.sh
稍等片刻,即可檢視到 K3s 已經成功啟動:
root@k3s-docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rancher/klipper-helm v0.3.2 4be09ab862d4 7 weeks ago 145MB
rancher/coredns-coredns 1.8.0 296a6d5035e2 2 months ago 42.5MB
rancher/local-path-provisioner v0.0.14 e422121c9c5f 7 months ago 41.7MB
rancher/library-traefik 1.7.19 aa764f7db305 14 months ago 85.7MB
rancher/metrics-server v0.3.6 9dd718864ce6 14 months ago 39.9MB
rancher/klipper-lb v0.1.2 897ce3c5fc8f 19 months ago 6.1MB
rancher/pause 3.1 da86e6ba6ca1 3 years ago 742kB
root@k3s-docker:~# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system helm-install-traefik-bcclh 0/1 Completed 0 33s
kube-system coredns-854c77959c-kp85f 1/1 Running 0 33s
kube-system metrics-server-86cbb8457f-85fpd 1/1 Running 0 33s
kube-system local-path-provisioner-7c458769fb-r5nkw 1/1 Running 0 33s
kube-system svclb-traefik-rbmhk 2/2 Running 0 24s
kube-system traefik-6f9cbd9bd4-k6t9n 1/1 Running 0 24s
後 記
手動部署映象方式比較適合小規模安裝、節點數量不多的場景。私有映象倉庫比較適合規模比較大節點數比較多的叢集。本文的docker registry採用的是最簡單的搭建方式docker run -d -p 5000:5000 --restart=always --name registry registry:2
,可能在你的環境中由於映象倉庫的搭建方式不同,你可能需要修改一些關於registry的引數。
參考資料
K3s離線安裝文件:
https://docs.rancher.cn/docs/k3s/installation/airgap/_index/