使用 Kubernetes 网络策略限制容器组(pod)网络流量 - Amazon EKS

使用 Kubernetes 网络策略限制容器组(pod)网络流量

您可以使用 Kubernetes 网络策略来限制进出 Pods 的网络流量。有关更多信息,请参阅 Kubernetes 文档中的网络策略

要使用此功能,您必须配置以下内容:

  1. 在 Pod 启动时设置策略实施。您可以在 VPC CNI DaemonSetaws-node 容器中执行此操作。

  2. 为附加组件启用网络策略参数。

  3. 将集群配置为使用 Kubernetes 网络策略

开始之前,请查看注意事项。有关更多信息,请参阅 注意事项

先决条件

以下是使用此功能的先决条件:

* .集群最低版本现有 Amazon EKS 集群。要部署一个角色,请参阅开始使用 Amazon EKS。集群必须是 1.25 版本或更高版本的 Kubernetes。该集群必须运行下表中列出的 Kubernetes 版本和平台版本之一。请注意,所有比所列版本更高的 Kubernetes 和平台版本也受支持。您可以通过将以下命令中的 my-cluster 替换为集群名称,然后运行修改后的命令来检查当前的 Kubernetes 版本:

+

aws eks describe-cluster --name my-cluster --query cluster.version --output text

+

Kubernetes 版本 平台版本

1.27.4

eks.5

1.26.7

eks.6

1.25.12

eks.7

* .集群上的 Amazon VPC CNI plugin for Kubernetes 最低为 VPC CNI 1.14 或更高版本。您可以使用以下命令查看当前使用的版本。

+

kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

如果您的版本低于 1.14,请查看 更新 Amazon VPC CNI(Amazon EKS 附加组件) 将版本升级到 1.14 版本或更高版本。* .Linux 内核最低版本必须具有 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 启动时设置策略实施

Amazon VPC CNI plugin for Kubernetes 为容器组(pod)配置网络策略,同时进行容器组(pod)预置。在为新的容器组(pod)配置所有策略之前,新的容器组(pod)中的容器将从默认允许策略开始。这称为标准模式。默认允许策略意味着允许所有进出新容器组(pod)的入口和出口流量。例如,在使用生效的策略更新新的容器组之前,容器组不会强制执行任何防火墙规则(允许所有流量)。

NETWORK_POLICY_ENFORCING_MODE 变量设置为 strict 后,使用 VPC CNI 的容器组(pod)从默认拒绝策略开始,然后将配置策略。这称为严格模式。在严格模式下,您必须为集群中容器组(pod)需要访问的每个端点制定网络策略。请注意,此要求适用于 CoreDNS 容器组(pod)。未为带有主机网络的容器组(pod)配置默认拒绝策略。

您可以通过在 VPC CNI DaemonSetaws-node 容器中将环境变量 NETWORK_POLICY_ENFORCING_MODE 设置为 strict 来更改此默认网络策略。

env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"

步骤 2:为附加组件启用网络策略参数

默认情况下,网络策略功能使用节点上的端口 8162 获取指标。此外,该功能还使用端口 8163 进行运行状况探测。如果您在需要使用这些端口的节点或 Pod 内运行其他应用程序,则该应用程序将无法运行。在 VPC CNI 版本 v1.14.1 或更高版本中,您可以更改这些端口。

要为附加组件启用网络策略参数,请使用以下程序。

