비공개 레지스트리에 인증하도록 노드 구성

워커 노드가 비공개 레지스트리를 사용할 수 있도록 Google Distributed Cloud 클러스터를 구성할 수 있습니다. 노드 수준 비공개 레지스트리는 이미지 가져오기 및 관련 보안에 대한 제어 수준을 높이기 위해 워크로드에 사용하도록 의도되었습니다. 이 문서에 설명된 대로 비공개 레지스트리를 사용하여 클러스터를 구성하면 Google Distributed Cloud가 그에 따라 컨테이너 구성을 업데이트합니다. 클러스터가 구성되면 포드 사양에서 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 파일의 경로입니다.

비공개 레지스트리의 사용자 클러스터 구성

사용자 클러스터에서 비공개 레지스트리 구성은 클러스터 리소스 사양에 지정됩니다. 또한 사용자 클러스터의 경우 비공개 레지스트리 사용자 인증 정보를 보안 비밀에 저장해야 합니다.

  1. 레지스트리 사용자 인증 정보를 위한 kubernetes.io/dockerconfigjson 유형의 Kubernetes 보안 비밀을 생성합니다.

    보안 비밀의 범위를 특정 네임스페이스로 지정하려면 다음 명령어에 --namespace 플래그를 추가하여 네임스페이스 이름을 지정합니다.

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

    다음을 바꿉니다.

    • CREDS_SECRET_NAME: 보안 비밀의 이름

    • CREDENTIALS_FILE_PATH: Docker 구성 파일의 경로입니다. 예를 들면 /root/.docker/config.json입니다.

    보안 비밀은 다음 예시와 비슷하게 표시됩니다.

    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
    

    보안 비밀이 클러스터와 동일한 네임스페이스에 있지 않으면 이전 예시에 표시된 대로 baremetal.cluster.gke.io/mark-source: "true" 주석을 추가합니다.

  2. 해당하는 경우 레지스트리의 CA 인증서를 보안 비밀에 저장합니다.

    보안 비밀은 다음과 유사합니다.

    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 인증서를 저장하기 위해 만든 보안 비밀의 이름입니다. 이 보안 비밀을 만들지 않았으면 caCertSecretRef 블록을 삭제합니다.

    • CA_CERT_SECRET_NAMESPACE: CA 인증서 보안 비밀의 네임스페이스 이름(생성한 경우)입니다.

    • REGISTRY_HOST: 비공개 레지스트리 및 포트의 도메인 이름 또는 IP 주소입니다. 예를 들면 10.200.0.2:5007입니다.

    • CREDS_SECRET_NAME: 레지스트리 사용자 인증 정보의 kubernetes.io/dockerconfigjson 유형 보안 비밀의 이름입니다.

    • CREDS_SECRET_NAMESPACE: 레지스트리 사용자 인증 정보 보안 비밀의 네임스페이스 이름입니다.

  4. 변경사항을 클러스터에 적용합니다.

    bmctl update cluster -c USER_CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
    

    다음을 바꿉니다.

    • USER_CLUSTER_NAME: 업데이트할 클러스터의 이름입니다.

    • ADMIN_KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로입니다.