跳至内容

如何对 Amazon EKS 的 Amazon VPC CNI 插件问题进行故障排除?

3 分钟阅读
0

我想在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上使用 Amazon Virtual Private Cloud (Amazon VPC) 容器网络接口 (CNI) 插件。但是,我收到了错误。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

如果 Worker 节点因为 Amazon VPC CNI 插件未初始化而未准备就绪,则您会收到与以下示例类似的错误消息:

“容器运行时网络未准备就绪: NetworkReady=false reason:NetworkPluginNotReady message:Network 插件返回错误:CNI 插件未初始化”

要检查是否存在此问题,请运行以下命令:

kubectl describe node node_name

**注意:**将 node_name 替换为节点的名称。您可以在输出中找到 cni plugin no initialized(CNI 插件未初始化)的错误消息。

请执行以下操作以对此问题进行故障排除。

确认您已安装 Amazon VPC CNI 插件

如果集群中的 aws-node 容器组缺失,则您会收到一条错误消息,该消息与容器日志中的以下示例类似:

“CNI 配置加载失败:在 /etc/cni/net.d 中找不到网络配置:CNI 插件未初始化:无法加载 CNI 配置”

要解决此问题,请安装 Amazon VCP CNI 插件

检查 IAM 权限问题

要使用 Amazon VPC CNI 插件,请使用 AmazonEKS_CNI_Policy AWS Identity and Access Management (IAM) 托管式策略。或者,如果您使用自定义策略,请确保它包含以下权限:

 "ec2:AssignPrivateIpAddresses",
 "ec2:AttachNetworkInterface",
 "ec2:CreateNetworkInterface",
 "ec2:DeleteNetworkInterface",
 "ec2:DescribeInstances",
 "ec2:DescribeTags",
 "ec2:DescribeNetworkInterfaces",
 "ec2:DescribeInstanceTypes",
 "ec2:DescribeSubnets",
 "ec2:DetachNetworkInterface",
 "ec2:ModifyNetworkInterfaceAttribute",
 "ec2:UnassignPrivateIpAddresses"
 "ec2:CreateTags"

要识别缺失的 IAM 权限,请查看 /var/log/aws-routed-eni/ipamd.log 主机目录中的 L-IPAM 进程守护程序 (IPAMD) 日志。如果 Amazon VPC CNI 插件没有所需的 IAM 权限,则您会收到与以下示例类似的错误消息:

{"level":"error","ts":"2023-11-18T01:08:34.083Z","caller":"aws-k8s-agent/main.go:28","msg":"Initialization failure: ipamd init: failed to retrieve attached ENIs info: UnauthorizedOperation: You are not authorized to perform this operation.User: arn:aws:sts::XXXXXXXXXXXXXXXXXXXX:assumed-role/rolename is not authorized to perform: ec2:DescribeNetworkInterfaces because no identity-based policy allows the ec2:DescribeNetworkInterfaces action\n\tstatus code: 403, request id: request id"}

前面的示例错误消息显示该插件需要 ec2:DescribeNetworkInterfaces 权限。

如果您无法直接访问 Worker 节点,请检查 Worker 节点上的 aws-node 容器组。要识别 Worker 节点上的 aws-node 容器组,请运行以下命令:

kubectl describe node node_name

**注意:**将 node_name 替换为节点的名称。查看输出的 Non-terminated Pods(非终止的容器组)部分以获取 aws-node 容器组名称。

然后,运行以下命令来查看有关 aws-node 容器组的详细信息:

kubectl describe pod pod-name -n kube-system

**注意:**将 pod-name 替换为 aws-node 容器组名称。

在输出中,查看 Event(事件)以获取有关缺失权限的信息。

输出示例:

Type Reason Age From Message
---- ------ ---- ---- -------
Warning MissingIAMPermissions 105s (x2 over 105s) aws-node Unauthorized operation: failed to call ec2:DescribeNetworkInterfaces due to missing permissions. Please refer https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/iam-policy.md to attach relevant policy to IAM role in the event section you can able to see the error message also you can check the AWS cloud trail event for the particular instance by filtering the cloudtrail with username and provide the instanceID there.

或者,使用 AWS CloudTrail 检查是否有特定事件。例如,检查 DescribeNetworkInterfaces API 调用的用户名和实例 ID,以确定其是否已运行。

检查是否存在网络问题

Amazon VPC CNI 插件在运行时必须到达 API 服务器端点和 Amazon Elastic Compute Cloud (Amazon EC2) 端点。如果任一连接失败,则插件无法初始化,节点将变为 ** NotReady 状态**。

