可以对 Tanzu Kubernetes 集群 pod 使用外部容器注册表。这可以替代使用嵌入式 Harbor 注册表

外部私人注册表用例

容器注册表为 Kubernetes 部署提供了一项关键功能,可用作存储和共享容器映像的集中式存储库。最常用的公共容器注册表是 DockerHub。有许多私有容器注册表产品。VMware Harbor 是一个开源、云原生、专用容器注册表。vSphere with Tanzu 中嵌入了 Harbor 的实例,可以将其用作 vSphere Pod 和在 Tanzu Kubernetes 集群上运行的 pod 的专用容器注册表。有关详细信息,请参见在主管集群上启用嵌入式 Harbor 注册表

vSphere with Tanzu 提供的嵌入式 Harbor 注册表 需要使用 NSX-T 网络连接。如果使用的是 vSphere 网络连接,则无法使用该注册表。此外,您可能已经在运行自己的专用容器注册表,并希望将其与 Tanzu Kubernetes 集群集成。在这种情况下,可以将 Tanzu Kubernetes Grid 服务 配置为信任具有自签名证书的专用注册表,从而允许在 Tanzu Kubernetes 集群上运行的 Kubernetes pod 使用外部注册表。

外部专用注册表要求

要将外部专用注册表用于 Tanzu Kubernetes 集群,必须使用 vSphere with Tanzu 7 U2 或更高版本。

只能将自己的专用注册表用于在 Tanzu Kubernetes 集群和 Tanzu Kubernetes 版本 节点虚拟机上运行的 Kubernetes pod。无法将自己的专用注册表用于在 ESXi 主机上本机运行的 vSphere PodvSphere Pod 支持的注册表是嵌入在 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 服务 规范将使用专用注册表证书进行更新,因此不需要像对 Tanzu Kubernetes 集群使用嵌入式 Harbor 注册表 时那样将公钥添加到 Tanzu Kubernetes 集群 kubeconfig。

配置 Tanzu Kubernetes 工作负载以从专用容器注册表提取映像

要从专用容器注册表提取用于 Tanzu Kubernetes 集群工作负载的映像,请使用专用注册表详细信息配置工作负载 YAML。

此过程可用于从专用容器注册表或嵌入式 Harbor 注册表 提取映像。在本示例中,我们将创建一个 Pod 规范,该规范将使用存储在嵌入式 Harbor 注册表 中的映像,并利用之前配置的映像提取密钥。
  1. 使用有关专用注册表的详细信息创建示例 Pod 规范。
    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> 替换为 pod 工作负载的名称。
    • <kubernetes-namespace> 替换为将在其中创建 Pod 的集群中的 Kubernetes 命名空间。此命名空间必须是 Tanzu Kubernetes 集群中存储了注册表服务映像提取密钥的 Kubernetes 命名空间(如默认命名空间)。
    • <Registry-IP-Address> 替换为在 主管集群 上运行的嵌入式 Harbor 注册表 实例的 IP 地址。
    • <vsphere-namespace> 替换为置备了目标 Tanzu KubernetesvSphere 命名空间
    • <image-name> 替换为您选择的映像名称。
    • <version> 替换为相应的映像版本,例如“最新版本”。
    • <registry-secret-name> 替换为您之前创建的注册表服务映像提取密钥的名称。
  2. 根据您定义的 Pod 规范在 Tanzu Kubernetes 集群中创建工作负载。
    kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>

    应使用从注册表中提取的映像创建 Pod。

外部专用注册表的 Trust 字段

将证书条目(PEM 编码的公共证书的 base64 编码字符串)添加到 TkgServiceConfiguration 中的 additionalTrustedCAs 部分。数据是在 TkgServiceConfiguration 中以纯文本格式存储的公共证书。

表 1. 专用注册表的 Trust 字段
字段 描述
trust 部分标记。不接受任何数据。
additionalTrustedCAs 部分标记。包括一系列证书,以及每个证书的名称和数据。
name TLS 证书的名称。
data PEM 编码的公共证书的 base64 编码字符串。

移除外部专用注册表证书

TkgServiceConfigurationadditionalTrustedCAs 部分中的证书列表中移除证书,并将 TkgServiceConfiguration 应用于 Tanzu Kubernetes Grid 服务

正在轮换外部私人注册表证书

要轮换证书,VI 管理员或 DevOps 工程师将更改 TkgServiceConfigurationTanzu Kubernetes 集群规范中的证书内容,并应用该配置以触发该 TKC 的滚动更新。

外部私人注册证书故障排除

如果为 Tanzu Kubernetes Grid 服务 配置了要信任的证书,并将自签名证书添加到集群 kubeconfig,则应该能够从使用该自签名证书的专用注册表中成功提取容器映像。

以下命令可帮助您确定是否为 Pod 工作负载成功提取了容器映像:

kubectl describe pod PODNAME

此命令显示给定 pod 的详细状态和错误消息。尝试在将自定义证书添加集群之前提取映像的示例:

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
整个 Pod 状态视图中也会显示 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: 证书由未知机构签名 (x509: certificate signed by unknown authority)”和“ErrImagePull”错误指示集群未配置正确的证书,无法连接到专用容器注册表。证书缺失或配置错误。

如果在配置证书后连接到专用注册表时遇到错误,可以检查配置中应用的证书是否应用于集群。可以使用 SSH 检查是否正确应用了配置中应用的证书。

可以通过 SSH 连接到工作节点,执行两个调查步骤。
  1. 检查文件夹 /etc/ssl/certs/ 中名为 tkg-<cert_name>.pem 的文件,其中,<cert_name>TkgServiceConfiguration 中已添加证书的“name”属性。如果证书与 TkgServiceConfiguration 中的证书匹配,但使用专用注册表仍然不起作用,请完成下一步以进一步诊断。
  2. 通过执行以下命令,使用自签名证书运行与目标服务器的 openssl 连接测试:openssl s_client -connect hostname:port_num,其中,hostname 是使用自签名证书的专用注册表的主机名/DNS 名称,port_num 是运行服务的端口号(对于 HTTPS,通常为 443)。当尝试连接到使用自签名证书的端点时,可以准确查看 openssl 返回的错误,并在那里修复这种情况,例如,通过将正确的证书添加到 TkgServiceConfiguration。如果 Tanzu Kubernetes 集群嵌入了错误的证书,将需要使用正确的证书更新 Tanzu Kubernetes Grid 服务 配置,删除 Tanzu Kubernetes 集群,然后使用包含正确证书的配置重新创建该集群。