Site icon Mr. 沙先生

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

承上篇「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 都有如期完成,代表幾件事:

那為何 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 了!

Exit mobile version