Anthos VM 런타임용 Cloud Storage에서 이미지를 가져오기 위한 사용자 인증 정보 만들기 및 사용

이 문서에서는 사용자 인증 정보를 만들고 사용해서 Anthos VM 런타임을 사용하는 Cloud Storage에 액세스하는 방법을 보여줍니다. Cloud Storage 플러그인을 사용하면 Containerized Data Importer(CDI)를 사용하여 Cloud Storage 버킷에서 VM 이미지를 가져올 수 있습니다. 그런 후 Cloud Storage의 이미지에서 가상 디스크를 만들고 클러스터에서 실행되는 VM에 이를 연결할 수 있습니다. CDI는 Anthos VM 런타임을 실행하는 클러스터에서 자동으로 사용 설정됩니다.

시작하기 전에

이 문서를 완료하려면 다음 리소스에 대해 액세스 권한이 필요합니다.

사용자 인증 정보 개요

Cloud Storage에 액세스하려면 스토리지 버킷에 사용자 인증 정보를 제공하는 서비스 계정을 사용합니다. 스토리지 버킷에 성공적으로 액세스하기 위해서는 서비스 계정에 여러 권한이 필요합니다.

  • 공개 스토리지 버킷: 자체 식별을 위해 서비스 계정을 사용하지만 특정 권한은 필요하지 않습니다.
  • 비공개 스토리지 버킷: 스토리지 계정에 스토리지 버킷에 대한 뷰어 또는 관리자 권한이 필요합니다.

CDI에 서비스 계정 인증 정보를 제공하는 방법은 두 가지입니다.

  • 클러스터 노드에 Google 애플리케이션 기본 사용자 인증 정보(ADC)를 구성합니다. 자세한 내용은 서비스 계정으로 인증을 참조하세요.
  • Cloud Storage에 액세스하기 위해 서비스 계정 키가 포함된 보안 비밀을 제공합니다. 이 문서의 나머지 부분에서는 서비스 계정 키 및 보안 비밀을 만드는 방법을 보여줍니다.

보안 비밀 만들기

데이터 볼륨의 네임스페이스에 생성된 보안 비밀을 사용해서 서비스 계정 키를 Kubernetes로 전달합니다. 보안 비밀의 data 섹션에는 creds-gcp.json 항목이 포함되어 있습니다. 값은 서비스 계정 키 파일의 base64 인코딩 데이터입니다. CLI에서 이 base64 인코딩 데이터가 자동으로 생성됩니다. 보안 비밀을 만들기 위해 YAML 매니페스트를 사용하는 경우 먼저 서비스 계정 키 파일의 콘텐츠를 base64 해시로 만듭니다.

CLI

  • kubectl을 사용하여 보안 비밀을 만듭니다.

    kubectl create secret generic SECRET_NAME \
      --from-file=creds-gcp.json=SERVICE_ACCOUNT_KEY_PATH \
      --namespace NAMESPACE_NAME
    

    다음 값을 바꿉니다.

    • SECRET_NAME: 보안 비밀의 이름입니다.
    • SERVICE_ACCOUNT_KEY_PATH: 서비스 계정 키 파일의 경로입니다.
    • NAMESPACE_NAME: 보안 비밀의 네임스페이스입니다.
      • CDI가 실행되는 클러스터 및 데이터 볼륨과 동일한 네임스페이스에 보안 비밀을 만듭니다. CDI는 Anthos VM 런타임을 실행하는 클러스터에서 자동으로 사용 설정됩니다.

