可以对 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 Pod。vSphere 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。
- 使用有关专用注册表的详细信息创建示例 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 Kubernetes 的 vSphere 命名空间。
- 将
<image-name>
替换为您选择的映像名称。 - 将
<version>
替换为相应的映像版本,例如“最新版本”。 - 将
<registry-secret-name>
替换为您之前创建的注册表服务映像提取密钥的名称。
- 将
- 根据您定义的 Pod 规范在 Tanzu Kubernetes 集群中创建工作负载。
kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>
应使用从注册表中提取的映像创建 Pod。
外部专用注册表的 Trust 字段
将证书条目(PEM 编码的公共证书的 base64 编码字符串)添加到 TkgServiceConfiguration
中的 additionalTrustedCAs
部分。数据是在 TkgServiceConfiguration 中以纯文本格式存储的公共证书。
字段 | 描述 |
---|---|
trust |
部分标记。不接受任何数据。 |
additionalTrustedCAs |
部分标记。包括一系列证书,以及每个证书的名称和数据。 |
name |
TLS 证书的名称。 |
data |
PEM 编码的公共证书的 base64 编码字符串。 |
移除外部专用注册表证书
从 TkgServiceConfiguration
的 additionalTrustedCAs
部分中的证书列表中移除证书,并将 TkgServiceConfiguration
应用于 Tanzu Kubernetes Grid 服务。
正在轮换外部私人注册表证书
要轮换证书,VI 管理员或 DevOps 工程师将更改 TkgServiceConfiguration
或 Tanzu 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
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 检查是否正确应用了配置中应用的证书。
- 检查文件夹
/etc/ssl/certs/
中名为tkg-<cert_name>.pem
的文件,其中,<cert_name>
是TkgServiceConfiguration
中已添加证书的“name”属性。如果证书与TkgServiceConfiguration
中的证书匹配,但使用专用注册表仍然不起作用,请完成下一步以进一步诊断。 - 通过执行以下命令,使用自签名证书运行与目标服务器的 openssl 连接测试:
openssl s_client -connect hostname:port_num
,其中,hostname 是使用自签名证书的专用注册表的主机名/DNS 名称,port_num 是运行服务的端口号(对于 HTTPS,通常为 443)。当尝试连接到使用自签名证书的端点时,可以准确查看 openssl 返回的错误,并在那里修复这种情况,例如,通过将正确的证书添加到TkgServiceConfiguration
。如果 Tanzu Kubernetes 集群嵌入了错误的证书,将需要使用正确的证书更新 Tanzu Kubernetes Grid 服务 配置,删除 Tanzu Kubernetes 集群,然后使用包含正确证书的配置重新创建该集群。