要检查特定的错误消息,请查看 /var/log/aws-routed-eni/ipamd.log 主机目录中的 IPAMD 日志。确保 kube-proxycoreDNS 容器组可以正常运行。

查看附加组件版本

最佳做法是将核心组件更新到最新版本。如果插件版本与您的 Kubernetes 集群版本不匹配,则该插件无法初始化。确保插件版本与 Kubernetes 集群版本兼容

对 Amazon VPC CNI 插件错误进行故障排除

要识别插件错误,请使用 SSH 连接到插件无法分配 IP 地址的 Worker 节点。然后,查看 /var/log/aws-routed-eni/ipamd.log 文件中的 IPAMD 日志中是否有错误消息。

IP 分配失败错误

当 Amazon VPC CNI 插件无法为计划到 Worker 节点的容器组分配 IP 地址时,将会出现 Failed to assign ip(IP 分配失败)错误。要识别该错误,您还可以查看 CloudTrail 事件历史记录页面上的 AssignPrivateIpAddresses 事件。

要确定分配的子网是否没有可用的 IP 地址,请运行以下 describe-subnets AWS CLI 命令:

aws ec2 describe-subnets --filters "Name=vpc-id,Values= VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'

**注意:**将 VPCID 替换为您的 VPC ID。

当您将 WARM_ENI_TARGETWARM_IP_TARGETMINIMUM_IP_TARGET 环境变量的值设置得过低时,也会出现 Failed to assign ip(IP 分配失败)错误。确保您的子网 CIDR 范围足够广泛,并为您的用例分配足够的 IP 地址。有关详细信息,请参阅 GitHub 网站上的 WARM_ENI_TARGET, WARM_IP_TARGET and MINIMUM_IP_TARGET

要检查环境变量的值,请运行以下命令来查看您的容器组详细信息:

kubectl describe pod pod-name -n kube-system

**注意:**将 pod-name 替换为 aws-node 容器组名称。

您可以更新 aws-node DaemonSet 中的环境变量:

env:
  - name: WARM_ENI_TARGET
    value: "1"
  - name: WARM_IP_TARGET
    value: "5"
  - name: MINIMUM_IP_TARGET
    value: "25"

或者,运行以下命令来更新环境变量:

kubectl set env ds aws-node -n kube-system WARM_ENI_TARGET=1 WARM_IP_TARGET=5 MINIMUM_IP_TARGET=25

如果您使用前缀委托模式且不使用专用容器组子网范围,则子网分段可能会导致插件失败。该插件必须为网络接口分配连续的 /28 IPv4 前缀范围和 /80 IPv6 前缀范围。有关前缀委派的详细信息,请参阅 GitHub 网站上的 ENABLE_PREFIX_DELEGATION

您无法直接检查子网分段。请检查您的子网 CIDR 范围内是否还有超过 16 个可用 IP 地址。如果您有足够的 IP 地址,但仍然经常收到 Failed to assign ip(IP 分配失败)错误,则问题通常是子网分段。要解决此问题,最佳做法是使用带有前缀委派的自定义网络为容器组建立专用子网。有关详细信息,请参阅 GitHub 网站上的 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG

无法获取容器组 ENI 配置****错误

如果您使用 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG 激活自定义网络但未创建 ENIConfig 资源,则会收到与以下示例类似的错误消息:

“{"level":"error","ts":"","caller":"ipamd/ipamd.go:798","msg":"Failed to get pod ENI config"}”

要检查集群中是否存在 ENIConfig 资源,请运行以下命令:

kubectl get eniconfig -o yaml

如果 ENIConfig 自定义资源不存在,请创建一个。有关自定义网络的详细信息,请参阅 GitHub 网站上的 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG

观看失败错误

如果您没有以正确的格式编写 YAML 文件,则可能会收到类似于以下示例的错误消息:

“无法观看 *v1alpha1.ENIConfig:无法列出 *v1alpha1.ENIConfig:json:无法将字符串解组到类型为 []string 的 Go 结构字段 ENIConfigSpec.items.spec.securityGroups”

此问题通常在 JSON 数据和 Go 数据类型定义不匹配时发生。前面的示例错误消息显示 securityGroups 字段存在问题。

要解决此问题,请运行以下命令来检查您的 JSON 数据:

kubectl describe ENIConfig

在命令的输出中,根据错误消息中发现的问题检查语法。例如,确保 JSON 中的 securityGroups 字段是字符串数组,而不是单个字符串。

输出示例:

cat >$az_1.yaml <<EOF
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
  name: us-west-2a
spec:
  securityGroups:
    - sg-0123456789abcdef0
  subnet: subnet-0123456789abcdef0
EOF
AWS 官方已更新 6 个月前