本文档介绍如何创建和使用凭据以通过 VM Runtime on GDC 访问 Cloud Storage。Cloud Storage 插件可让您使用容器化数据导入工具 (CDI) 从 Cloud Storage 存储桶导入虚拟机映像。然后,您可以在 Cloud Storage 中通过这些映像创建虚拟磁盘,并将其挂接到集群中运行的虚拟机。CDI 会在运行 VM Runtime on GDC 的集群中自动启用。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- Google Distributed Cloud 1.12.0 版 (anthosBareMetalVersion: 1.12.0) 或更高版本的集群。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用 Google Distributed Cloud,或查看集群创建概览。
- 您要用于访问 Cloud Storage 的服务账号和服务账号密钥。如果需要,配置可访问 Cloud Storage 存储桶的服务账号。
凭据概览
如需访问 Cloud Storage,请使用为存储桶提供凭据的服务账号。该服务账号需要不同的权限才能成功访问存储桶:
- 公共存储桶:您可以使用服务账号进行自行标识,但不需要特定权限。
- 专用存储桶:存储账号需要具有存储桶的查看者或管理员权限。
您可以通过以下两种方法为 CDI 提供服务账号凭据:
- 在集群中的节点上配置 Google 应用默认凭证 (ADC)。如需了解详情,请参阅为本地或其他云服务提供商设置 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。CDI 会在运行 VM Runtime on GDC 的集群中自动启用。
 
 
清单
- 在您选择的编辑器中创建 - Secret清单,例如 my-secret.yaml:- nano my-secret.yaml
- 复制并粘贴以下 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。CDI 会在运行 VM Runtime on GDC 的集群中自动启用。
 
 
- 在编辑器中保存并关闭 Secret 清单。 
- 使用 - 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,请完成以下步骤:
- 在您选择的编辑器中创建 - SecretForwarder清单,例如 my-forwarded-secret.yaml:- nano my-forwarded-secret.yaml
- 复制并粘贴以下 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。CDI 会在运行 VM Runtime on GDC 的集群中自动启用。
 
- SOURCE_SECRET_NAME:要转发的来源 Secret 的名称。
- SOURCE_NAMESPACE_NAME:要转发的来源 Secret 的命名空间。
 
- 在编辑器中保存并关闭 - SecretForwarder清单。
- 使用 - 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。
如需在同一集群中转发 Secret,请完成以下步骤:
- 在您选择的编辑器中创建 - SecretForwarder清单,例如 my-forwarded-secret.yaml:- nano my-forwarded-secret.yaml
- 复制并粘贴以下 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。CDI 会在运行 VM Runtime on GDC 的集群中自动启用。
 
- SOURCE_SECRET_NAME:要转发的来源 Secret 的名称。
- SOURCE_NAMESPACE_NAME:要转发的来源 Secret 的命名空间。
 
- 在编辑器中保存并关闭 - SecretForwarder清单。
- 结合使用 - kubectl和管理员集群的- KUBECONFIG在管理员集群中应用- SecretForwarder清单:- kubectl apply -f my-forwarded-secret.yaml
使用 Secret 导入映像
如需在创建虚拟磁盘和虚拟机时使用 Secret 从 Cloud Storage 导入映像,请完成以下步骤:
- 在您选择的编辑器中创建定义 - VirtualMachineDisk和- VirtualMachine(例如 my-vm.yaml)的清单:- nano my-vm.yaml
- 复制并粘贴以下 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 的名称。
 
- 在编辑器中保存并关闭清单。 
- 使用 - kubectl创建虚拟机和磁盘:- kubectl apply -f my-vm.yaml