本文档介绍如何通过 GDC 上的 VM Runtime 创建和使用凭据来访问 Cloud Storage。Cloud Storage 插件可让您使用容器化数据导入工具 (CDI) 从 Cloud Storage 存储桶导入虚拟机映像。然后,您可以在 Cloud Storage 中通过这些映像创建虚拟磁盘,并将其挂接到集群中运行的虚拟机。在 GDC 上运行虚拟机运行时的集群中会自动启用 CDI。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- GKE on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群的访问权限。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用适用于 Bare Metal 的 GDCV 或参阅集群创建概览。 - 您要用于访问 Cloud Storage 的服务账号和服务账号密钥。如果需要,配置可访问 Cloud Storage 存储桶的服务账号。
凭据概览
如需访问 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。
清单
在您选择的编辑器中创建
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。在 GDC 上运行虚拟机运行时的集群中会自动启用 CDI。
在编辑器中保存并关闭 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.yamlmy-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。在 GDC 上运行虚拟机运行时的集群中会自动启用 CDI。
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.yamlmy-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。在 GDC 上运行虚拟机运行时的集群中会自动启用 CDI。
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