輕鬆上手 | 使用國內資源安裝 K3s 全攻略

Rancher 發表於 2022-11-29
作者:
王海龍,SUSE Rancher 中國社群技術經理,Linux Foundation APAC Evangelist,負責 Rancher 中國技術社群的維護和運營。擁有 8 年的雲端計算領域經驗,經歷了 OpenStack 到 Kubernetes 的技術變革,無論底層作業系統 Linux,還是虛擬化 KVM 或是 Docker 容器技術都有豐富的運維和實踐經驗。

近期,經常有小夥伴在 K3s 社群中諮詢關於使用國內資源安裝 K3s 的問題,本文將對此進行詳細介紹。

K3s 安裝和啟動流程

K3s 是一個輕量級的 Kubernetes 發行版,非常簡單易用而且輕量。只需要一個簡單的安裝指令碼即可把 K3s 安裝到主機。

以下是使用官方安裝指令碼的執行過程:

# curl -sfL https://get.k3s.io | sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.25.3+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.25.3+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.25.3+k3s1/k3s
[INFO]  Verifying binary download
...
...
[INFO]  systemd: Starting k3s

如果從國內環境安裝 K3s 可能會遇到安裝速度特別緩慢或者 time out 的情況,從以上的安裝過程可以分析出以下幾個原因:

  • K3s 的安裝指令碼  儲存在國外的伺服器,從國內環境訪問可能出現無法訪問的情況。
  • K3s 預設安裝 stable 版本,stable 對應的具體 K3s 版本是透過 https://update.k3s.io/v1-rele... 解析來的,而這個地址也是執行在一個國外的伺服器上。
  • 當透過 channel 解析出對應 K3s 的版本為:v1.25.3+k3s1,此時需要到 github 上拉取對應的 K3s 二進位制檔案。雖然這個二進位制檔案才幾十兆,但國內環境訪問 github 經常會出現無法訪問的情況。
# kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS              RESTARTS   AGE
kube-system   helm-install-traefik-crd-7k9rw            0/1     ContainerCreating   0          10m
kube-system   helm-install-traefik-8q69g                0/1     ContainerCreating   0          10m
kube-system   coredns-75fc8f8fff-hlx2w                  0/1     ContainerCreating   0          10m
kube-system   metrics-server-5c8978b444-xz6vx           0/1     ContainerCreating   0          10m
kube-system   local-path-provisioner-5b5579c644-8g2kn   0/1     ImagePullBackOff    0          10m

另外,要完整執行 K3s,還依賴一些系統的服務,這些系統服務(例如:coredns、traefik)都是以容器的方式執行;而這些系統服務依賴的系統映象預設是從 DockerHub 去拉取。同樣從國內訪問偶爾會出現無法訪問或拉取映象緩慢的情況。

以上,就是在國內環境使用 K3s 的一些痛點。

使用國內資源安裝 K3s

為了解決以上問題,K3s 社群已經將所需的 K3s 資源都同步到了國內的伺服器上,這樣我們就可以使用這些國內資源在國內環境上安裝 K3s,不但提升了安裝速度也提升了安裝的穩定性。

該站點由 K3s 社群維護,同步資源到國內伺服器有可能出現延後或遺漏情況,如發現延後或遺漏情況歡迎反饋到中文論壇

K3s 社群都同步了哪些資源到國內?

  • K3s 安裝指令碼
  • Channel 解析檔案
  • K3s 的二進位制檔案
  • K3s 依賴系統映象

接下來,再來看下應該如何運用國內的資源安裝 K3s:

# curl –sfL \
     https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | \
     INSTALL_K3S_MIRROR=cn sh -s - \
     --system-default-registry "registry.cn-hangzhou.aliyuncs.com"


[INFO]  Finding release for channel stable
[INFO]  Using v1.25.3+k3s1 as release
[INFO]  Downloading hash rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/v1.25.3-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/v1.25.3-k3s1/k3s
[INFO]  Verifying binary download
...
...
[INFO]  systemd: Starting k3s

