How to solve the ALB ingress “cannot resolve pod ENI for pods” when increase max pods at Amazon EKS

2021-08-13 AWS

承上篇「Amazon EKS increase IP address with network interface prefixes」部署完後發生的一段小插曲,足足搞了我快一整天的時間,在我高興測試完成之餘開始 deploy Pods 到 ALB 後又踩到坑了,AWS Load Balancer Controller 又開始發脾氣不把 Pods register 到 Target Group,這篇來紀錄踩坑過程。

遇到這個問題先拆解一下 ALB Controller 的運作方式來猜想可能卡住的地方:

  1. 首先當 pods scale 時 ALB Controller 就會啟動
  2. ALB Controller 會透過 ServiceAccount “aws-load-balancer-controller” assume role 到 AWS IAM
  3. AWS IAM 將會信任來自 Identity provider (Amazon EKS OIDC) 使用這個 IAM Role
  4. IAM Role 建立 ALB, Target group
  5. IAM Role 將 Network interface IP and port 註冊到 Target group

在上述的流程中 1~4 都有如期完成,代表幾件事:

  • AWS Controller 安裝正確
  • ServiceAccount 和 IAM Role mapping 正確
  • IAM Role 對於 ALB, Target group 權限正確

那為何 5 沒辦法成功?多數情況直接查 ALB Controller 應該可以看出一二:

$ kubectl logs -f <alb-controller-pod-name> -n kube-system

從上面我拿到了一段錯誤訊息:

{“level”:”error”,”ts”:1628694619.1477168,”logger”:”controller”,”msg”:”Reconciler error”,”reconcilerGroup”:”elbv2.k8s.aws”,”reconcilerKind”:”TargetGroupBinding”,”controller”:”targetGroupBinding”,”name”:”k8s-game2048-service2-53662e4bd8″,”namespace”:”game-2048″,”error”:”cannot resolve pod ENI for pods: [game-2048/deployment-2048-c8b7b7d78-bnw8j]”}

cannot resolve pod ENI for pods 看起來問題是出在 ALB Controller 處理 Network interface 時出了狀況,反覆測試之後確認在沒有使用 network interface prefix 之前是正常的,加上 prefix 之後 ALB Controller 就發瘋不工作了。

過程中反覆餵 Google 其實沒找到對應的答案,後來跟高手同事討論後發現 ALB Controller v2.2.2 版本加了一條功能「Improvement – add support for pods supported by IPv4Prefix on ENI」如果要使用 IPv4 prefix 看起來 ALB Controller 至少要用到 v2.2.2+ 以上的版本才有支援。

Upgrade ALB Controller v2.2.2+

升級 ALB Controller 版本可以直接 kubectl edit 更改 deployment

$ kubectl edit deployment/aws-load-balancer-controller -n kube-system

直接將 ALB Controller image 改成對應 ECR region 的 v2.2.2 版本,以 us-east-1 為例:

us-east-1

602401143452.dkr.ecr.us-east-1.amazonaws.com/amazon/aws-load-balaa
ncer-controller:v2.2.2

kubectl rollout 並重啟 pods 使其生效

$ kubectl rollout restart deployment/aws-load-balancer-controller

最後確認一下 rollout 是否完成:

$ kubectl -n kube-system rollout status deployment aws-load-balancer-controller

最後再測試一次 deployment 後就成功了,整個故事告訴當你正在實作一個很新的功能時,Google 可能也沒辦法幫助你,那麼就看 Github release note 或是 issues 了!

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