通过机密 Google Kubernetes Engine 节点加密使用中的工作负载数据


本页面介绍如何使用机密 Google Kubernetes Engine 节点强制加密节点和工作负载内使用中的数据

概览

机密 GKE 节点是使用 AMD 安全加密虚拟化 (SEV) 在 Compute Engine 机密虚拟机的基础上构建的,可对使用中虚拟机的内存内容进行加密。使用中加密是端到端加密的三种状态之一。

在集群或节点池上启用机密 GKE 节点时,机密节点上运行的工作负载中的数据会进行使用中加密。如需了解控制平面,请使用 Access Transparency

您可以在执行以下任一操作时启用机密 GKE 节点:

  • 创建新集群
  • 创建新的节点池
  • 更新现有节点池

您无法更新现有集群来更改集群级机密 GKE 节点设置。

下表展示了在集群级或节点池级启用机密 GKE 节点时应用的 GKE 行为:

机密 GKE 节点设置 如何配置 行为
集群级 创建新集群 任何节点池的集群中的所有节点均使用机密 GKE 节点。您无法执行以下操作:
  • 为集群中的新节点池或现有节点池停用机密 GKE 节点
  • 在集群上停用机密 GKE 节点
  • 在现有集群上启用机密 GKE 节点
节点池级层
  • 创建新的节点池
  • 更新现有节点池
只有在集群级停用此功能时才能为节点池配置机密 GKE 节点。

价格

部署机密 GKE 节点无需额外费用,但需要支付 Compute Engine 机密虚拟机的费用。但是,机密 GKE 节点在启动时生成的日志数据可能比标准节点生成的日志数据要多一点。如需了解日志价格,请参阅 Google Cloud Observability 的价格

可用性

机密 GKE 节点适用于以下情况:

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

在集群上启用机密 GKE 节点

您可以使用 gcloud CLI 或 Google Cloud 控制台创建启用了机密 GKE 节点的新集群。如果在集群级层启用机密 GKE 节点,则集群中的所有节点均为机密虚拟机

gcloud

创建新集群时,请在 gcloud CLI 中指定 --enable-confidential-nodes 选项:

gcloud container clusters create CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --enable-confidential-nodes

替换以下内容:

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 标准部分中,点击配置

  4. 在导航窗格的集群下,点击安全

  5. 选中启用机密 GKE 节点复选框。

  6. 根据需要配置集群。

  7. 点击创建

如需详细了解如何创建集群,请参阅创建区域性集群

创建具有机密 GKE 节点的集群后,在此集群中创建的所有节点池都只能使用机密节点。您无法在启用了机密 GKE 节点的集群中创建常规节点池。您也无法在集群级启用机密 GKE 节点时在单个节点池上停用机密 GKE 节点。

在节点池上启用机密 GKE 节点

如果在集群级层停用机密 GKE 节点,您可以在特定节点池上启用机密 GKE 节点。

创建新的节点池

如需创建启用机密 GKE 节点的新节点池,请运行以下命令:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --enable-confidential-nodes

替换以下内容:

  • NODE_POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:您的集群的名称。
  • MACHINE_TYPE:节点池的机器类型,必须是 N2D 机器类型C2D 机器类型

更新现有节点池

您可以在使用 N2D 机器类型C2D 机器类型的现有节点池上启用机密 GKE 节点。运行以下命令:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-confidential-nodes

替换以下内容:

  • NODE_POOL_NAME:节点池的名称。
  • CLUSTER_NAME:您的集群的名称。

验证是否已启用机密 GKE 节点

在集群上

您可以使用 gcloud CLI 或 Google Cloud 控制台来验证集群正在使用机密 GKE 节点。

gcloud

描述集群:

gcloud container clusters describe CLUSTER_NAME

如果启用了机密 GKE 节点,则该命令的输出包括以下行:

confidentialNodes:
  enabled: true

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击您要检查的集群的名称。

  3. 安全下的机密 GKE 节点字段中,验证机密 GKE 节点已启用

在节点池上

如需验证您的节点池使用的是否是机密 GKE 节点,请运行以下命令:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster=CLUSTER_NAME

