使用网络政策控制集群级通信


本页面介绍如何为 Google Kubernetes Engine (GKE) 配置集群级网络政策。

网络政策和 FQDN 网络政策可帮助您定义 Pod 之间的通信流量规则。网络政策控制 Pod 如何在其应用内相互通信以及如何与外部端点通信。

作为集群管理员,您可以配置 Cilium 集群级网络政策 (CCNP),以克服管理集群级管理流量的网络政策限制。Cilium 集群级网络政策会对整个集群(跨命名空间)的所有工作负载强制执行严格的网络规则,并替换任何特定于应用的规则。

GKE 的 Cilium 集群级网络政策是集群范围的 CustomResourceDefinition (CRD),用于指定 GKE 强制执行的政策。通过在 GKE 中启用 Cilium 集群级网络政策,您可以集中管理整个集群的网络规则。您可以控制进出集群的流量的基本第 3 层(IP 级)和第 4 层(端口级)访问权限。

优势

使用 Cilium 集群级网络政策,您可以:

  • 实施集中式安全措施:借助 CCNP,您可以定义适用于整个网络的网络访问规则。这些 CCNP 规则充当顶级安全层,可覆盖命名空间级层任何可能存在冲突的政策。
  • 保护多租户:如果您的集群托管多个团队或租户,您可以通过实施专门针对网络流量控制的 CCNP 规则来保护共享集群内的隔离。您可以通过向特定团队分配命名空间或命名空间组来强制执行网络级分离。
  • 定义灵活的默认政策:使用 CCNP,您可以为整个集群定义默认网络规则。您可以根据需要自定义这些规则,而不会影响整体的集群安全性。

如需实施 CCNP,请在集群上启用 GKE Dataplane V2。确保已启用 CCNP CRD,然后创建为集群定义网络访问规则的政策。

准备工作

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

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

使用要求

Cilium 集群级网络政策具有以下要求:

  • Google Cloud CLI 465.0.0 版或更高版本。
  • 您必须有一个运行以下版本的 GKE 集群:
    • 1.28.6-gke.1095000 或更高版本
    • 1.29.1-gke.1016000 或更高版本
  • 您的集群必须使用 GKE Dataplane V2
  • 您必须启用 Cilium 集群级网络政策 CRD。

限制

Cilium 集群级网络政策具有以下限制:

  • 不支持第 7 层政策。
  • 不支持节点选择器。
  • 每个集群的 CiliumClusterwideNetworkPolicy 数量上限为 1,000。

在新集群中启用 Cilium 集群级网络政策

您可以使用 Google Cloud CLI 或 Google Kubernetes Engine API 在新集群中启用 Cilium 集群级网络政策。

gcloud

如需在新集群中启用 Cilium 集群级网络政策,请使用 --enable-cilium-clusterwide-network-policy 标志创建新集群。

Autopilot

gcloud container clusters create-auto CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy

替换以下内容:

  • CLUSTER_NAME 替换为您的集群名称。
  • COMPUTE_LOCATION 替换为您的集群的位置。

Standard

gcloud container clusters create CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy \
    --enable-dataplane-v2

替换以下内容:

  • CLUSTER_NAME 替换为您的集群名称。
  • COMPUTE_LOCATION 替换为您的集群的位置。

API

如需启用 Cilium 集群级网络政策,您必须在创建新集群时指定以下选项:

networkConfig 对象中的 datapathProvider 字段

{
  "cluster": {
    ...
    "networkConfig": {
      "datapathProvider": "ADVANCED_DATAPATH",
      "enableCiliumClusterwideNetworkPolicy": true
    }
  }
}

验证以下命令的输出中存在 ciliumclusterwidenetworkpolicies.cilium.io

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

输出应类似如下所示:

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

在现有集群中启用 Cilium 集群级网络政策

您可以使用 Google Cloud CLI 或 Google Kubernetes Engine API 在现有集群中启用 Cilium 集群级网络政策。

