kubectl 連 EKS 的完整驗證鏈路,以及一個容易誤判的坑
kubectl exec 被 Forbidden 時,常見反射動作是「換一個權限更高的 AWS profile」,但如果卡住的地方不在 AWS IAM,而在更下游,換 profile 不會有任何效果。這篇整理完整鏈路,以及一個實際踩過、很容易忽略的環境變數優先權問題。
完整鏈路
1. 你執行 kubectl exec ...
↓
2. kubectl 查目前 current-context,取得對應的 cluster + user 設定
↓
3. kubectl 執行 user.exec 裡指定的指令
(通常是 aws eks get-token --cluster-name ... --profile <profile>)
↓
4. aws CLI 用該 profile 的憑證去問 AWS STS:這組憑證代表誰?
↓
5. AWS 回一個短期的 EKS token 給 kubectl
↓
6. kubectl 拿這個 token 去打 EKS API server
↓
7. EKS API server 反查 aws-auth ConfigMap,
把這個 AWS 身份映射成一個 k8s 使用者
↓
8. k8s RBAC 判斷這個映射後的使用者,有沒有權限做這個操作
↓
9. 有權限 → 執行;沒權限 → Forbidden
aws eks update-kubeconfig 做的事只是把第 2-3 步需要的設定寫進 ~/.kube/config,不是建立連線,也不是建立 AWS profile——它只是引用一個早就存在的 profile。之後每次 kubectl 操作,才會即時重跑第 3-6 步換一次短期 token(token 通常幾分鐘到幾小時過期,所以每次動態換發,不是寫死永久憑證)。
Profile 與 STS 不是同一層東西
- Profile:一組登入 AWS 的憑證設定,存在
~/.aws/credentials或~/.aws/config,是「你要用哪組身份」的靜態設定 - STS(Security Token Service):AWS 的一個服務,用來驗證身份、換發臨時憑證。
aws sts get-caller-identity只是「問 AWS 我現在的憑證代表誰」,本身不是一組 profile,是拿來驗證用的 API
--profile ti-eks-prod 不會建立新 profile,是使用一個既有的 profile;如果這個 profile 不存在,指令會直接報錯找不到。