AWS Management Console
  1. 打开 Amazon EKS console 控制台

  2. 在左侧导航窗格中,选择集群,然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。

  3. 选择附加组件选项卡。

  4. 选择附加组件框右上角的框,然后选择 Edit(编辑)。

  5. 配置 name of add-on 页面上:

    1. 版本列表中选择 v1.14.0-eksbuild.3 或更高版本。

    2. 展开可选配置设置

    3. 配置值中输入 JSON 键 "enableNetworkPolicy": 和值 "true"。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据,请用大括号 { } 将键和值括起来。

      以下示例启用了网络策略功能,并将指标和运行状况探测设置为默认端口号:

      { "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } }
Helm

如果您已通过 helm 安装 Amazon VPC CNI plugin for Kubernetes,则可以更新配置以更改端口。

  1. 运行以下命令以更改端口。分别在键 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
  1. 在编辑器中打开 aws-node DaemonSet

    kubectl edit daemonset -n kube-system aws-node
  2. 在 VPC CNI aws-node 守护程序集清单中 aws-network-policy-agent 容器的 args: 中,替换以下命令参数中的端口号。

    - args: - --metrics-bind-addr=:8162 - --health-probe-bind-addr=:8163

步骤 3:在每节点上挂载 Berkeley Packet Filter(BPF)文件系统

您必须在每个节点上挂载 Berkeley Packet Filter(BPF)文件系统。

注意

如果您的集群是版本 1.27 或更高版本,则可以跳过此步骤,因为所有 Amazon EKS 优化版 Amazon Linux 和 Bottlerocket AMI 1.27 或更高版本都已具有此功能。

对于所有其他集群版本,如果您将 Amazon EKS 优化版 Amazon Linux 升级到版本 v20230703 或更高版本,或者将 Bottlerocket AMI 升级到版本 v1.0.2 或更高版本,则可以跳过此步骤。

  1. 在每个节点上挂载 Berkeley Packet Filter(BPF)文件系统。

    sudo mount -t bpf bpffs /sys/fs/bpf
  2. 然后,将相同的命令添加到 Amazon EC2 Auto Scaling 的启动模板中的用户数据。

步骤 4:将集群配置为使用 Kubernetes 网络策略

将集群配置为使用 Kubernetes 网络策略。您可以为 Amazon EKS 附加组件或自行管理的附加组件设置此项。

AWS Management Console
  1. 打开 Amazon EKS console 控制台

  2. 在左侧导航窗格中,选择集群,然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。

  3. 选择附加组件选项卡。

  4. 选择附加组件框右上角的框,然后选择 Edit(编辑)。

  5. 配置 name of addon 页面上:

    1. 版本列表中选择 v1.14.0-eksbuild.3 或更高版本。

    2. 展开可选配置设置

    3. 配置值中输入 JSON 键 "enableNetworkPolicy": 和值 "true"。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据,请用大括号 { } 将键和值括起来。以下示例显示网络策略已启用:

      { "enableNetworkPolicy": "true" }

      下面的屏幕截图为此场景的一个示例。

      <shared id="consolelong"/> 在可选配置中显示带有网络策略的 VPC CNI 附加组件。
AWS CLI
  1. 运行以下 AWS CLI 命令。将 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:iam::123456789012:role/AmazonEKSVPCCNIRole \ --resolve-conflicts PRESERVE --configuration-values '{"enableNetworkPolicy": "true"}'
Helm

如果您已通过 helm 安装 Amazon VPC CNI plugin for Kubernetes,则可以更新配置以启用网络策略。

  1. 运行以下命令以启用网络策略。

    helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
  1. 在编辑器中打开 amazon-vpc-cni ConfigMap

    kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
  2. 将以下行添加到 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"
  3. 在编辑器中打开 aws-node DaemonSet

    kubectl edit daemonset -n kube-system aws-node
  4. 在 VPC CNI aws-node 守护程序集清单中 aws-network-policy-agent 容器的 args: 中,将命令参数 --enable-network-policy=false 中的 false 替换为 true

    - args: - --enable-network-policy=true

第 5 步。后续步骤

完成配置后,确认 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 对象并将它们部署到集群。NetworkPolicy 对象的范围限定到命名空间。您可以实施策略,根据标签选择器、命名空间和 IP 地址范围来允许或拒绝 Pods 之间的流量。有关创建 NetworkPolicy 对象的更多信息,请参阅 Kubernetes 文档中的网络策略

Kubernetes NetworkPolicy 对象的执行是使用 Extended Berkeley Packet Filter(eBPF)实施的。与基于 iptables 的实施相比,它具有更低的延迟和性能,包括降低 CPU 利用率和避免顺序查找。此外,eBPF 探测器还可以访问上下文丰富的数据,帮助调试复杂的内核级问题并提高可观测性。Amazon EKS 支持基于 eBPF 的导出器,该导出器利用探测器记录每个节点上的策略结果,并将数据导出到外部日志收集器以帮助调试。有关更多信息,请参阅 eBPF 文档