配置安全内核模块加载

借助 Google Kubernetes Engine (GKE) 安全内核模块加载功能,您可以在安全的 Container-Optimized OS 映像上运行需要已签名的树外 (OOT) 内核模块的工作负载。通过安全内核模块加载功能,您可以更好地控制在 CPU 或 TPU 节点上加载经过签名验证的模块这一过程,从而增强集群和节点池的安全状况。

安全内核模块加载的运作方式

默认情况下,GKE 节点会根据节点类型使用具有不同安全配置的不同 Container-Optimized OS 映像:

  • CPU 和 TPU 节点:使用启用了 Linux 安全模块 (LSM) Loadpin 的 Container-Optimized OS 映像。Loadpin 会限制任何 OOT 内核模块加载。此设置很安全,但会阻止加载 OOT 模块。
  • GPU 节点:使用停用了 Loadpin 的 Container-Optimized OS 映像。此设置允许加载 OOT 模块,例如安装 NVIDIA 驱动程序,但默认情况下安全性较低。

您可以通过以下方式启用安全内核模块加载:在节点池的 LinuxNodeConfig 中使用 NodeKernelModuleLoading.Policy 设置,或者在创建或更新集群或节点池时传递 --enable-kernel-module-signature-enforcement 标志。如果您在 CPU 或 TPU 节点池上将政策设置为 ENFORCE_SIGNED_MODULES,则会启用 Loadpin,但其会配置为允许从根文件系统外部加载内核模块。模块必须经过签名,并且系统仅允许经过 Google 签名的模块。

何时使用安全内核模块加载

如果您需要在任何 GKE 节点类型上加载 Google 签名的 OOT 内核模块(例如自定义驱动程序或 Lustre 等文件系统),请使用安全内核模块加载。借助此功能,您可以使用这些模块,而不会降低节点的安全状况。例如,您可以在 CPU 节点上加载所需的驱动程序,而无需使用限制较少的 GPU 映像类型。

要求和限制

在节点池上启用安全内核模块加载时,需要满足以下要求并遵守以下限制:

  • 支持的模块:仅允许使用经过 Google 签名的 OOT 模块。
  • cgroup v2:节点池必须使用 cgroup v2。Google Kubernetes Engine API 会拒绝在采用 cgroup v1 的节点池上启用此政策的请求。如需了解详情,请参阅 Kubernetes cgroup 文档
  • GKE 版本:此功能适用于 GKE 1.34.1-gke.2364000 版及更高版本的集群。
  • GPU 映像类型:只有 CPU 和 TPU 映像支持安全内核模块加载。不支持 GPU。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

配置安全内核模块加载政策

您可以为各个集群配置安全内核模块加载政策,也可以将其作为节点池设置进行配置。可用的政策包括:

  • ENFORCE_SIGNED_MODULES:强制要求任何树外内核模块都必须由 Google 签名。此政策要求节点池使用 cgroup v2。
  • DO_NOT_ENFORCE_SIGNED_MODULES:允许加载任何已签名或未签名的内核模块。这是默认行为。

如果您未指定政策,GKE 会使用默认行为,即不强制执行签名模块。

在集群上启用安全内核模块加载

如需在集群上启用安全内核模块加载,请完成以下任一步骤:

  • 如需在新集群上启用此功能,请运行以下命令:

    标准

    gcloud container clusters create CLUSTER_NAME \
       --location=LOCATION \
       --project=PROJECT_ID \
       --enable-kernel-module-signature-enforcement
    

    Autopilot

    gcloud container clusters create-auto CLUSTER_NAME \
       --location=LOCATION \
       --project=PROJECT_ID \
       --enable-kernel-module-signature-enforcement
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • LOCATION:集群的区域或可用区。
    • PROJECT_ID:您的项目 ID。
  • 如需在现有集群上启用此功能,请运行以下命令:

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • LOCATION:集群的区域或可用区。
    • PROJECT_ID:您的项目 ID。

    更新现有集群时,除非维护窗口阻止,否则节点会在下一个可用时机重新创建。

在节点池上启用安全内核模块加载

如需在节点池上启用安全内核模块加载,请完成以下任一步骤:

  • 如需在新节点池上启用此功能,请运行以下命令:

    gcloud container node-pools create NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    替换以下内容:

    • NODEPOOL_NAME:新节点池的名称。
    • CLUSTER_NAME:您的集群的名称。
    • LOCATION:集群的区域或可用区。
    • PROJECT_ID:您的项目 ID。
  • 如需在现有节点池上启用此功能,请运行以下命令:

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    替换以下内容:

    • NODEPOOL_NAME:要更新的节点池的名称。
    • CLUSTER_NAME:您的集群的名称。
    • LOCATION:集群的区域或可用区。
    • PROJECT_ID:您的项目 ID。

确认已设置安全内核模块政策

如需确认是否已为集群设置政策,请运行以下命令:

gcloud container node-pools describe NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID

在输出中,检查 linuxNodeConfig 部分。kernelModuleLoading 字段会显示当前政策:

...
config:
  linuxNodeConfig:
    kernelModuleLoading:
      policy: ENFORCE_SIGNED_MODULES
    cgroupMode: CGROUP_MODE_V2

停用安全内核模块加载

如需停用安全内核模块加载,请完成以下步骤之一:

  • 如需在集群上停用此功能,请运行以下命令:

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    
  • 如需在现有节点池上停用此功能,请运行以下命令:

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    

后续步骤