配置节点以向私有注册表进行身份验证

您可以将 Google Distributed Cloud 集群配置为使其工作器节点能够使用私有注册表。节点级私有注册表用于工作负载,可让您更好地控制映像拉取及其相关安全性。按照本文档中的说明使用私有注册表配置集群时,Google Distributed Cloud 会相应地更新 containerd 配置。配置集群后,合格节点上的所有 Pod 都可以使用注册表,而无需在 Pod 规范中指定 imagePullSecrets

在集群生命周期中,您可以随时启用或停用此功能。

前提条件

如需使用此预览版功能,您的集群必须满足以下要求:

  • 集群版本必须为 1.29。
  • 节点池版本必须为 1.29(并非所有节点池都需要为 1.29 版,但该功能仅适用于 1.29 版中的节点池)。
  • 集群必须具有 preview.baremetal.cluster.gke.io/private-registry: "enable" 预览版功能注解。
  • 此功能适用于具有工作器节点池的用户集群和自行管理(混合和独立)集群,如下表所示:

    部署模型 支持的集群类型
    管理员集群和用户集群部署

    管理员集群

    用户集群 1

    用户集群 2

    混合集群部署

    混合集群

    用户集群 1

    用户集群 2

    独立集群部署

    独立集群

为私有注册表配置自行管理的集群

如需将独立集群或混合集群配置为使用节点级层私有注册表,请执行以下操作:

  1. 修改集群配置文件,在凭据部分添加 privateRegistries 代码块:

    ---
    gcrKeyPath: baremetal/gcr.json
    sshPrivateKeyPath: .ssh/id_rsa
    ...
    privateRegistries:
      - host: REGISTRY_HOST
        caCertPath: CA_CERT_PATH
        pullCredentialConfigPath: CREDENTIALS_FILE_PATH
    ...
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-hybrid-basic
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: hybrid-basic
      namespace: cluster-hybrid-basic
      annotations:
        preview.baremetal.cluster.gke.io/private-registry: "enable"
        ...
    spec:
      type: hybrid
      ...
    

    请替换以下内容:

    • REGISTRY_HOST:私有注册表的域名或 IP 地址以及端口。例如:10.200.0.2:5007

    • CA_CERT_PATH:CA 证书文件的路径(服务器根 CA)。例如:/root/cert.pem。如果您的专用注册表不需要使用专用 TLS 证书,则可以省略此字段。

    • CREDENTIALS_FILE_PATH:包含访问您的专用注册表的凭据的文件的路径。例如:/root/.docker/config.json。如果您的私有注册表服务器不需要使用凭据进行身份验证,则可以省略此字段。

  2. 将更改应用于您的集群:

    bmctl update cluster -c CLUSTER_NAME --kubeconfig=CLUSTER_KUBECONFIG
    

    请替换以下内容:

    • CLUSTER_NAME:您要更新的集群的名称。

    • CLUSTER_KUBECONFIG:自管(混合或独立)集群 kubeconfig 文件的路径。

为专用注册表配置用户集群

对于用户集群,私有注册表配置是在集群资源规范中指定的。此外,对于用户集群,您需要将私有注册表凭据存储在 Secret 中:

  1. 为注册表凭据创建 kubernetes.io/dockerconfigjson 类型的 Kubernetes Secret:

    如果您想将 Secret 的作用域限定为特定命名空间,请将 --namespace 标志添加到以下命令中,以指定命名空间的名称。

    kubectl create secret docker-registry CREDS_SECRET_NAME \
        --from-file=.dockerconfigjson=CREDENTIALS_FILE_PATH \
        --kubeconfig=ADMIN_KUBECONFIG
    

    请替换以下内容:

    • CREDS_SECRET_NAME:Secret 的名称。

    • CREDENTIALS_FILE_PATH:Docker 配置文件的路径。例如 /root/.docker/config.json

    您的 Secret 应类似于以下示例:

    apiVersion: v1
    data:
      .dockerconfigjson: ewoJImF1dGhzIjogewoJ...clpYSXdNak14IgoJCX0KCX0KfQ==
    kind: Secret
    metadata:
      creationTimestamp: "2024-04-28T22:06:06Z"
      name: private-registry-secret
      namespace: default
      resourceVersion: "5055821"
      ...
      annotations:
        ...
        baremetal.cluster.gke.io/mark-source: "true"
    type: kubernetes.io/dockerconfigjson
    

    如果 Secret 与集群不在同一个命名空间中,请添加注释 baremetal.cluster.gke.io/mark-source: "true",如上述示例所示。

  2. 如果适用,请将该注册表的 CA 证书存储在 Secret 中。

    Secret 类似于以下内容:

    apiVersion: v1
    kind: Secret
    metadata:
      annotations:
        baremetal.cluster.gke.io/mark-source: "true"
      name: ca-9dd74fd308bac6df562c7a7b220590b5
      namespace: some-namespace
    type: Opaque
    data:
      ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lVQi
      3UGxjUzVFVk8vS0xuYjZiMHRhRFVleXJvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2ZqRUxNQWtHQ
      ...
      QnpPTkxTRFZJVk5LMm9YV1JvNEpJY0ZoNFZ4MWRMRHpqMldEaHhrUEljWEhLdGR3dk5iS2tocU
      LUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
      ```
    
  3. 修改用户集群配置文件以启用和配置私有注册表:

    1. 添加注解 preview.baremetal.cluster.gke.io/private-registry: "enable" 以启用预览版中的私有注册表。

      apiVersion: baremetal.cluster.gke.io/v1
      kind: Cluster
      metadata:
        name: user-basic
        namespace: cluster-user-basic
        resourceVersion: "766027"
        annotations:
          ...
          preview.baremetal.cluster.gke.io/private-registry: "enable"
      ...
      
    2. 在用户集群配置文件的 nodeConfig 部分中,添加 privateRegistries 块:

      apiVersion: baremetal.cluster.gke.io/v1
      kind: Cluster
      metadata:
        name: user-basic
      ...
      spec:
        bypassPreflightCheck: false
      ...
        nodeConfig:
          containerRuntime: containerd
          podDensity:
            maxPodsPerNode: 250
          privateRegistries:
          - caCertSecretRef:
              name: CA_CERT_SECRET_NAME
              namespace: CA_CERT_SECRET_NAMESPACE
            host: REGISTRY_HOST
            pullCredentialSecretRef:
              name: CREDS_SECRET_NAME
              namespace: CREDS_SECRET_NAMESPACE
      

    请替换以下内容:

    • CA_CERT_SECRET_NAME:您创建的用于存储 CA 证书的 Secret 的名称。如果您没有创建此 Secret,请移除 caCertSecretRef 代码块。

    • CA_CERT_SECRET_NAMESPACE:CA 证书 Secret 的命名空间的名称(如果您创建了该命名空间)。

    • REGISTRY_HOST:私有注册表和端口的域名或 IP 地址。例如:10.200.0.2:5007

    • CREDS_SECRET_NAME:注册表凭据的 kubernetes.io/dockerconfigjson 类型 Secret 的名称。

    • CREDS_SECRET_NAMESPACE:包含注册表凭据的 Secret 的命名空间名称。

  4. 将更改应用到集群:

    bmctl update cluster -c USER_CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
    

    请替换以下内容:

    • USER_CLUSTER_NAME:您要更新的集群的名称。

    • ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径。