使用用户管理的加密密钥在 GKE 中加密传输中的数据


本页面介绍如何使用用户管理的加密密钥为 Google Kubernetes Engine (GKE) 节点之间的 Pod 通信启用传输中的数据加密。

默认情况下,Google 会在网络接口控制器 (NIC) 层级加密虚拟机之间所有传输中的数据,以便确保传输中的数据的机密性,而无论虚拟机上运行什么服务或应用(包括 GKE)。此加密层适用于所有 GKE 节点和 Pod 流量。加密密钥由 Google 提供和管理。

借助适用于 GKE 的节点间透明加密,Google 可让您更好地控制用于跨 GKE 节点加密 Pod 流量的加密密钥。除了虚拟机 NIC 提供的默认加密之外,GKE 还会使用 GKE Dataplane V2 中的 WireGuard 执行此加密。

如果您从事的是受监管的行业,并且有法规遵从和安全审核方面的业务需求,则直接在 GKE 中提供对加密密钥的控制会非常有用。

您可以在单集群和多集群环境中启用节点间透明加密。如需详细了解此功能的工作原理,请参阅节点间透明加密如何与 GKE 配合使用

限制

  • 此功能本身并不能保证 Google 无法访问存储在 GKE 节点内存中的加密密钥。在某些受监管的环境或管辖区中,或者为了满足特定的法规遵从要求,您可能需要进一步加密这些密钥并控制访问权限。为此,我们建议您将节点间透明加密与使用客户管理的加密密钥 (CMEK) 的机密 GKE 节点配合使用。使用 CMEK 的机密 GKE 节点会使用您管理的密钥加密节点的内存内容。

  • 只有 GKE Dataplane V2 集群才支持适用于 GKE 的节点间透明加密。

  • 不支持 GKE Autopilot。

  • 适用于 GKE 的节点间透明加密使用 WireGuard。WireGuard 不符合 FIPS 要求。

  • 加密密钥不会动态轮替。需要通过重启节点来手动处理密钥轮替。

  • 节点间透明加密以及机密 GKE 节点仅适用于 Container-Optimized OS (COS) 和 Ubuntu,而不适用于 Windows。

  • 节点间透明加密不会使用 hostNetwork 加密由 GKE 节点或 Pod 发起的网络流量。

  • 节点间透明加密不会加密发送到节点端口上公开的 Pod 的网络流量。即使在 Service 上配置了 ExternalTrafficPolicy: Cluster,从接收来自客户端的流量的第一个节点转发到后端 Pod 的流量也不会进行加密。

  • 在为单集群或多集群配置启用了节点间透明加密的情况下,支持的最大节点数量为 500。

  • 节点间透明加密可能会导致节点超额订阅。在使用 Ubuntu 操作系统且具有 2 Gbps 吞吐量的 n2-standard-8 节点上,预计 CPU 利用率可能会平均增加 15%。

    CPU 利用率的增加不是由任何 Pod 引起的,因为 kube-scheduler 不会感知到它。流量增加的 Pod 可能会使用节点上的所有 CPU 资源。这可能会妨碍其他 Pod 获取所需的 CPU 资源,即使它们配置正确也是如此。这可能会导致尝试运行敏感工作负载或需要能够快速响应请求的 Pod 出现问题。作为一种解决方案,您可以在启用了节点间透明加密的节点上使大量 CPU 资源保持为未调度状态。或者,您也可以调度一个 PriorityClass 较低的 Pod,该 Pod 具有大型 CPU 请求,但从不使用此 CPU。

  • 节点间透明加密会在同一可用区中的两个不使用机密 GKE 节点的节点上产生 150 微秒的延迟时间。

  • 启用节点间透明加密后,用于跟踪 Pod 上流量的流量可观测性功能可能无法按预期运行,因为传输中的数据使用底层 Google 基础架构无法访问的密钥进行加密。

  • 启用节点间透明加密后,Pod IP 地址在 VPC 上不可见。依赖于数据包检查的功能(例如数据包镜像和基于 Pod CIDR 的 VPC 防火墙规则)与节点间透明加密不兼容。

  • 在挂接到不同 VPC 子网的集群之间启用节点间透明加密时,您需要手动创建防火墙规则,以允许集群节点之间进行通信。

  • 节点间透明加密会停用 GKE Dataplane V2 的某些第 7 层功能。因此,您无法同时启用 FQDN 网络政策和节点间透明加密。

  • 您无法在启用节点内可见性的同时启用此功能。

