帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
使用 Kubernetes 网络策略限制容器组(pod)网络流量
您可以使用 Kubernetes 网络策略来限制进出容器组(pod)的网络流量。有关更多信息,请参阅 Kubernetes 文档中的网络策略
要使用此功能,您必须配置以下内容:
-
在容器组(pod)启动时设置策略实施。您可以在 VPC CNI
DaemonSet的aws-node容器中执行此操作。 -
为附加组件启用网络策略参数。
-
将集群配置为使用 Kubernetes 网络策略
开始之前,请查看注意事项。有关更多信息,请参阅 注意事项。
先决条件
以下是使用此功能的先决条件:
最低集群版本
现有 Amazon EKS 集群。要部署一个角色,请参阅开始使用 Amazon EKS。该集群当前运行的必须是下表中列出的 Kubernetes 版本和平台版本之一。请注意,也支持所有比所列版本更高的 Kubernetes 和平台版本。您可以通过将以下命令中的 my-cluster 替换为集群名称,然后运行修改后的命令来检查当前的 Kubernetes 版本:
aws eks describe-cluster --name my-cluster --query cluster.version --output text
| Kubernetes 版本 | 平台版本 |
|---|---|
|
|
|
|
|
|
最低 Amazon CNI 版本
要同时创建标准 Kubernetes 网络策略和管理员网络策略,您需要运行 1.21 版的 VPC CNI 插件。您可以使用以下命令查看当前使用的版本。
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
如果您的版本低于 1.21,请查看 更新 Amazon VPC CNI(Amazon EKS 附加组件) 将版本升级到 1.21 版本或更高版本。
最低 Amazon 内核版本
您的节点必须具有 Linux 内核版本 5.10 或更高版本。您可以使用 uname -r 检查您的内核版本。如果您使用的是最新版本的 Amazon EKS 优化 Amazon Linux、Amazon EKS 优化版加速型 Amazon Linux AMI 和 Bottlerocket AMI,则已拥有所需的内核版本。
Amazon EKS 优化加速的 Amazon Linux AMI 版本 v20231116,或更高版本拥有内核版本 5.10。
第 1 步:在容器组(pod)启动时设置策略实施
适用于 Kubernetes 的 Amazon VPC CNI 插件为容器组(pod)配置网络策略,同时进行容器组(pod)预置。在为新的容器组(pod)配置所有策略之前,新的容器组(pod)中的容器将从默认允许策略开始。这称为标准模式。默认允许策略意味着允许所有进出新容器组(pod)的入口和出口流量。例如,在使用生效的策略更新新的容器组之前,容器组不会强制执行任何防火墙规则(允许所有流量)。
将 NETWORK_POLICY_ENFORCING_MODE 变量设置为 strict 后,使用 VPC CNI 的容器组(pod)从默认拒绝策略开始,然后将配置策略。这称为严格模式。在严格模式下,您必须为集群中容器组(pod)需要访问的每个端点制定网络策略。请注意,此要求适用于 CoreDNS 容器组(pod)。未为带有主机网络的容器组(pod)配置默认拒绝策略。
您可以通过在 VPC CNI DaemonSet 的 aws-node 容器中将环境变量 NETWORK_POLICY_ENFORCING_MODE 设置为 strict 来更改此默认网络策略。
env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"
第 2 步:为附加组件启用网络策略参数
默认情况下,网络策略功能使用节点上的端口 8162 获取指标。此外,该功能还使用端口 8163 进行运行状况探测。如果您在需要使用这些端口的节点或 Pod 内运行其他应用程序,则该应用程序将无法运行。在 VPC CNI v1.14.1 版或更高版本中,您可以更改这些端口。
要为附加组件启用网络策略参数,请使用以下程序。
Amazon Web Services 管理控制台
-
打开 Amazon EKS 控制台
。 -
在左侧导航窗格中,选择集群,然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。
-
选择附加组件选项卡。
-
选择附加组件框右上角的框,然后选择 Edit(编辑)。
-
在配置
Amazon VPC CNI页面上:-
在版本列表中选择
v1.14.0-eksbuild.3或更高版本。 -
展开可选配置设置。
-
在配置值中输入 JSON 键
"enableNetworkPolicy":和值"true"。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据,请用大括号{ }将键和值括起来。以下示例启用了网络策略功能,并将指标和运行状况探测设置为默认端口号:
{ "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } }
-
Helm
如果已通过 helm 安装适用于 Kubernetes 的 Amazon VPC CNI 插件,则可以更新配置以更改端口。
-
运行以下命令以更改端口。分别在键
nodeAgent.metricsBindAddr或键nodeAgent.healthProbeBindAddr的值中设置端口号。helm upgrade --set nodeAgent.metricsBindAddr=8162 --set nodeAgent.healthProbeBindAddr=8163 aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
-
在编辑器中打开
aws-nodeDaemonSet。kubectl edit daemonset -n kube-system aws-node -
在 VPC CNI
aws-node守护程序集清单中aws-network-policy-agent容器的args:中,替换以下命令参数中的端口号。- args: - --metrics-bind-addr=:8162 - --health-probe-bind-addr=:8163
步骤 3:将集群配置为使用 Kubernetes 网络策略
您可以为 Amazon EKS 附加组件或自行管理的附加组件设置此项。
使用 Amazon CLI,您可以通过运行以下命令将集群配置为使用 Kubernetes 网络策略。将 my-cluster 替换为集群的名称,并将 IAM 角色 ARN 替换为您正在使用的角色。
aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.14.0-eksbuild.3 \ --service-account-role-arn arn:aws-cn:iam::123456789012:role/AmazonEKSVPCCNIRole \ --resolve-conflicts PRESERVE --configuration-values '{"enableNetworkPolicy": "true"}'
要使用 Amazon 管理控制台配置此项,请按以下步骤操作:
-
打开 Amazon EKS 控制台
。 -
在左侧导航窗格中,选择集群,然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。
-
选择附加组件选项卡。
-
选择附加组件框右上角的框,然后选择 Edit(编辑)。
-
在配置
Amazon VPC CNI页面上:-
在版本列表中选择
v1.14.0-eksbuild.3或更高版本。 -
展开可选配置设置。
-
在配置值中输入 JSON 键
"enableNetworkPolicy":和值"true"。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据,请用大括号{ }将键和值括起来。以下示例显示网络策略已启用:{ "enableNetworkPolicy": "true" }下面的屏幕截图为此场景的一个示例。
-
Helm
如果已通过 helm 安装适用于 Kubernetes 的 Amazon VPC CNI 插件,则可以更新配置以启用网络策略。
-
运行以下命令以启用网络策略。
helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
-
在编辑器中打开
amazon-vpc-cniConfigMap。kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml -
将以下行添加到
ConfigMap中的data。enable-network-policy-controller: "true"添加该行后,您的
ConfigMap应该看起来像下面的示例。apiVersion: v1 kind: ConfigMap metadata: name: amazon-vpc-cni namespace: kube-system data: enable-network-policy-controller: "true" -
在编辑器中打开
aws-nodeDaemonSet。kubectl edit daemonset -n kube-system aws-node-
在 VPC CNI
aws-node守护程序集清单中aws-network-policy-agent容器的args:中,将命令参数--enable-network-policy=false中的false替换为true。- args: - --enable-network-policy=true
-
步骤 4:后续步骤
完成配置后,确认 aws-node 容器组(pod)正在您的集群上运行。
kubectl get pods -n kube-system | grep 'aws-node\|amazon'
示例输出如下。
aws-node-gmqp7 2/2 Running 1 (24h ago) 24h aws-node-prnsh 2/2 Running 1 (24h ago) 24h
版本 1.14 及更高版本的 aws-node 容器组中有 2 个容器。在以前的版本中,如果禁用网络策略,则 aws-node 容器组(pod)中只有 1 个容器。
您现在可以将 Kubernetes 网络策略部署到集群。
要实施 Kubernetes 网络策略,您可以创建 Kubernetes NetworkPolicy 或 ClusterNetworkPolicy 对象并将其部署到集群。NetworkPolicy 对象的范围限定为命名空间,而 ClusterNetworkPolicy 对象的范围可限定为整个集群或多个命名空间。您可以实施策略,根据标签选择器、命名空间和 IP 地址范围来允许或拒绝容器组(pod)之间的流量。有关创建 NetworkPolicy 对象的更多信息,请参阅 Kubernetes 文档中的网络策略
Kubernetes NetworkPolicy 对象的执行是使用 Extended Berkeley Packet Filter(eBPF)实施的。与基于 iptables 的实施相比,它具有更低的延迟和性能,包括降低 CPU 利用率和避免顺序查找。此外,eBPF 探测器还可以访问上下文丰富的数据,帮助调试复杂的内核级问题并提高可观测性。Amazon EKS 支持基于 eBPF 的导出程序,该导出程序利用探测器记录每个节点上的策略结果,并将数据导出到外部日志收集器以帮助调试。有关更多信息,请参阅 eBPF 文档