建立及使用憑證,從 Cloud Storage 匯入 VM Runtime on GDC 的映像檔

本文說明如何建立及使用憑證,透過 GDC 上的 VM 執行階段存取 Cloud Storage。Cloud Storage 外掛程式可讓您使用容器化資料匯入工具 (CDI),從 Cloud Storage 值區匯入 VM 映像檔。然後,您可以在 Cloud Storage 中從這些映像檔建立虛擬磁碟,並將其附加至叢集中執行的 VM。在 GDC 上執行 VM Runtime 的叢集會自動啟用 CDI。

事前準備

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

憑證總覽

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

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

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

建立 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:密鑰的名稱。
    • 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:密鑰的名稱。
    • NAMESPACE_NAME:Secret 的命名空間。
      • 在 CDI 執行的叢集中建立 Secret,並與資料磁碟區位於相同命名空間。在 GDC 上執行 VM Runtime 的叢集中,系統會自動啟用 CDI。
  3. 在編輯器中儲存並關閉 Secret 資訊清單。

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

    kubectl apply -f my-secret.yaml
    

轉送現有密鑰

您可以建立 SecretForwarder,轉送現有密鑰供使用,不必建立密鑰。SecretForwarder 支援在同一叢集內或跨叢集轉送密鑰,例如從管理員叢集轉送至使用者叢集。

如要使用目標 Secret 存取 Cloud Storage,來源 Secret 的 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-gcsSecretForwarder
  • anthos-creds 命名空間中名為 gke-connect 的密鑰轉送至 default 命名空間中名為 gcs-sa 的新密鑰。
  • 在同一個叢集中建立新密鑰。

如要在同一個叢集中轉送 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:新密鑰的命名空間。
      • 在 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 資訊清單會轉送叢集間的密鑰:

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-gcsSecretForwarder
  • anthos-creds 命名空間中名為 gke-connect 的密鑰轉送至 default 命名空間中名為 gcs-sa 的新密鑰。
  • 在名為 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. 使用管理叢集的 KUBECONFIG,在管理叢集中套用 SecretForwarder 資訊清單:kubectl

    kubectl apply -f my-forwarded-secret.yaml
    

使用密鑰匯入圖片

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

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

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

    kubectl apply -f my-vm.yaml
    

後續步驟