限定公開レジストリに対する認証を行うようにノードを構成する

ワーカーノードが限定公開レジストリを使用できるように Google Distributed Cloud クラスタを構成できます。ノードレベルの限定公開レジストリは、ワークロードを使用してイメージの pull とそれに関連するセキュリティをより細かく制御できるようにすることを目的としています。このドキュメントで説明するように、限定公開レジストリがあるクラスタを構成すると、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 ファイルのパス。

限定公開レジストリ用のユーザー クラスタを構成する

ユーザー クラスタでは、限定公開レジストリの構成は Cluster リソース仕様で指定されます。また、ユーザー クラスタでは、限定公開レジストリの認証情報を 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 ファイルのパス。