我的 Amazon VPC Container Network Interface (CNI) 外掛程式無法連至 Amazon Kubernetes Service (Amazon EKS) 的 API 伺服器。
簡短描述
如果 ipamD 常駐程式在 kube-proxy 新增 Kubernetes Service 連接埠之前嘗試連接到 API 伺服器,則 ipamD 和 API 伺服器之間的連線將逾時。若要疑難排解此狀況,請檢查 ipamD 和 kube-proxy 日誌,然後比較每個日誌的時間戳記。
您也可以新增 init 容器。init 容器等待 kube-proxy 建立 Kubernetes Service 連接埠。然後,aws-node Pod 會結束初始化以避免逾時。
解決方案
檢查 ipamD 和 kube-proxy 日誌
ipamD 日誌:
如果 ipamD 和 API 伺服器之間的連接逾時,您會收到下列錯誤:
"Failed to create client: error communicating with apiserver:
kube-proxy 日誌:
kube-proxy 會為工作節點上的 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 常駐程式試著連接到 API 伺服器,時間為 2021-09-22T10:40:49.735Z。連接逾時且失敗。在 kube-proxy 日誌中,您可以看到 kube-proxy 在 2021-09-22T10:41:15.26766844Z 時新增了 Kubernetes Service 連接埠。
新增 init 容器
若要新增 init 容器,請完成以下步驟:
1. 修改 aws-node 規格,讓 DNS 可解析 Kubernetes Service 名稱:
$ 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 是否建立了 init 容器:
$ 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