매니페스트

  1. 원하는 편집기에서 my-secret.yaml과 같은 Secret 매니페스트를 만듭니다.

    nano my-secret.yaml
    
  2. 다음 YAML 매니페스트를 복사하여 붙여넣습니다.

    apiVersion: v1
    data:
      creds-gcp.json: BASE64_SERVICE_ACCOUNT_FILE
    kind: Secret
    metadata:
      name: SECRET_NAME
      namespace: NAMESPACE_NAME
    type: Opaque
    

    다음 값을 바꿉니다.

    • BASE64_SERVICE_ACCOUNT_FILE: 서비스 계정 키 파일의 콘텐츠에 대한 base64 해시입니다.
    • SECRET_NAME: 보안 비밀의 이름입니다.
    • NAMESPACE_NAME: 보안 비밀의 네임스페이스입니다.
      • CDI가 실행되는 클러스터 및 데이터 볼륨과 동일한 네임스페이스에 보안 비밀을 만듭니다. CDI는 Anthos VM 런타임을 실행하는 클러스터에서 자동으로 사용 설정됩니다.
  3. 편집기에서 보안 비밀 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 보안 비밀 매니페스트를 적용합니다.

    kubectl apply -f my-secret.yaml
    

기존 보안 비밀 전달

보안 비밀을 만드는 대신 SecretForwarder를 만들어서 기존 보안 비밀을 사용하도록 전달할 수 있습니다. SecretForwarder에서는 동일한 클러스터 내에서 또는 관리자 클러스터에서 사용자 클러스터로와 같이 클러스터 간에 보안 비밀을 전달할 수 있습니다.

대상 보안 비밀을 사용하여 Cloud Storage에 액세스하려면 소스 보안 비밀의 data 섹션에 creds-gcp.json 키가 있어야 합니다.

동일한 클러스터

다음 예시 SecretForwarder 매니페스트는 동일한 클러스터에서 보안 비밀을 전달합니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
  name: cdi-gcs
  namespace: default
spec:
  inClusterTargetSecrets:
    name: gcs-sa
    namespaces:
    - default
  sourceSecret:
    name: gke-connect
    namespace: anthos-creds

이 예시에서는 다음을 수행합니다.

  • default 네임스페이스에서 cdi-gcs라는 SecretForwarder를 만듭니다.
  • anthos-creds 네임스페이스에 있는 gke-connect라는 보안 비밀을 default 네임스페이스에 있는 gcs-sa라는 새 보안 비밀로 전달합니다.
  • 동일한 클러스터에 새 보안 비밀을 만듭니다.

동일한 클러스터에서 보안 비밀을 전달하려면 다음 단계를 완료합니다.

  1. 원하는 편집기에서 my-forwarded-secret.yaml과 같은 SecretForwarder 매니페스트를 만듭니다.

    nano my-forwarded-secret.yaml
    
  2. 다음 YAML 매니페스트를 복사하여 붙여넣습니다.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: SecretForwarder
    metadata:
      name: SECRET_FORWARDER_NAME
      namespace: NAMESPACE_NAME
    spec:
      inClusterTargetSecrets:
        name: TARGET_SECRET_NAME
        namespaces:
        - TARGET_NAMESPACE_NAME
      sourceSecret:
        name: SOURCE_SECRET_NAME
        namespace: SOURCE_NAMESPACE_NAME
    

    다음 값을 바꿉니다.

    • SECRET_FORWARDER_NAME: SecretForwarder의 이름입니다.
    • NAMESPACE_NAME: SecretForwarder의 네임스페이스입니다.
    • TARGET_SECRET_NAME: 새 보안 비밀의 이름입니다.
    • TARGET_NAMESPACE_NAME: 새 보안 비밀의 네임스페이스입니다.
      • CDI가 실행되는 클러스터 및 데이터 볼륨과 동일한 네임스페이스에 보안 비밀을 만듭니다. CDI는 Anthos VM 런타임을 실행하는 클러스터에서 자동으로 사용 설정됩니다.
    • SOURCE_SECRET_NAME: 전달할 소스 보안 비밀의 이름입니다.
    • SOURCE_NAMESPACE_NAME: 전달할 소스 보안 비밀의 네임스페이스입니다.
  3. 편집기에서 SecretForwarder 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 SecretForwarder 매니페스트를 적용합니다.

    kubectl apply -f my-forwarded-secret.yaml
    

