本页面介绍如何为 Google Kubernetes Engine (GKE) 配置集群级网络政策。
网络政策和 FQDN 网络政策可帮助您定义 Pod 之间的通信流量规则。网络政策控制 Pod 如何在其应用内相互通信以及如何与外部端点通信。
作为集群管理员,您可以配置 Cilium 集群级网络政策 (CCNP),以克服管理集群级管理流量的网络政策限制。Cilium
集群级网络政策会对整个集群的所有工作负载强制执行网络规则。在 GKE 政策评估层次结构中,这些政策位于 NetworkPolicy 层级。虽然
CCNP 中的显式拒绝 规则会替换命名空间范围政策中的允许规则,但 CCNP 允许 规则与标准命名空间政策具有相同的优先级。
所有
CCNP 规则都从属于管理员层级中的政策。
GKE 的 Cilium 集群级网络政策是集群范围的 CustomResourceDefinition (CRD),用于指定 GKE 强制执行的政策。通过在 GKE 中启用 Cilium 集群级网络政策,您可以集中管理整个集群的网络规则。您可以控制进出集群的流量的基本第 3 层(IP 级)和第 4 层(端口级)访问权限。
优势
使用 Cilium 集群级网络政策,您可以:
- 实施集中式安全措施:借助 CCNP,您可以定义适用于整个集群的网络访问
规则。如果这些规则是显式拒绝 规则,则会替换命名空间级层中任何可能冲突的政策。CCNP 允许 规则与标准命名空间政策位于同一层级。对于强制执行,请使用
ClusterNetworkPolicy中的管理员层级。 - 保护多租户:如果您的集群托管多个团队或租户, 您可以通过实施专门针对网络流量控制的 CCNP 规则来保护共享集群内的隔离。您可以通过向特定团队分配命名空间或命名空间组来强制执行网络级分离。
- 定义灵活的默认政策:使用 CCNP,您可以为整个集群定义默认 网络规则。您可以根据需要自定义这些规则,而不会影响整体的集群安全性。
如需实施 CCNP,请在集群上启用 GKE Dataplane V2。确保已启用 CCNP CustomResourceDefinition,然后创建用于定义集群网络访问规则的政策。
准备工作
在开始之前,请确保您已完成以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如需使用 Google Cloud CLI 执行此任务,
请安装并
初始化
gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新 版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
要求
Cilium 集群级网络政策具有以下要求:
- Google Cloud CLI 465.0.0 版或更高版本。
- 您必须有一个运行以下版本的 GKE 集群:
- 1.28.6-gke.1095000 或更高版本
- 1.29.1-gke.1016000 或更高版本
- 您的集群必须使用 GKE Dataplane V2。
- 您必须启用 Cilium 集群级网络政策 CustomResourceDefinition。
限制
Cilium 集群级网络政策具有以下限制:
- 不支持第 7 层政策。
- 不支持节点选择器。
- 每个集群的
CiliumClusterwideNetworkPolicy数量上限为 1,000。
在新集群中启用 Cilium 集群级网络政策
您可以使用 Google Cloud CLI 或 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 集群级网络政策,您必须在创建新集群时指定以下选项:
datapathProvider 字段 在 networkConfig 对象 中。
{
"cluster": {
...
"networkConfig": {
"datapathProvider": "ADVANCED_DATAPATH",
"enableCiliumClusterwideNetworkPolicy": true
}
}
}
验证以下命令的输出中是否存在 ciliumclusterwidenetworkpolicies.cilium.io CustomResourceDefinition:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
输出应类似如下所示:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
在现有集群中启用 Cilium 集群级网络政策
您可以使用 Google Cloud CLI 或 Kubernetes Engine API 在现有集群中启用 Cilium 集群级网络政策。
gcloud
确认集群已启用 GKE Dataplane V2。
gcloud container clusters describe CLUSTER_NAME \ --location COMPUTE_LOCATION \ --format="value(networkConfig.datapathProvider)" \替换以下内容:
- 将
CLUSTER_NAME替换为您的集群名称。 - 将
COMPUTE_LOCATION替换为您的集群的位置。
- 将
使用
--enable-cilium-clusterwide-network-policy标志更新集群。gcloud container clusters update CLUSTER_NAME \ --location COMPUTE_LOCATION \ --enable-cilium-clusterwide-network-policy重启 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 CustomResourceDefinition:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
输出应类似如下所示:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
使用 Cilium 集群级网络政策
本部分列出了配置 Cilium 集群级网络政策的示例。
示例 1:控制工作负载的入站流量
以下示例允许带有标签 role=backend 的所有端点接受端口 80 上来自带有标签 role=frontend 的端点的入站连接。带有标签 role=backend 的端点将拒绝此政策不允许的所有入站连接。
将以下清单保存为
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应用清单:
kubectl apply -f l4-rule-ingress.yaml
示例 2:将来自某个工作负载的出站流量限制为指定端口
以下规则将带有标签 app=myService 的所有端点限制为只能在端口 80 上使用 TCP 将数据包发送到任何第 3 层目标:
将以下清单保存为
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应用清单:
kubectl apply -f l4-rule-egress.yaml
示例 3:将来自某个工作负载的出站流量限制为指定端口和 CIDR
以下示例将带有标签 role=crawler 的所有端点限制为只能在端口 80 上使用 TCP 协议将数据包发送到目标 CIDR 192.10.2.0/24。
将以下清单保存为
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应用清单:
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:
'user@example.com', groups: 'system:authenticated'.
可能原因
GKE 对 CCNP 有特定限制。GKE 的 Cilium 集成中不支持节点选择器和允许根据应用级数据(例如 HTTP 标头)进行过滤的第 7 层政策。
解决方法
如果您需要在 GKE 集群中使用高级的第 7 层过滤功能,请考虑使用 Cloud 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)。 错误消息表明集群中缺少 CustomResourceDefinition。
解决方法
在使用 CCNP 之前,请启用 Cilium 集群级网络政策 CustomResourceDefinition。
后续步骤
阅读有关网络政策的 Kubernetes 文档