GDC 上の VM ランタイム用に Cloud Storage からイメージをインポートするために認証情報を作成して使用する

このドキュメントでは、GDC 上の VM ランタイムを使用して Cloud Storage にアクセスするための認証情報を作成して使用する方法について説明します。Cloud Storage プラグインを使用すると、Containerd Data Importer(CDI)を使用して Cloud Storage バケットから VM イメージをインポートできます。その後、Cloud Storage にあるこれらのイメージから仮想ディスクを作成し、クラスタ内で実行される VM にアタッチできます。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。

準備

このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。

クルデンシャルの概要

Cloud Storage にアクセスするには、ストレージ バケットに認証情報を提供するサービス アカウントを使用します。ストレージ バケットに正常にアクセスするには、サービス アカウンにさまざまな権限が必要です。

  • 公開ストレージ バケット: 自己識別にはサービス アカウントを使用しますが、特定の権限は必要ありません。
  • プライベート ストレージ バケット: ストレージ アカウントには、ストレージ バケットに対する閲覧者または管理者の権限が必要です。

CDI にサービス アカウントの認証情報を提供するには、次の 2 つの方法があります。

  • クラスタ内のノードで Google のアプリケーションのデフォルト認証情報(ADC)を構成します。詳細については、サービス アカウントとして認証するをご覧ください。
  • Cloud Storage にアクセスするサービス アカウントのキーを含む Secret を指定します。このドキュメントの残りの部分では、サービス アカウント キーと Secret を作成する方法について説明します。

シークレットを作成

データ ボリュームの名前空間で作成された Secret を使用して、サービス アカウント キーを Kubernetes に渡します。Secret の data セクションに、creds-gcp.json のエントリが含まれている。値は、サービス アカウント キーファイルの Base64 でエンコードされたデータです。CLI は、この Base64 エンコード データを作成します。YAML マニフェストを使用して Secret を作成する場合は、まずサービス アカウント キーファイルの内容の base64 ハッシュを作成します。

CLI

  • kubectl を使用して Secret を作成します。

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

    次の値を置き換えます。

    • SECRET_NAME: Secret の名前。
    • SERVICE_ACCOUNT_KEY_PATH: サービス アカウント キーファイルへのパス。
    • NAMESPACE_NAME: Secret の名前空間。
      • CDI が実行されるクラスタと、データ ボリュームと同じ名前空間に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。

マニフェスト

  1. 選択したエディタで、Secret マニフェスト(my-secret.yaml など)を作成します。

    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: Secret の名前。
    • NAMESPACE_NAME: Secret の名前空間。
      • CDI が実行されるクラスタと、データ ボリュームと同じ名前空間に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。
  3. Secret マニフェストをエディタに保存して閉じます。

  4. kubectl を使用して Secret マニフェストを適用します。

    kubectl apply -f my-secret.yaml
    

既存の Secret を転送する

Secret を作成する代わりに、既存の Secret を転送して使用するために SecretForwarder を作成できます。SecretForwarder は、同じクラスタ内、または管理クラスタからユーザー クラスタへなど、クラスタ間での Secret の転送をサポートします。

ターゲット Secret を使用して Cloud Storage にアクセスするには、ソース Secret の data セクションに creds-gcp.json キーが必要です。

同じクラスタ

次の SecretForwarder マニフェストの例では、同じクラスタ内の Secret を転送しています。

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 という名前の Secret を、default 名前空間内の gcs-sa という名前の新しい Secret に転送します。
  • 同じクラスタに新しい Secret を作成します。

同じクラスタ内の Secret を転送するには、次の手順を行います。

  1. 選択したエディタで、SecretForwarder マニフェスト(my-forwarded-secret.yaml など)を作成します。

    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: 新しい Secret の名前。
    • TARGET_NAMESPACE_NAME: 新しい Secret の名前空間。
      • CDI が実行されるクラスタと、データ ボリュームと同じ名前空間に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。
    • SOURCE_SECRET_NAME: 転送するソース Secret の名前。
    • SOURCE_NAMESPACE_NAME: 転送するソース Secret の名前空間。
  3. SecretForwarder マニフェストをエディタに保存して閉じます。

  4. kubectl を使用して SecretForwarder マニフェストを適用します。

    kubectl apply -f my-forwarded-secret.yaml
    

クラスタ間

次の SecretForwarder マニフェストの例では、Secret をクラスタ間で転送します。

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 という名前の Secret を、default 名前空間内の gcs-sa という名前の新しい Secret に転送します。
  • user1 という名前のクラスタに新しい Secret を作成します。

同じクラスタ内の Secret を転送するには、次の手順を行います。

  1. 選択したエディタで、SecretForwarder マニフェスト(my-forwarded-secret.yaml など)を作成します。

    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: リモート クラスタ内の新しい Secret の名前。
    • TARGET_NAMESPACE_NAME: リモート クラスタ内の新しい Secret の名前空間。
      • CDI が実行されるクラスタと、データ ボリュームと同じ名前空間に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。
    • SOURCE_SECRET_NAME: 転送するソース Secret の名前。
    • SOURCE_NAMESPACE_NAME: 転送するソース Secret の名前空間。
  3. SecretForwarder マニフェストをエディタに保存して閉じます。

  4. 管理クラスタの KUBECONFIGkubectl を使用して、管理クラスタで SecretForwarder マニフェストを適用します。

    kubectl apply -f my-forwarded-secret.yaml
    

Secret を使用してイメージをインポートする

仮想ディスクと VM を作成するときに Cloud Storage からイメージをインポートするには、Secret を使用して次の手順を行います。

  1. 選択したエディタで VirtualMachineDiskVirtualMachine を定義するマニフェスト(my-vm.yaml など)を作成します。

    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 - ディスク イメージの Cloud Storage への URL(gs://my-images-bucket/disk.qcow2 など)。
    • SECRET_NAME: Secret の名前。
  3. マニフェストをエディタに保存して閉じます。

  4. kubectl を使用して VM とディスクを作成します。

    kubectl apply -f my-vm.yaml
    

次のステップ