建立及使用憑證,從 Cloud Storage 匯入映像檔,供 GDC 上的 VM 執行階段使用

Cloud Storage 外掛程式可讓您使用容器化資料匯入工具 (CDI),將虛擬機器 (VM) 映像檔從 Cloud Storage bucket 匯入 GDC 的 VM 執行階段。設定憑證以向 Cloud Storage 驗證後,您就能透過這些映像檔建立虛擬磁碟,並附加至叢集中執行的 VM。在 GDC 上執行 VM 執行階段的叢集會自動啟用 CDI。

事前準備

如要完成這份文件,您必須存取下列資源:

憑證總覽

如要存取 Cloud Storage,請使用為 Storage bucket 提供憑證的服務帳戶。服務帳戶需要不同的權限,才能成功存取儲存空間 bucket:

  • 公開儲存空間 bucket:您可以使用服務帳戶進行自我識別,但不需要特定權限。
  • 私人儲存空間 bucket:儲存空間帳戶需要具備儲存空間 bucket 的檢視者或管理員權限。

您可以透過兩種方式,將服務帳戶憑證提供給 CDI:

  • 在叢集節點上設定 Google 應用程式預設憑證 (ADC)。詳情請參閱「為地端部署或其他雲端服務供應商設定 ADC」。
  • 提供 Secret,其中包含用於存取 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。在 GDC 上執行 VM Runtime 的叢集會自動啟用 CDI。

資訊清單

  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。在 GDC 上執行 VM Runtime 的叢集會自動啟用 CDI。
  3. 在編輯器中儲存並關閉 Secret 資訊清單。

  4. 使用 kubectl 套用 Secret 資訊清單:

    kubectl apply -f my-secret.yaml
    

轉寄現有 Secret

您可以建立 SecretForwarder 來轉送現有的 Secret,而不必建立 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 命名空間中建立名為 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。在 GDC 上執行 VM Runtime 的叢集會自動啟用 CDI。
    • 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,請完成下列步驟:

  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。在 GDC 上執行 VM Runtime 的叢集會自動啟用 CDI。
    • SOURCE_SECRET_NAME:要轉送的來源 Secret 名稱。
    • SOURCE_NAMESPACE_NAME:要轉送的來源 Secret 命名空間。
  3. 在編輯器中儲存並關閉 SecretForwarder 資訊清單。

  4. 使用 kubectl 搭配管理員叢集的 KUBECONFIG,在管理員叢集中套用 SecretForwarder 資訊清單:

    kubectl apply -f my-forwarded-secret.yaml
    

使用 Secret 匯入映像檔

如要在建立虛擬磁碟和 VM 時,使用 Secret 從 Cloud Storage 匯入映像檔,請完成下列步驟:

  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 的網址,例如 gs://my-images-bucket/disk.qcow2。
    • SECRET_NAME:Secret 的名稱。
  3. 儲存並關閉編輯器中的資訊清單。

  4. 使用 kubectl 建立 VM 和磁碟:

    kubectl apply -f my-vm.yaml
    

後續步驟