您可以將外部容器登錄與 Tanzu Kubernetes 叢集網繭搭配使用。這是使用內嵌式 Harbor 登錄 的替代方法。

外部私人登錄使用案例

容器登錄為 Kubernetes 部署提供重要功能,可做為儲存和共用容器映像的集中式存放庫。最常用的公用容器登錄是 DockerHub。有許多私人容器登錄供應。VMware Harbor 是一個開放原始碼雲端原生私人容器登錄。vSphere with Tanzu 會內嵌 Harbor 執行個體,您可以將該執行個體用作 vSphere 網繭 以及在 Tanzu Kubernetes 叢集上執行的網繭的私人容器登錄。如需詳細資訊,請參閱 在 Harbor 登錄上啟用內嵌式主管叢集

隨附於 vSphere with Tanzu 的內嵌式 Harbor 登錄 需要 NSX-T 網路。如果您正使用 vSphere 網路,則無法使用該網路。此外,您可能已在執行自己的私人容器登錄,以將其與 Tanzu Kubernetes 叢集整合。在此情況下,您可以將 Tanzu Kubernetes Grid 服務 設定為信任具有自我簽署憑證的私人登錄,從而允許 Tanzu Kubernetes 叢集上所執行的 Kubernetes 網繭使用外部登錄。

外部私人登錄需求

若要將外部私人登錄與 Tanzu Kubernetes 叢集搭配使用,您必須使用 vSphere with Tanzu 7 U2 版或更新版本。

您僅能將自己的私人登錄用於 Tanzu Kubernetes 叢集和 Tanzu Kubernetes 版本 節點虛擬機器上執行的 Kubernetes 網繭。您無法將自己的私人登錄用於 ESXi 主機上原生執行的 vSphere 網繭vSphere 網繭 支援的登錄是內嵌於 vSphere with Tanzu 平台的 Harbor 登錄

一旦為私人登錄設定 Tanzu Kubernetes Grid 服務,任何已佈建的新叢集都將支援私人登錄。若要讓現有叢集支援私人登錄,需要輪流更新才能套用 TkgServiceConfiguration。請參閱更新 Tanzu Kubernetes 叢集。此外,當您第一次建立自訂 TkgServiceConfiguration 時,系統會起始輪流更新。

外部私人登錄組態

若要將您自己的私人登錄用於 Tanzu Kubernetes 叢集,可以使用一或多個自我簽署憑證設定 Tanzu Kubernetes Grid 服務,以透過 HTTPS 提供私人登錄內容。

會更新 TkgServiceConfiguration 以支援用於私人登錄的自我簽署憑證。具體來說,會新增 additionalTrustedCAs 欄位的 trust 區段,允許您定義 Tanzu Kubernetes 叢集應信任的任何數目的自我簽署憑證。此功能可讓您輕鬆定義憑證清單,並可以在需要輪替時更新這些憑證。

一旦更新並套用 TkgServiceConfiguration,將在下一次建立叢集時將 TLS 憑證套用至新叢集。換句話說,將更新套用至 TkgServiceConfiguration.trust.additionalTrustedCAs 不會觸發自動輪流更新 Tanzu Kubernetes 叢集。

apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TkgServiceConfiguration
metadata:
  name: tkg-service-configuration
spec:
  defaultCNI: antrea
  trust:
    additionalTrustedCAs:
      - name: first-cert-name
        data: base64-encoded string of a PEM encoded public cert 1
      - name: second-cert-name
        data: base64-encoded string of a PEM encoded public cert 2
若要套用更新,請執行下列命令。
kubectl apply -f tkgserviceconfiguration.yaml

由於 Tanzu Kubernetes Grid 服務 規格正使用私人登錄憑證進行更新,因此,無需按照將內嵌式 Harbor 登錄Tanzu Kubernetes 叢集一起使用時相同的操作將公開金鑰新增至 Tanzu Kubernetes 叢集 kubeconfig。

設定 Tanzu Kubernetes 工作負載,以從私人容器登錄提取映像

若要針對 Tanzu Kubernetes 叢集工作負載從私人容器登錄提取映像,請使用私人登錄詳細資料設定工作負載 YAML。

此程序可用來從私人容器登錄或內嵌式 Harbor 登錄 提取映像。在此範例中,我們建立了網繭規格,此規格將使用儲存在內嵌式 Harbor 登錄 中的映像並利用先前設定的映像提取密碼。
  1. 使用有關私人登錄的詳細資料建立範例網繭規格。
    apiVersion: v1
    kind: Pod
    metadata:
      name: <workload-name>
      namespace: <kubernetes-namespace>
    spec:
      containers:
      - name: private-reg-container
        image: <Registry-IP-Address>/<vsphere-namespace>/<image-name>:<version>
      imagePullSecrets:
      - name: <registry-secret-name>
    • <workload-name> 取代為網繭工作負載的名稱。
    • <kubernetes-namespace> 取代為將要建立網繭之叢集中的 Kubernetes 命名空間。這必須是 Tanzu Kubernetes 叢集中儲存登錄服務映像提取密碼的相同 Kubernetes 命名空間 (例如預設命名空間)。
    • <Registry-IP-Address> 取代為在 主管叢集 上執行的內嵌式 Harbor 登錄 執行個體的 IP 位址。
    • <vsphere-namespace> 取代為佈建目標 Tanzu KubernetesvSphere 命名空間
    • <image-name> 取代為您選擇的映像名稱。
    • <version> 取代為適當版本的映像,例如「最新版本」。
    • <registry-secret-name> 取代為您先前建立之登錄服務映像提取密碼的名稱。
  2. 根據您定義的網繭規格,在 Tanzu Kubernetes 叢集中建立工作負載。
    kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>

    應從提取自登錄的映像建立網繭。

