使用 Harbor 倉庫作為 Kubernetes 叢集私有倉庫
Harbor 倉庫資訊
- 內網地址:
hub.rainsc.com
- IP 地址:
192.168.66.100
問題背景
在許多版本的教程中,會建議在 Docker 的配置中新增忽略證書的列表。然而,截至 2024 年 8 月 24 日,這些教程支援的 Kubernetes 版本已經無法直接安裝。一方面是因為這些教程大多基於 CentOS 7,使用的是 4.4 核心,而 CentOS 相關的所有映象源都已經刪除了核心相關檔案。
當前我的核心版本是:
[root@master01 ~]# uname -a
Linux master01 5.14.0-496.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Aug 12 20:37:54 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
我直接按照當前核心支援的版本安裝了最新的 kubectl
工具:
[root@master01 ~]# kubectl version
Client Version: v1.29.8
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.8
[root@master01 ~]# kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.containerRuntimeVersion}'
containerd://1.7.20 containerd://1.7.20 containerd://1.7.20
容器執行時的變化
Kubernetes 並不直接管理容器執行時,而是透過 kubelet
與容器執行時進行互動。在不同的 Kubernetes 版本中,支援的容器執行時有所變化:
-
Kubernetes 1.20 及之前版本
- 預設容器執行時: Docker
- Docker Shim: Kubernetes 透過 Docker Shim(dockershim)與 Docker 互動。
-
Kubernetes 1.21 至 1.23
- 容器執行時: Kubernetes 1.21 開始,逐步棄用 Docker Shim,鼓勵使用其他 CRI 相容的容器執行時。
- 推薦替代容器執行時:
containerd
和CRI-O
。
-
Kubernetes 1.24 及之後版本
- 棄用 Docker Shim: Docker Shim 被正式棄用,不再支援透過 Docker Shim 與 Docker 互動。
- 推薦容器執行時:
containerd
和CRI-O
。
Harbor 部署及問題解決
在環境中,我在 192.168.66.100
上部署了 Docker 版本的 Harbor。嘗試使用以下命令建立 Pod 時遇到問題:
kubectl run nginx-deployment --image=hub.rainsc.com/library/mynginx:v1 --port=80
該操作提示證書錯誤,嘗試將 Harbor 的證書新增到受信任列表,並修改 Docker 配置檔案,但無效。
類似於下面這段 可能不完全一樣 因為已經救活了 就不去作死了
下面這個錯誤展示的是配置檔案寫錯了 但是ai會直接告訴你證書問題 相關tls之類的提示全都說證書問題 千萬別碰證書 沒有意義
[root@master01 ~]# crictl --runtime-endpoint /run/containerd/containerd.sock pull hub.rainsc.com/library/helloworld:v1
I0824 19:51:33.643312 65083 util_unix.go:103] "Using this endpoint is deprecated, please consider using full URL format" endpoint="/run/containerd/containerd.sock" URL="unix:///run/containerd/containerd.sock"
E0824 19:51:33.691725 65083 remote_image.go:171] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"hub.rainsc.com/library/helloworld:v1\": failed to resolve reference \"hub.rainsc.com/library/helloworld:v1\": failed to do request: Head \"https://hub.rainsc.com/v2/library/helloworld/manifests/v1\": tls: failed to verify certificate: x509: certificate signed by unknown authority" image="hub.rainsc.com/library/helloworld:v1"
FATA[0000] pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "hub.rainsc.com/library/helloworld:v1": failed to resolve reference "hub.rainsc.com/library/helloworld:v1": failed to do request: Head "https://hub.rainsc.com/v2/library/helloworld/manifests/v1": tls: failed to verify certificate: x509: certificate signed by unknown authority
解決方案
由於 Kubernetes 1.24 之後不再使用 Docker,而是使用 containerd
,我們需要正確配置 containerd
的 config.toml
檔案。
- 編輯
/etc/containerd/config.toml
檔案,找到[plugins."io.containerd.grpc.v1.cri".registry.auths]
配置節,新增以下內容:
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.rainsc.com".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.rainsc.com".auth]
username = "admin"
password = "Harbor12345"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."hub.rainsc.com"]
endpoint = ["http://hub.rainsc.com"]
- 編輯
/var/lib/kubelet/config.yaml
檔案,指定containerRuntimeEndpoint
:
containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
- 繫結
containerd
容器給crictl
這個檔案預設是不存在的 需要手動建立後填
echo "runtime-endpoint: unix:///run/containerd/containerd.sock" | sudo tee /etc/crictl.yaml > /dev/null
[root@node02 ~]# cat /etc/crictl.yaml
cat: /etc/crictl.yaml: 沒有那個檔案或目錄
[root@node02 ~]# echo "runtime-endpoint: unix:///run/containerd/containerd.sock" | sudo tee /etc/crictl.yaml > /dev/null
[root@node02 ~]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
- 配置完成後,使用以下命令拉取映象:
[root@master01 ~]# crictl pull hub.rainsc.com/library/helloworld:v1
Image is up to date for sha256:6974669be52b12a9103072cbad3e13fbf119b76aa09747f19a821a5eaad34be1
- 建立 Pod:
[root@master01 ~]# kubectl run helloworld --image=hub.rainsc.com/library/helloworld:v1 --port=8123
pod/helloworld created
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld 1/1 Running 0 9s
總結
透過正確配置 containerd
和 Kubernetes 配置檔案,解決了由於棄用 Docker Shim 引發的映象拉取問題。現在可以正常使用 Harbor 倉庫來建立和管理 Pod。