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 を作成する

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

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

    kubectl apply -f my-secret.yaml
    

既存の Secret を転送する

Secret を作成する代わりに、SecretForwarder を作成して、既存の Secret を転送して使用することもできます。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 Namespace に cdi-gcs という名前の SecretForwarder を作成します。
  • anthos-creds Namespace 内の gke-connect という名前の Secret を、default Namespace 内の 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 の Namespace。
    • TARGET_SECRET_NAME: 新しい Secret の名前。
    • TARGET_NAMESPACE_NAME: 新しい Secret の Namespace。
      • CDI が実行されるクラスタと、データ ボリュームと同じ Namespace に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。
    • SOURCE_SECRET_NAME: 転送するソース Secret の名前。
    • SOURCE_NAMESPACE_NAME: 転送するソース Secret の Namespace。
  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 Namespace に cdi-gcs という名前の SecretForwarder を作成します。
  • anthos-creds Namespace 内の gke-connect という名前の Secret を、default Namespace 内の 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 の Namespace。
    • TARGET_SECRET_NAME: リモート クラスタ内の新しい Secret の名前。
    • TARGET_NAMESPACE_NAME: リモート クラスタ内の新しい Secret の Namespace。
      • CDI が実行されるクラスタと、データ ボリュームと同じ Namespace に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。
    • SOURCE_SECRET_NAME: 転送するソース Secret の名前。
    • SOURCE_NAMESPACE_NAME: 転送するソース Secret の Namespace。
  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
    

次のステップ