为 Kubernetes 网络策略配置集群 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为 Kubernetes 网络策略配置集群

默认情况下,Kubernetes 对集群中任何 Pods 之间或 Pods 与任何其他网络中的资源之间的 IP 地址、端口或连接没有限制。您可以使用 Kubernetes 网络策略来限制进出 Pods 的网络流量。有关更多信息,请参阅 Kubernetes 文档中的网络策略

如果您的集群上有 1.13 版本或更早版本的 Amazon VPC CNI plugin for Kubernetes,则需要实施第三方解决方案来将 Kubernetes 网络策略应用于集群。1.14 版本或更高版本的插件可以实施网络策略,因此您无需使用第三方解决方案。在本主题中,您将了解如何将集群配置为在不使用第三方附加组件的情况下在集群上使用 Kubernetes 网络策略。

Amazon VPC CNI plugin for Kubernetes 中的网络策略在以下配置中受支持。

  • 1.25 版本及更高版本的 Amazon EKS 集群。

  • 集群上 1.14 版本或更高版本的 Amazon VPC CNI plugin for Kubernetes。

  • IPv4IPv6 地址配置的集群。

  • 您可以将网络策略与 Pods 的安全组结合使用。通过网络策略,您可以控制集群内的所有通信。借助 Pods 的安全组,您可以控制从 Pod 中的应用程序对 Amazon Web Services 的访问。

  • 您可以将网络策略与自定义网络前缀委派结合使用。

注意事项

  • 当使用 Amazon VPC CNI plugin for Kubernetes 将 Amazon VPC CNI plugin for Kubernetes 网络策略应用于集群时,您只能将策略应用于 Amazon EC2 Linux 节点。无法将策略应用于 Fargate 或 Windows 节点。

  • 如果您的集群当前使用第三方解决方案来管理 Kubernetes 网络策略,则可以将这些策略与 Amazon VPC CNI plugin for Kubernetes 结合使用。但是,您必须删除现有的解决方案,使其不再管理相同的策略。

  • 您可以对同一 Pod 应用多个网络策略。当配置两个或多个选择相同 Pod 的策略时,所有策略都将应用于 Pod。

  • 网络策略中每个 ingress:egress: 选择器中每个协议的唯一端口组合数最多为 24 个。

  • 对于任何 Kubernetes 服务,服务端口必须与容器端口相同。如果您使用的是命名端口,也请在服务规范中使用相同的名称。

  • Pod 启动时的策略实施

    Amazon VPC CNI plugin for Kubernetes 为容器组(pod)配置网络策略,同时进行容器组(pod)预置。在为新的容器组(pod)配置所有策略之前,新的容器组(pod)中的容器将从默认允许策略开始。这称为标准模式。默认允许策略意味着允许所有进出新容器组(pod)的入口和出口流量。

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

    env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"

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

  • 网络策略功能创建并需要一个名为 policyendpoints.networking.k8s.awsPolicyEndpoint 自定义资源定义(CRD)。自定义资源的 PolicyEndpoint 对象由 Amazon EKS 管理。您不应该修改或删除这些资源。

  • 如果您运行的容器组(pod)使用实例角色 IAM 凭证或连接到 EC2 IMDS,请注意检查是否存在会阻止访问 EC2 IMDS 的网络策略。您可能需要添加网络策略以允许访问 EC2 IMDS。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的实例元数据和用户数据

    对服务账户使用 IAM 角色的容器组(pod)无法访问 EC2 IMDS。

  • Amazon VPC CNI plugin for Kubernetes 不会将网络策略应用于每个容器组的其他网络接口,而只应用于每个容器组的主接口(eth0)。这会影响以下架构:

    • ENABLE_V4_EGRESS 变量设置为 trueIPv6 容器组。此变量使 IPv4 出口功能能够将 IPv6 容器组连接到 IPv4 端点,例如集群外部的端点。IPv4 出口功能的工作原理是使用本地环回 IPv4 地址创建一个额外的网络接口。

    • 使用诸如 Multus 之类的链式网络插件时。由于这些插件为每个容器组添加了网络接口,因此网络策略不适用于链式网络插件。

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

    Amazon Web Services Management Console
    1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

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

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

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

    5. Configure name of addon(配置 name of addon)页面上:

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

      2. 展开可选配置设置

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

        以下示例启用了网络策略功能,启用了网络策略日志,将网络策略日志发送到 Amazon CloudWatch Logs,并且指标和运行状况探测设置为默认端口号:

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

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

    • 运行以下命令以更改端口。分别在键 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