클러스터 간

다음 예시 SecretForwarder 매니페스트는 보안 비밀을 클러스터 간에 전달합니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
  name: cdi-gcs
  namespace: cluster-user1
spec:
  RemoteClusterTargetSecrets:
    name: gcs-sa
    namespaces:
    - default
  sourceSecret:
    name: gke-connect
    namespace: anthos-creds

이 예시에서는 다음을 수행합니다.

  • cluster-user1 네임스페이스에서 cdi-gcs라는 SecretForwarder를 만듭니다.
  • anthos-creds 네임스페이스에 있는 gke-connect라는 보안 비밀을 default 네임스페이스에 있는 gcs-sa라는 새 보안 비밀로 전달합니다.
  • 클러스터에 user1라는 새 보안 비밀을 만듭니다.

동일한 클러스터에서 보안 비밀을 전달하려면 다음 단계를 완료합니다.

  1. 원하는 편집기에서 my-forwarded-secret.yaml과 같은 SecretForwarder 매니페스트를 만듭니다.

    nano my-forwarded-secret.yaml
    
  2. 다음 YAML 매니페스트를 복사하여 붙여넣습니다.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: SecretForwarder
    metadata:
      name: SECRET_FORWARDER_NAME
      namespace: NAMESPACE_NAME
    spec:
      RemoteClusterTargetSecrets:
        name: TARGET_SECRET_NAME
        namespaces:
        - TARGET_NAMESPACE_NAME
      sourceSecret:
        name: SOURCE_SECRET_NAME
        namespace: SOURCE_NAMESPACE_NAME
    

    다음 값을 바꿉니다.

    • SECRET_FORWARDER_NAME: 원격 클러스터에 있는 SecretForwarder의 이름입니다.
    • NAMESPACE_NAME: 원격 클러스터에 있는 SecretForwarder의 네임스페이스입니다.
    • TARGET_SECRET_NAME: 원격 클러스터에 있는 새 보안 비밀의 이름입니다.
    • TARGET_NAMESPACE_NAME: 원격 클러스터에 있는 새 보안 비밀의 네임스페이스입니다.
      • CDI가 실행되는 클러스터 및 데이터 볼륨과 동일한 네임스페이스에 보안 비밀을 만듭니다. CDI는 Anthos VM 런타임을 실행하는 클러스터에서 자동으로 사용 설정됩니다.
    • SOURCE_SECRET_NAME: 전달할 소스 보안 비밀의 이름입니다.
    • SOURCE_NAMESPACE_NAME: 전달할 소스 보안 비밀의 네임스페이스입니다.
  3. 편집기에서 SecretForwarder 매니페스트를 저장하고 닫습니다.

  4. 관리자 클러스터의 KUBECONFIG와 함께 kubectl을 사용하여 관리자 클러스터에서 SecretForwarder 매니페스트를 적용합니다.

    kubectl apply -f my-forwarded-secret.yaml
    

보안 비밀을 사용하여 이미지 가져오기

가상 디스크 및 VM을 만들 때 보안 비밀을 사용하여 Cloud Storage에서 이미지를 가져오려면 다음 단계를 완료합니다.

  1. 원하는 편집기에서 my-vm.yaml과 같이 VirtualMachineDiskVirtualMachine을 정의하는 매니페스트를 만듭니다.

    nano my-vm.yaml
    
  2. 다음 YAML 정의를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        gcs:
          url: IMAGE_URL
          secretRef: SECRET_NAME
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    다음 값을 바꿉니다.

    • VM_NAME - VM의 이름입니다.
    • IMAGE_URL - gs://my-images-bucket/disk.qcow2와 같이 디스크 이미지 Cloud Storage의 URL입니다.
    • SECRET_NAME - 보안 비밀의 이름입니다.
  3. 편집기에서 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 VM 및 디스크를 만듭니다.

    kubectl apply -f my-vm.yaml
    

다음 단계