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

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

始める前に

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

認証情報の概要

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

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

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

  • クラスタ内のノードで Google のアプリケーションのデフォルト認証情報(ADC)を構成します。詳細については、オンプレミスまたは他のクラウド プロバイダの ADC を設定するをご覧ください。
  • Cloud Storage にアクセスするサービス アカウントのキーを含む 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 が実行されるクラスタと、データ ボリュームと同じ名前空間に、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 が実行されるクラスタと、データ ボリュームと同じ名前空間に、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 が実行されるクラスタと、データ ボリュームと同じ名前空間に、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 が実行されるクラスタと、データ ボリュームと同じ名前空間に、Secret を作成します。CDI は、GDC 上の VM ランタイムを実行するクラスタでは自動的に有効になります。
    • SOURCE_SECRET_NAME: 転送するソース Secret の名前。
    • SOURCE_NAMESPACE_NAME: 転送するソース Secret の Namespace。
  3. SecretForwarder マニフェストをエディタに保存して閉じます。

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

    kubectl apply -f my-forwarded-secret.yaml
    

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

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

  1. 選択したエディタで VirtualMachineDisk と VirtualMachine を定義するマニフェスト(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
    

次のステップ