准备工作

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

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

  • 只有 Google Cloud CLI 458.0.0 版及更高版本和以下 GKE 版本才支持 GKE 节点间透明加密:

    • 1.26.10-gke.1024000 或更高版本
    • 1.27.7-gke.1506000 或更高版本
    • 1.28.2-gke.1098000 或更高版本

使用 GKE 启用节点间透明加密

您可以在单个集群或多集群环境中使用 GKE 启用节点间透明加密。

在新集群上启用节点间透明加密

  1. 如需在新集群上启用节点间透明加密,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --region=REGION \
        --enable-datapane-v2 \
        --in-transit-encryption inter-node-transparent
    

    替换以下内容:

    • CLUSTER_NAME 替换为您的集群名称。
    • REGION 替换为集群的计算区域。
  2. 如需验证配置,请使用以下命令检查加密状态:

    kubectl -n kube-system exec -ti anetd-XXXX -- cilium status | grep Encryption
    

    输出类似于以下内容:

    Encryption: Wireguard [cilium_wg0 (Pubkey: <key>, Port: 51871, Peers: 2)]
    

在现有集群上启用节点间透明加密

  1. 如需在现有集群上启用节点间透明加密,请运行以下命令:

    gcloud container clusters update CLUSTER_NAME \
      --in-transit-encryption inter-node-transparent \
      --region=REGION
    

    替换以下内容:

    • CLUSTER_NAME 替换为您的集群名称。
    • REGION 替换为集群的计算区域。
  2. 如需检查 Google Cloud CLI 命令是否成功完成,请运行以下命令:

    gcloud container clusters describe CLUSTER_NAME \
        --region=REGION \
        --format json | jq .status
    

    替换以下内容:

    • CLUSTER_NAME 替换为您的集群名称。
    • REGION 替换为集群的计算区域。

    等待直到状态显示“RUNNING”。在 GKE 中启用节点间加密会自动重启节点。节点重启以及新节点强制执行政策可能需要几个小时才能完成。

  3. 如需确认节点已重启,请运行以下命令:

    kubectl get nodes
    

    检查每个节点的 AGE 字段,如果 AGE 字段反映了新节点,则继续操作。

  4. 如需验证配置,您可以使用以下命令检查加密状态:

    kubectl -n kube-system exec -ti anetd-XXXX -- cilium status | grep Encryption
    

    输出类似于以下内容:

    Encryption: Wireguard [cilium_wg0 (Pubkey: <key>, Port: 51871, Peers: 2)]
    

    验证在集群中,对等体数量是否比节点数量少 1。例如,在含有 24 个节点的集群中,对等体数量应是 23。如果在集群中,对等体数量不是比节点数量少 1,则再次在节点上重启 anetd 代理。

跨集群启用节点间透明加密

Autopilot 集群不支持节点间透明加密。如果您的舰队包含 Autopilot 集群,这些集群会无法与启用了加密的 Standard 集群通信。

如需在多集群环境中启用节点间透明加密,请执行以下操作:

  1. 新集群现有集群中启用节点间透明加密。

  2. 向舰队注册集群

  3. 为舰队启用节点间透明加密:

    gcloud container fleet dataplane-v2-encryption enable --project PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

  4. 验证所有节点上的状态:

    kubectl -n kube-system get pods -l k8s-app=cilium -o name | xargs -I {} kubectl -n kube-system exec -ti {} -- cilium status
    

    输出类似于以下内容:

    ...
    Encryption: Wireguard [cilium_wg0 (Pubkey: <key>, Port: 51871, Peers: 5)]
    ...
    

停用节点间透明加密

在某些情况下,您可能需要在 GKE 集群中停用节点间透明加密,以提高性能或排查应用的连接问题。在继续此操作之前,请考虑以下事项:

  • 节点间透明加密针对整个集群启用,您无法在单独的 Kubernetes 资源(例如命名空间或 Pod)中部分停用该功能。

  • 请在维护窗口期间执行此操作,因为此操作可能会中断 Pod 的流量。

