承上篇「Amazon EKS increase IP address with network interface prefixes」部署完後發生的一段小插曲,足足搞了我快一整天的時間,在我高興測試完成之餘開始 deploy Pods 到 ALB 後又踩到坑了,AWS Load Balancer Controller 又開始發脾氣不把 Pods register 到 Target Group,這篇來紀錄踩坑過程。
遇到這個問題先拆解一下 ALB Controller 的運作方式來猜想可能卡住的地方:
- 首先當 pods scale 時 ALB Controller 就會啟動
- ALB Controller 會透過 ServiceAccount “aws-load-balancer-controller” assume role 到 AWS IAM
- AWS IAM 將會信任來自 Identity provider (Amazon EKS OIDC) 使用這個 IAM Role
- IAM Role 建立 ALB, Target group
- 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 了!