確認系統映象是否從阿里雲映象倉庫拉取:

# kubectl get pods -n kube-system
NAME                                     READY   STATUS      RESTARTS   AGE
coredns-7c855cf8c6-x6d77                 1/1     Running     0          7m55s


# kubectl describe pods coredns-7c855cf8c6-x6d77 -n kube-system
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  7m44s  default-scheduler  Successfully assigned kube-system/coredns-7c855cf8c6-x6d77 to k3s3
  Normal  Pulling    7m40s  kubelet            Pulling image "registry.cn-hangzhou.aliyuncs.com/rancher/mirrored-coredns-coredns:1.9.1"
  Normal  Pulled     7m6s   kubelet            Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/rancher/mirrored-coredns-coredns:1.9.1" in 34.050826086s
  Normal  Created    7m6s   kubelet            Created container coredns
  Normal  Started    7m6s   kubelet            Started container coredns

首先,安裝 K3s 使用的是儲存在阿里雲物件儲存上的 K3s 安裝指令碼,並且使用儲存在國內 channel 去解析對應的 K3s 版本。

其次,透過 INSTALL_K3S_MIRROR=cn 環境變數來指定 K3s 的二進位制檔案從國內的阿里雲物件儲存上去拉取。

最後,透過 --system-default-registry 引數來指定 K3s 的系統映象從國內的阿里雲映象倉庫(registry.cn-hangzhou.aliyuncs.com) 去拉取。

如果你的頻寬充足,一分鐘之內即可完成 K3s 的安裝和系統服務的啟動。

K3s 配置 Mirror

以上這些步驟只是為了加速 K3s 的安裝和啟動。啟動 K3s 後你可能會在 K3s 上部署自己的業務(例如 nginx),而這些映象預設也是從 DockerHub 拉取。如果使用 docker 容器執行時,你可能會在 docker 上配置 mirror 來加速映象的拉取。

K3s 預設使用的 containerd 容器執行時。而且,可以透過 K3s 的引數來設定 containerd 的 mirror,設定方式如下:

cat >> /etc/rancher/k3s/registries.yaml <<EOFmirrors:  "docker.io":    endpoint:      - "https://docker.mirrors.ustc.edu.cn" # 可根據需求替換 mirror 站點      - "https://registry-1.docker.io"EOFsystemctl restart k3s

經過以上配置後,透過 K3s 拉取的映象如果在配置的 mirror 站點中存在,那麼將會從該站點拉取映象。如果不存在,將會從預設的 docker.io 中拉取映象。

如果你想確認 containerd 的 mirror 是否生效,你可以使用 crictl info 檢查:

# crictl info
    "registry": {
      "configPath": "",
      "mirrors": {
        "docker.io": {
          "endpoint": [
            "https://docker.mirrors.ustc.edu.cn",
            "https://registry-1.docker.io"
          ],
          "rewrite": null
        }
      },

透過 Rancher Manager 建立 K3s 叢集

從 Rancher v2.6 開始,支援從 Rancher Manager 建立 K3s 叢集。透過 Rancher Manager 建立 K3s 叢集和預設的 K3s 叢集安裝有所不同,前者建立叢集主要依賴一些映象完成,這些映象預設是從 DockerHub 拉取。

同樣,可以在 Rancher Manager 修改建立 K3s 叢集的引數來完成使用國內資源安裝 K3s 叢集。只需要在建立 K3s 叢集時導航到 Registries,選擇 Pull images for Rancher from a private registry 並設定 Registry hostname for Rancher images 的值為阿里雲映象倉庫的地址 "registry.cn-hangzhou.aliyuncs.com" 即可,如下圖:

輕鬆上手 | 使用國內資源安裝 K3s 全攻略

後 記

透過以上方式安裝 K3s 基本能滿足國內環境使用 K3s 的各種需求,而且安裝和啟動速度也更快。

如果使用以上方式安裝 K3s 出現問題或疑問,或者有其他需求,歡迎大家透過中文論壇進行反饋。