一文搞定全場景K3s離線安裝

作者簡介

王海龍,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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章