先决条件

  • 最低集群版本

    现有 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 CNI 版本

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

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

    如果您的版本低于 1.14,请查看 更新 Amazon EKS 附加组件 将版本升级到 1.14 版本或更高版本。

  • 最低 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

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

  1. 挂载 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 的启动模板中的用户数据。

  2. 在 VPC CNI 中启用网络策略
    1. 查看集群上当前安装的附加组件类型。根据您创建集群时使用的工具,您的集群上目前可能没有安装 Amazon EKS 附加组件类型。将 my-cluster 替换为您集群的名称。

      aws eks describe-addon --cluster-name my-cluster --addon-name vpc-cni --query addon.addonVersion --output text

      如果返回来的是版本号,则表明您的集群上安装有 Amazon EKS 类型的附加组件,而且此流程中其余的步骤,您也不需要走完。如果返回来的是一个错误,则表明您的集群上没有安装 Amazon EKS 类型的附加组件。

      • Amazon EKS 附加组件

        Amazon Web Services Management Console
        1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

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

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

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

        5. Configure name of addon(配置 name of addon)页面上:

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

          2. 展开可选配置设置

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

            { "enableNetworkPolicy": "true" }

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

          
                              Amazon Web Services Management Console 在可选配置中显示带有网络策略的 VPC CNI 附加组件。
        Amazon CLI
        • 运行以下 Amazon 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,则可以更新配置以启用网络策略。

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

          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
  3. 确认 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

    如果启用网络策略,则 aws-node 容器组(pod)中有 2 个容器。在以前的版本中,如果禁用网络策略,则 aws-node 容器组(pod)中只有 1 个容器。

    您现在可以将 Kubernetes 网络策略部署到集群。有关更多信息,请参阅 Kubernetes 网络策略

Stars 网络策略演示

该演示在您的 Amazon EKS 集群上创建前端、后端和客户端服务。该演示还创建管理图形用户界面,用于显示各服务之间可用的传入和传出路径。我们建议您在不运行生产工作负载的集群上完成演示。

在您创建任何网络策略之前,所有服务可以双向通信。在应用网络策略后,您可以看到客户端只能与前端服务进行通信,而后端只能接受来自前端的流量。