在单个集群上

如需在单个集群上停用节点间透明加密,请运行以下命令:

gcloud container clusters update CLUSTER_NAME \
    --region=REGION \
    --in-transit-encryption none

替换以下内容:

  • CLUSTER_NAME:替换为您的集群的名称。

  • REGION:替换为您的集群的计算区域。

在作为舰队一部分的集群中停用

您可以使用以下两个选项之一为舰队中的集群关闭加密:

  • 如需从舰队中完全移除集群,请取消注册集群

  • 或者,将集群保留在舰队中,但停用加密:

    gcloud container fleet dataplane-v2-encryption disable --project PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

    如果使用此命令停用加密,则系统会从每个集群上的 Wireguard 对等体列表中移除远程节点。此过程可能需要几分钟才能完成,具体取决于涉及的集群和节点的数量。如需查看更新后的对等体数量,您需要在每个集群上手动刷新 WireGuard 对等体列表。您可以使用集群管理工具或以下命令:

    kubectl -n kube-system exec -ti anetd-XXXX -- cilium status | grep Encryption
    

为整个集群舰队停用

  • 如需在舰队中停用节点间透明加密,请运行以下命令:

    gcloud container fleet dataplane-v2-encryption disable --project PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

  • 如需停用节点间透明加密并移除现在未使用的 API,请在舰队层级停用 GKE Dataplane V2 API。这将关闭在舰队中运行的 GKE Dataplane V2 控制器。

    gcloud services disable gkedataplanev2.googleapis.com \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

    如需高效管理同名的集群并确保激活多集群加密,请按照以下步骤操作:

    1. 先从舰队中取消注册旧集群,然后再创建同名的新集群。

    2. 在重新创建时重新注册新集群。

    3. 如果您忘记取消注册集群,请删除旧成员资格,然后使用新的成员资格重新创建新集群。

    如果未按照这些步骤操作,则可能会导致多集群加密不会在新集群上激活,直到重新创建舰队成员资格。

节点间透明加密如何与 GKE 配合使用

以下部分介绍在集群中启用节点间透明加密后该功能的工作原理:

不同节点上两个 Pod 之间的网络流量加密

启用节点间透明加密后,如果 Pod 位于不同的节点上,则 GKE Dataplane V2 会加密 Pod 到 Pod 流量,无论这些节点所属的集群如何。如果集群属于同一舰队,则它们属于同一加密网域。

具有不同节点间透明加密配置的集群可以在同一舰队中共存。如果您的多集群环境中只有部分集群使用节点间透明加密,则需要注意以下事项:

  • 同一集群中各个节点之间的 Pod 到 Pod 通信使用公钥/私钥对进行加密。

  • 启用了节点间透明加密的集群中的节点与未启用节点间透明加密的集群中的节点之间的 Pod 到 Pod 通信会失败。

加密密钥生成和使用

启用此功能后,集群中的每个 GKE 节点都会自动生成一个公钥/私钥对,称为“加密密钥”。

  • 私钥存储在内存中(而不是磁盘上),并且从不会离开节点。使用 GKE 机密节点可进一步降低密钥被破解的风险,因为节点内存也会进行加密(使用不同的密钥)。

  • 公钥使用 GKE Dataplane V2 控制平面与其他节点共享,并且可供同一加密网域中的所有节点访问。

交换密钥后,每个节点都可以与同一加密网域中的其他节点建立 WireGuard 隧道。每个隧道都是唯一的,用于给定的一对节点。

在处理私钥或公钥对和会话密钥时,请考虑以下事项:

  • 私钥/公钥对

    • 公钥会在集群分发,并且集群中的所有节点都可以访问公钥。

    • 密钥对会在节点重启时进行轮替。GKE 不会定期轮替密钥。如需手动触发密钥轮替,请排空并重启节点。这会使原始密钥对失效,并生成新密钥对。

  • 会话密钥

    • 此密钥不可配置。

    • 此密钥每两分钟定期轮替一次。

    • 会话密钥仅用于隧道中涉及的节点。

后续步骤