外部私人登錄的信任欄位

將憑證項目 (PEM 編碼公用憑證的 Base64 編碼字串) 新增至 TkgServiceConfiguration 中的 additionalTrustedCAs 區段。資料是以純文字形式儲存在 TkgServiceConfiguration 中的公用憑證。

表 1. 私人登錄的信任欄位
欄位 說明
trust 區段標記。不接受任何資料。
additionalTrustedCAs 區段標記。包括具有名稱和資料的憑證陣列。
name TLS 憑證的名稱。
data PEM 編碼公用憑證的 Base64 編碼字串。

移除外部私人登錄憑證

TkgServiceConfiguration 中的 additionalTrustedCAs 區段中的憑證清單移除憑證,並將 TkgServiceConfiguration 套用至 Tanzu Kubernetes Grid 服務

輪流使用外部私人登錄憑證

若要輪流使用憑證,VI 管理員或 DevOps 工程師會變更 TkgServiceConfigurationTanzu Kubernetes 叢集規格中憑證的內容,並套用該組態來觸發該 TKC 的輪流更新。

外部私人登錄憑證疑難排解

如果您設定 Tanzu Kubernetes Grid 服務 的要信任的憑證,並且將自我簽署憑證新增到叢集 kubeconfig,您應該可以成功從使用該自我簽署憑證的私人登錄提取容器映像。

下列命令可協助判斷是否已成功提取網繭工作負載的容器映像:

kubectl describe pod PODNAME

此命令會顯示指定網繭的詳細狀態和錯誤訊息。新增自訂憑證至叢集之前嘗試提取映像的範例:

Events:
  Type     Reason                        Age               From               Message
  ----     ------                        ----              ----               -------
  Normal   Scheduled                     33s               default-scheduler  ...
  Normal   Image                         32s               image-controller   ...
  Normal   Image                         15s               image-controller   ...
  Normal   SuccessfulRealizeNSXResource  7s (x4 over 31s)  nsx-container-ncp  ...
  Normal   Pulling                       7s                kubelet            Waiting test-gc-e2e-demo-ns/testimage-8862e32f68d66f727d1baf13f7eddef5a5e64bbd-v10612
  Warning  Failed                        4s                kubelet            failed to get images: ... Error: ... x509: certificate signed by unknown authority
此外,執行下列命令時:
kubectl get pods
ErrImagePull 錯誤也會顯示在整體網繭狀態視圖中:
NAME                                         READY   STATUS         RESTARTS   AGE
testimage-nginx-deployment-89d4fcff8-2d9pz   0/1     Pending        0          17s
testimage-nginx-deployment-89d4fcff8-7kp9d   0/1     ErrImagePull   0          79s
testimage-nginx-deployment-89d4fcff8-7mpkj   0/1     Pending        0          21s
testimage-nginx-deployment-89d4fcff8-fszth   0/1     ErrImagePull   0          50s
testimage-nginx-deployment-89d4fcff8-sjnjw   0/1     ErrImagePull   0          48s
testimage-nginx-deployment-89d4fcff8-xr5kg   0/1     ErrImagePull   0          79s
錯誤「x509:由未知授權機構簽署的憑證」和「ErrImagePull」指示,未使用正確的憑證將設定叢集以連線至私人容器登錄。憑證遺失或設定錯誤。

如果在設定憑證後,在連線私人登錄時遇到錯誤,您可以檢查組態中所套用的憑證是否已套用至該叢集。您可以檢查是否已使用 SSH 正確套用組態中已套用的憑證。

可進行兩個調查步驟,方法為透過 SSH 連線至 worker 節點。
  1. 檢查資料夾 /etc/ssl/certs/ 中名為 tkg-<cert_name>.pem 的檔案,其中 <cert_name> 是新增到 TkgServiceConfiguration 的憑證的「name」內容。如果憑證符合 TkgServiceConfiguration 中的內容,且使用私人登錄仍無法執行,請完成下一個步驟來進一步診斷。
  2. 執行命令 openssl s_client -connect hostname:port_num,以使用自我簽署憑證對目標伺服器執行下列 openssl 連線測試,其中 hostname 是使用自我簽署憑證之私人登錄的主機名稱/DNS 名稱,而 port_num 是服務執行所在的連接埠號碼 (通常針對 HTTPS 為 443)。您可以準確檢查在嘗試連線至使用自我簽署憑證的端點時 openssl 所傳回的錯誤,並解決來自該處的情況,例如,將正確的憑證新增至 TkgServiceConfiguration。如果 Tanzu Kubernetes 叢集內嵌了錯誤憑證,您必須使用正確的憑證更新 Tanzu Kubernetes Grid 服務 組態,刪除 Tanzu Kubernetes 叢集,然後使用包含正確憑證的組態重新建立它。