运行 Stars 策略演示
  1. 应用前端、后端、客户端和管理用户界面服务:

    kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml
  2. 请查看集群上的所有 Pods。

    kubectl get pods -A

    示例输出如下。

    在输出中,您应该会在以下输出中显示的命名空间中看到容器。容器组(pod)的 NAMESREADY 列中的容器组(pod)数量与以下输出中的不同。在看到具有相似名称的容器并且它们在 STATUS 列中都具有 Running 之前,请不要继续。

    NAMESPACE NAME READY STATUS RESTARTS AGE [...] client client-xlffc 1/1 Running 0 5m19s [...] management-ui management-ui-qrb2g 1/1 Running 0 5m24s stars backend-sz87q 1/1 Running 0 5m23s stars frontend-cscnf 1/1 Running 0 5m21s [...]
  3. 要连接到管理用户界面,请连接到集群上运行的 EXTERNAL-IP 服务:

    kubectl get service/management-ui -n management-ui
  4. 打开浏览器,进入上一步中的位置。您应该会看到管理用户界面。C 节点是客户端服务,F 节点是前端服务,B 节点是后端服务。每个节点都有到所有其他节点的完整通信访问权限(如粗体、彩色行所示)。

    
            打开网络策略
  5. starsclient 命名空间中应用以下网络策略,以将服务彼此隔离:

    kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: default-deny spec: podSelector: matchLabels: {}

    您可以使用以下命令将策略应用于两个命名空间:

    kubectl apply -n stars -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml kubectl apply -n client -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml
  6. 刷新您的浏览器。您可以看到管理用户界面不再能访问任何节点,因此它们不会显示在用户界面中。

  7. 应用以下不同的网络策略以允许管理用户界面访问这些服务。应用此策略以允许 UI:

    kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: stars name: allow-ui spec: podSelector: matchLabels: {} ingress: - from: - namespaceSelector: matchLabels: role: management-ui

    应用此策略以允许客户端:

    kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: client name: allow-ui spec: podSelector: matchLabels: {} ingress: - from: - namespaceSelector: matchLabels: role: management-ui

    您可以使用以下命令应用这两个策略:

    kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/allow-ui.yaml kubectl apply -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/allow-ui-client.yaml
  8. 刷新您的浏览器。您可以看到管理用户界面可以再次访问节点,但各节点无法相互通信。

    
            UI 访问网络策略
  9. 应用以下网络策略以允许流量从前端服务传到后端服务:

    kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: stars name: backend-policy spec: podSelector: matchLabels: role: backend ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379
  10. 刷新您的浏览器。您将看到前端可以与后端进行通信。

    
            前端到后端策略
  11. 应用以下网络策略以允许流量从客户端传到前端服务:

    kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: stars name: frontend-policy spec: podSelector: matchLabels: role: frontend ingress: - from: - namespaceSelector: matchLabels: role: client ports: - protocol: TCP port: 80
  12. 刷新您的浏览器。您将看到客户端可以与前端服务进行通信。前端服务仍可以与后端服务进行通信。

    
            最终网络策略
  13. (可选)完成该演示后,您可以删除其资源。

    kubectl delete -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml kubectl delete -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml kubectl delete -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml kubectl delete -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml kubectl delete -f https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml

    甚至在删除资源后,节点上仍可能存在网络策略端点,这些端点可能会以意想不到的方式干扰集群中的网络。删除这些规则的唯一可靠方法是重新启动节点或终止所有节点并将它们回收。要终止所有节点,请将自动扩缩组所需计数设置为 0,然后创建所需数量的备份,或者仅终止节点。

排查网络策略问题

您可以通过查看 网络策略日志 和运行 eBPF 软件开发工具包 中的工具,对使用网络策略的网络连接进行问题排查和调查。

网络策略日志

网络策略是允许还是拒绝连接将记录在流日志中。每个节点上的网络策略日志包括每个具有网络策略的容器组(pod)流日志。网络策略日志存储在 /var/log/aws-routed-eni/network-policy-agent.log。以下示例来自 network-policy-agent.log 文件:

{"level":"info","timestamp":"2023-05-30T16:05:32.573Z","logger":"ebpf-client","msg":"Flow Info: ","Src
IP":"192.168.87.155","Src Port":38971,"Dest IP":"64.6.160","Dest
Port":53,"Proto":"UDP","Verdict":"ACCEPT"}

默认情况下,网络策略日志被禁用。要启用网络策略日志,请按照下列步骤操作:

注意

网络策略日志需要为 VPC CNI aws-node 进程守护程序集清单中的 aws-network-policy-agent 容器额外提供 1 个 vCPU。

Amazon EKS 附加组件

Amazon Web Services Management Console
  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

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

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

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

  5. Configure name of addon(配置 name of addon)页面上:

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

    2. 展开可选配置设置

    3. 输入顶级 JSON 键 "nodeAgent":,值是一个在配置值中键为 "enablePolicyEventLogs": 且值为 "true" 的对象。生成的文本必须是有效的 JSON 对象。以下示例显示网络策略和网络策略日志已启用,并将网络策略日志发送到 CloudWatch Logs:

      { "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "true" } }

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


                  Amazon Web Services Management Console 在可选配置中显示带有网络策略和 CloudWatch Logs 的 VPC CNI 附加组件。
Amazon CLI
  • 运行以下 Amazon 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 '{"nodeAgent": {"enablePolicyEventLogs": "true"}}'

自行管理的附加组件

Helm

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

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

    helm upgrade --set nodeAgent.enablePolicyEventLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl

如果您已通过 kubectl 安装 Amazon VPC CNI plugin for Kubernetes,则可以更新配置以编写网络策略日志。

  1. 在编辑器中打开 aws-node DaemonSet

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

    - args: - --enable-policy-event-logs=true

将网络策略日志发送到 Amazon CloudWatch Logs

您可以使用 Amazon CloudWatch Logs 等服务监控网络策略日志。您可以使用以下方法将网络策略日志发送到 CloudWatch Logs。

对于 EKS 集群,策略日志将放在 /aws/eks/cluster-name/cluster/ 下;对于自行管理的 K8S 集群,日志将放在 /aws/k8s-cluster/cluster/ 下。

使用 Amazon VPC CNI plugin for Kubernetes 发送网络策略日志

如果启用网络策略,则会将第二个容器添加到节点代理aws-node 容器组(pod)。此节点代理可将网络策略日志发送到 CloudWatch Logs。

注意

节点代理仅发送网络策略日志。不包括 VPC CNI 生成的其他日志。

先决条件
  • 将以下权限作为节或单独的策略添加到您用于 VPC CNI 的 IAM 角色中。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:DescribeLogGroups", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
Amazon EKS 附加组件
Amazon Web Services Management Console
  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

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

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

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

  5. Configure name of addon(配置 name of addon)页面上:

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

    2. 展开可选配置设置

    3. 输入顶级 JSON 键 "nodeAgent":,值是一个在配置值中键为 "enableCloudWatchLogs": 且值为 "true" 的对象。生成的文本必须是有效的 JSON 对象。以下示例显示网络策略和网络策略日志已启用,并将日志发送到 CloudWatch Logs:

      { "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true", } }

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


                    Amazon Web Services Management Console 在可选配置中显示带有网络策略和 CloudWatch Logs 的 VPC CNI 附加组件。
Amazon CLI
  • 运行以下 Amazon 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 '{"nodeAgent": {"enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true"}}'
自行管理的附加组件
Helm

如果您已通过 helm 安装 Amazon VPC CNI plugin for Kubernetes,则可以更新配置以将网络策略日志发送到 CloudWatch Logs。

  • 运行以下命令以启用网络策略日志并将它们发送到 CloudWatch Logs。

    helm upgrade --set nodeAgent.enablePolicyEventLogs=true --set nodeAgent.enableCloudWatchLogs=true 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: 中,将两个命令参数 --enable-policy-event-logs=false--enable-cloudwatch-logs=false 中的 false 替换为 true

    - args: - --enable-policy-event-logs=true - --enable-cloudwatch-logs=true

使用 Fluent Bit 守护程序集发送网络策略日志

如果您在守护进程集中使用 Fluent Bit 从节点发送日志,则可以添加配置以包含来自网络策略的网络策略日志。您可以使用以下示例配置:

[INPUT] Name tail Tag eksnp.* Path /var/log/aws-routed-eni/network-policy-agent*.log Parser json DB /var/log/aws-routed-eni/flb_npagent.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

已包含 eBPF SDK

Amazon VPC CNI plugin for Kubernetes 在节点上安装 eBPF SDK 工具集。您可以使用 eBPF SDK 工具来识别网络策略问题。例如,以下命令列出了节点上正在运行的程序。

sudo /opt/cni/bin/aws-eks-na-cli ebpf progs

要运行此命令,您可以使用任何方法连接到节点。

Kubernetes 网络策略

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

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