gcloud

  1. 确认集群已启用 GKE Dataplane V2

    gcloud container clusters describe CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --format="value(networkConfig.datapathProvider)" \
    

    替换以下内容:

    • CLUSTER_NAME 替换为您的集群名称。
    • COMPUTE_LOCATION 替换为您的集群的位置。
  2. 使用 --enable-cilium-clusterwide-network-policy 标志更新集群。

    gcloud container clusters update CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --enable-cilium-clusterwide-network-policy
    
  3. 重启 anetd DaemonSet。

    kubectl rollout restart ds -n kube-system anetd && \
        kubectl rollout status ds -n kube-system anetd
    

API

确认集群已启用 GKE Dataplane V2:

{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  },
  "name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  }
  "name": "cluster"
}

验证以下命令的输出中存在 ciliumclusterwidenetworkpolicies.cilium.io

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

输出应类似如下所示:

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

使用 Cilium 集群级网络政策

本部分列出了配置 Cilium 集群级网络政策的示例。

示例 1:控制工作负载的入站流量

以下示例允许带有标签 role=backend 的所有端点接受端口 80 上来自带有标签 role=frontend 的端点的入站连接。带有标签 role=backend 的端点将拒绝此政策不允许的所有入站连接。

  1. 将以下清单保存为 l4-rule-ingress.yaml

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-ingress"
    spec:
      endpointSelector:
        matchLabels:
          role: backend
      ingress:
        - fromEndpoints:
            - matchLabels:
                role: frontend
          toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. 应用清单:

    kubectl apply -f l4-rule-ingress.yaml
    

示例 2:将来自某个工作负载的出站流量限制为指定端口

以下规则将带有标签 app=myService 的所有端点限制为只能在端口 80 上使用 TCP 将数据包发送到任何第 3 层目标:

  1. 将以下清单保存为 l4-rule-egress.yaml

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-egress"
    spec:
      endpointSelector:
        matchLabels:
          app: myService
      egress:
        - toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. 应用清单:

    kubectl apply -f l4-rule-egress.yaml
    

示例 3:将来自某个工作负载的出站流量限制为指定端口和 CIDR

以下示例将带有标签 role=crawler 的所有端点限制为只能在端口 80 上使用 TCP 协议将数据包发送到目标 CIDR 192.10.2.0/24

  1. 将以下清单保存为 cidr-l4-rule.yaml

     apiVersion: "cilium.io/v2"
     kind: CiliumClusterwideNetworkPolicy
     metadata:
       name: "cidr-l4-rule"
     spec:
       endpointSelector:
         matchLabels:
           role: crawler
       egress:
         - toCIDR:
             - 192.0.2.0/24
           toPorts:
             - ports:
                 - port: "80"
                   protocol: TCP
    
  2. 应用清单:

    kubectl apply -f cidr-l4-rule.yaml
    

监控网络流量并进行问题排查

您可以利用网络政策日志记录GKE Dataplane V2 可观测性监控受 Cilium 集群级网络政策影响的网络流量并进行问题排查。

尝试使用第 7 层政策或节点选择器

症状

如果您将 GKE 与 GKE Dataplane V2 搭配使用,并且尝试定义包含第 7 层规则(例如 HTTP 过滤)和节点选择器的 CCNP 政策,则可能会看到类似如下的错误消息:

错误

Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'[email protected]', groups: 'system:authenticated'.

可能原因

GKE 对 CCNP 有特定限制。GKE 的 Cilium 集成中不支持节点选择器和允许根据应用级数据(例如 HTTP 标头)进行过滤的第 7 层政策。

解决方法

如果您需要在 GKE 集群中使用高级的第 7 层过滤功能,请考虑使用 Anthos Service Mesh。这可以提供更精细的应用级流量控制。

未启用 Cilium 集群级网络政策

症状

当您尝试在未明确启用 Cilium 集群级网络政策 (CCNP) 的集群中配置此功能时,您将无法进行配置,并且可能会看到类似如下的错误消息:

错误

error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first

可能原因

Cilium 集群级网络政策依赖于自定义资源定义 (CRD)。错误消息表明集群中缺少 CRD。

解决方法

在使用 CCNP 之前,启用 Cilium 集群级网络政策 CRD。

后续步骤