我的 Amazon VPC Container Network Interface (CNI) 插件无法 Amazon Kubernetes Service (Amazon EKS) 中的 API 服务器。
简短描述
如果 ipamD 守护进程在 kube-proxy 添加 Kub ernetes 服务端口之前尝试连接到 API 服务器,那么 ipamD 和 API 服务器之间的连接将超时。要对这种情况进行问题排查,请检查 ipamD 和 kube-proxy 日志,然后比较每个日志的时间戳。
您还可以添加初始化容器。初始化容器等待 kube-proxy 创建 Kubernetes 服务端口。然后 aws-node pod 完成初始化以避免超时。
解决方法
查看 ipamD 和 kube-proxy 日志
ipamD 日志:
如果 ipamD 和 API 服务器之间的连接超时,则会收到以下错误:
"Failed to create client: error communicating with apiserver:
kube-proxy 日志:
kube-proxy 为 Worker 节点上的 Kubernetes API 服务器端点建立 iptables 路由。在 kube-proxy 建立路由后,您会看到以下消息:
Adding new service port \"default/kubernetes:https\"
比较日志之间的时间戳
ipamD 日志:
{"level":"error","ts":"2021-09-22T10:40:49.735Z","caller":"aws-k8s-agent/main.go:28","msg":"Failed to create client: error communicating with apiserver: Get https://10.77.0.1:443/version?timeout=32s: dial tcp 10.77.0.1:443: i/o timeout"}
kube-proxy 日志:
{"log":"I0922 10:41:15.267648 1 service.go:379] Adding new service port \"default/kubernetes:https\" at 10.77.0.1:443/TCP\n","stream":"stderr","time":"2021-09-22T10:40:49.26766844Z"}
在 ipamD 日志中,您可以看到 ipamD 守护进程尝试在 2021-09-22T10:40:49.735Z 连接到 API 服务器。连接超时且失败。在 kube-proxy 日志中,您可以看到 kube-proxy 在 2021-09-22T10:41:15.26766844Z 添加了 Kubernetes 服务端口。
添加初始化容器
要添加初始化容器,请完成以下步骤:
1. 修改 aws-node 规范,以便对 Kubernetes 服务名称进行 DNS 解析:
$ kubectl -n kube-system edit daemonset/aws-node
输出:
initContainers:
- name: init-kubernetes-api
image: busybox:1.28
command: ['sh', '-c', "until nc -zv ${KUBERNETES_PORT_443_TCP_ADDR} 443; do echo waiting for kubernetes Service endpoint; sleep 2; done"]
2. 验证 aws-node pod 是否创建了初始化容器:
$ kubectl get pods -n kube-system -w
输出:
...
kube-proxy-smvfl 0/1 Pending 0 0s
aws-node-v68bh 0/1 Pending 0 0s
kube-proxy-smvfl 0/1 Pending 0 0s
aws-node-v68bh 0/1 Pending 0 0s
aws-node-v68bh 0/1 Init:0/1 0 0s
kube-proxy-smvfl 0/1 ContainerCreating 0 0s
kube-proxy-smvfl 1/1 Running 0 6s
aws-node-v68bh 0/1 PodInitializing 0 9s
aws-node-v68bh 0/1 Running 0 16s
aws-node-v68bh 1/1 Running 0 53s