为 GDC 上的 VM Runtime 创建并使用凭据从 Cloud Storage 导入映像

本文档介绍如何通过 GDC 上的 VM Runtime 创建和使用凭据来访问 Cloud Storage。Cloud Storage 插件可让您使用容器化数据导入工具 (CDI) 从 Cloud Storage 存储桶导入虚拟机映像。然后,您可以在 Cloud Storage 中通过这些映像创建虚拟磁盘,并将其挂接到集群中运行的虚拟机。在 GDC 上运行虚拟机运行时的集群中会自动启用 CDI。

准备工作

要完成本文档,您需要拥有以下资源的访问权限:

凭据概览

如需访问 Cloud Storage,请使用为存储桶提供凭据的服务账号。该服务账号需要不同的权限才能成功访问存储桶:

  • 公共存储桶:您可以使用服务账号进行自行标识,但不需要特定权限。
  • 专用存储桶:存储账号需要具有存储桶的查看者或管理员权限。

您可以通过以下两种方法为 CDI 提供服务账号凭据:

  • 在集群中的节点上配置 Google 应用默认凭据 (ADC)。如需了解详情,请参阅以服务账号身份进行身份验证
  • 提供包含访问 Cloud Storage 所需服务账号密钥的 Secret。本文档的其余部分介绍了如何创建服务账号密钥和 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 上运行虚拟机运行时的集群中会自动启用 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 上运行虚拟机运行时的集群中会自动启用 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-gcsSecretForwarder
  • anthos-creds 命名空间中名为 gke-connect 的 Secret 转发到 default 命名空间中名为 gcs-sa 的新 Secret。
  • 在同一集群中创建新 Secret。

如需在同一集群中转发 Secret,请完成以下步骤:

  1. 在您选择的编辑器中创建 SecretForwarder 清单,例如 my-forwarded-secret.yamlmy-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 上运行虚拟机运行时的集群中会自动启用 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-gcsSecretForwarder
  • anthos-creds 命名空间中名为 gke-connect 的 Secret 转发到 default 命名空间中名为 gcs-sa 的新 Secret。
  • 在名为 user1 的集群中创建新 Secret。

如需在同一集群中转发 Secret,请完成以下步骤:

  1. 在您选择的编辑器中创建 SecretForwarder 清单,例如 my-forwarded-secret.yamlmy-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 上运行虚拟机运行时的集群中会自动启用 CDI。
    • SOURCE_SECRET_NAME:要转发的来源 Secret 的名称。
    • SOURCE_NAMESPACE_NAME:要转发的来源 Secret 的命名空间。
  3. 在编辑器中保存并关闭 SecretForwarder 清单。

  4. 结合使用 kubectl 和管理员集群的 KUBECONFIG 在管理员集群中应用 SecretForwarder 清单:

    kubectl apply -f my-forwarded-secret.yaml
    

使用 Secret 导入映像

如需在创建虚拟磁盘和虚拟机时使用 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 - 虚拟机的名称。
    • IMAGE_URL - 磁盘映像 Cloud Storage 的网址,例如 gs://my-images-bucket/disk.qcow2
    • SECRET_NAME - Secret 的名称。
  3. 在编辑器中保存并关闭清单。

  4. 使用 kubectl 创建虚拟机和磁盘:

    kubectl apply -f my-vm.yaml
    

后续步骤