排查 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
-
-
在左侧导航窗格中,选择集群,然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。
-
选择附加组件选项卡。
-
选择附加组件框右上角的框,然后选择 Edit(编辑)。
-
在配置
name of addon
页面上:-
在版本下拉列表中选择
v1.14.0-eksbuild.3
或更高版本。 -
展开可选配置设置。
-
输入顶级 JSON 键
"nodeAgent":
,值是一个在配置值中键为"enablePolicyEventLogs":
且值为"true"
的对象。生成的文本必须是有效的 JSON 对象。以下示例显示网络策略和网络策略日志已启用,并将网络策略日志发送到 CloudWatch Logs:{ "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "true" } }
-
下面的屏幕截图为此场景的一个示例。
- AWS CLI
-
-
运行以下 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,则可以更新配置以编写网络策略日志。-
运行以下命令以启用网络策略。
helm upgrade --set nodeAgent.enablePolicyEventLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
-
- kubectl
-
如果您已通过
kubectl
安装 Amazon VPC CNI plugin for Kubernetes,则可以更新配置以编写网络策略日志。-
在编辑器中打开
aws-node
DaemonSet
。kubectl edit daemonset -n kube-system aws-node
-
在 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/
下;对于自行管理的 K8S 集群,日志将放在 cluster-name
/cluster//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
-
-
在左侧导航窗格中,选择集群,然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。
-
选择附加组件选项卡。
-
选择附加组件框右上角的框,然后选择 Edit(编辑)。
-
在配置
name of addon
页面上:-
在版本下拉列表中选择
v1.14.0-eksbuild.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
-
-
运行以下 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。-
运行以下命令以启用网络策略日志并将它们发送到 CloudWatch Logs。
helm upgrade --set nodeAgent.enablePolicyEventLogs=true --set nodeAgent.enableCloudWatchLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
-
- kubectl
-
-
在编辑器中打开
aws-node
DaemonSet
。kubectl edit daemonset -n kube-system aws-node
-
在 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
要运行此命令,您可以使用任何方法连接到节点。