排查 Amazon EKS 的 Kubernetes 网络策略问题 - Amazon EKS

排查 Amazon EKS 的 Kubernetes 网络策略问题

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

网络策略日志

网络策略是允许还是拒绝连接将记录在流日志中。每个节点上的网络策略日志包括每个具有网络策略的容器组(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 附加组件

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 键 "nodeAgent":,值是一个在配置值中键为 "enablePolicyEventLogs": 且值为 "true" 的对象。生成的文本必须是有效的 JSON 对象。以下示例显示网络策略和网络策略日志已启用,并将网络策略日志发送到 CloudWatch Logs:

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

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

<shared id="consolelong"/>在可选配置中显示带有网络策略和 CloudWatch Logs 的 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 '{"nodeAgent": {"enablePolicyEventLogs": "true"}}'

自行管理的附加组件

Helm

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

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

    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 附加组件

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 键 "nodeAgent":,值是一个在配置值中键为 "enableCloudWatchLogs": 且值为 "true" 的对象。生成的文本必须是有效的 JSON 对象。以下示例显示网络策略和网络策略日志已启用,并将日志发送到 CloudWatch Logs:

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

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

+ image::images/console-cni-config-network-policy-logs-cwl.png[AWS Management Console 显示可选配置中带有网络策略和 CloudWatch Logs 的 VPC CNI 附加组件,scaledwidth=80%]

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 '{"nodeAgent": {"enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true"}}'

自行管理的附加组件

Helm

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

  1. 运行以下命令以启用网络策略日志并将它们发送到 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

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