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

您可以配置 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. 修改集群配置文件,在凭据部分添加 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",以在 Preview 期间启用私有注册表。

      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 文件的路径。