如果启用了机密 GKE 节点,则输出类似于以下内容:

confidentialNodes:
  enabled: true

节点上

如需验证特定节点的机密性,您可以执行以下操作:

  1. 验证 AMD SEV 已启用,或
  2. 使用 Cloud Monitoring 验证机密虚拟机

在机密 GKE 节点上运行应用

Google 的机密计算方法是为现有应用启用轻松的直接原样迁移。您当前运行的 GKE 工作负载无需更改代码即可在机密 GKE 节点上运行。

(可选)如果要以声明方式表明工作负载只能在具有机密 GKE 节点的集群上运行,您可以使用 cloud.google.com/gke-confidential-nodes 节点选择器。以下是使用此选择器的 Pod 规范示例:

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: my-confidential-app
    image: us-docker.pkg.dev/myproject/myrepo/my-confidential-app
  nodeSelector:
    cloud.google.com/gke-confidential-nodes: "true"

设置组织政策限制条件

您可以定义组织政策限制条件,以确保整个组织中创建的所有虚拟机资源都是机密虚拟机实例。对于 GKE,您可以自定义限制非机密计算限制条件,以要求在启用机密 GKE 节点的情况下创建所有新集群。强制执行组织政策限制条件时,将 container.googleapis.com API 服务名称添加到拒绝列表,例如:

gcloud resource-manager org-policies deny \
    constraints/compute.restrictNonConfidentialComputing compute.googleapis.com container.googleapis.com \
    --project=PROJECT_ID

PROJECT_ID 替换为您的项目 ID。

为适用于平衡 Hyperdisk 的机密模式创建 PersistentVolume

如需获得允许的吞吐量或 IOPS 值指南,请参阅规划 Hyperdisk 卷的性能级别

以下示例展示了如何为每种 Hyperdisk 类型创建适用于平衡 Hyperdisk StorageClass 的机密模式:

平衡 Hyperdisk

  1. 将以下清单保存在名为 confidential-hdb-example-class.yaml 的文件中:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: balanced-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced
      provisioned-throughput-on-create: "250Mi"
      provisioned-iops-on-create: "7000"
      enable-confidential-storage: true
      disk-encryption-kms-key: "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/HSM_KEY_NAME"
    

    替换以下内容:

    • KMS_PROJECT_ID:拥有 Cloud KMS 密钥的项目
    • REGION:磁盘所在的区域
    • KEY_RING:包含密钥的密钥环的名称
    • HSM_KEY_NAME:用于加密磁盘的 HSM 密钥的名称
  2. 创建 StorageClass:

    kubectl create -f hdb-example-class.yaml
    
  3. 创建适用于 GKE 的 Hyperdisk 永久性卷声明,该声明使用适用于平衡 Hyperdisk 卷的机密模式。

如需查找集群中可用的 StorageClass 的名称,请运行以下命令:

kubectl get sc

限制

机密 GKE 节点具有以下限制:

实时迁移限制

某些 Compute Engine 机密虚拟机机器类型支持实时迁移,这可最大限度地减少主机维护事件对工作负载造成的干扰。实时迁移发生在以下 GKE 版本中:

  • 1.27.10-gke.1218000 及更高版本
  • 1.28.6-gke.1393000 及更高版本
  • 1.29.1-gke.1621000 及更高版本

如果您的节点池在添加实时迁移时已运行受支持的版本,请手动将节点池升级到相同或其他受支持的版本。升级节点会触发节点重新创建,并且新节点已启用实时迁移。

如需详细了解哪些 Compute Engine 机器类型支持实时迁移,请参阅受支持的配置

如果在不支持实时迁移的节点上发生主机维护事件,则该节点会进入 NotReady 状态。运行 Pod 将会中断,直到节点再次准备就绪为止。如果维护时间超过五分钟,GKE 可能会尝试在其他节点上重新创建 Pod。

停用机密 GKE 节点

停用机密 GKE 节点仅适用于已启用机密 GKE 节点的节点池。如果集群是使用机密 GKE 节点创建的,则无法停用该功能。运行以下命令以停用节点池上的机密 GKE 节点:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --no-enable-confidential-nodes

后续步骤