MSK IAM Auth JAR Classpath 管理¶
概念概覽
Kafka client 連接 AWS MSK(IAM 認證)時,aws-msk-iam-auth JAR 必須存在於 container 的 classpath 中。此頁面涵蓋 Bitnami Kafka image 的 JAR 載入機制、CLASSPATH 環境變數 patch 的已知異常、image 升級時 JAR 遺失導致的 rolling update 間歇性失敗模式,以及透過 Dockerfile 固定 JAR 的永久修法與驗證流程。
核心知識¶
JAR 部署需求¶
AWS MSK 使用 IAM 認證時,Kafka client container 必須在 classpath 中包含 aws-msk-iam-auth JAR:
- Bitnami Kafka image 預設路徑:
/opt/bitnami/kafka/libs/aws-msk-iam-auth-2.3.2-all.jar(約 14MB) - 缺少時的錯誤訊息:
IAMClientCallbackHandler could not be found(或ConfigException: Class could not be found) - Dockerfile 加入方式:
Bitnami Image 的 JAR 載入機制¶
Bitnami Kafka image 的 JAR 載入有兩種可能模式,需確認實際行為:
- 目錄掃描:自動掃描
/opt/bitnami/kafka/libs/下所有 JAR → 若是此模式,CLASSPATH 環境變數 patch 無意義 - CLASSPATH 環境變數:依賴明確設定的 CLASSPATH → 若是此模式,需調查 patch 為何未生效
CLASSPATH Patch 已知異常¶
透過 kubectl patch deployment 注入 CLASSPATH 後,kubectl exec 確認顯示為空。可能原因:
- Bitnami image 啟動腳本覆蓋或不使用 CLASSPATH 環境變數
- patch 的環境變數格式不正確
- 容器使用的 shell 設定優先於 Kubernetes 注入的環境變數
結論:不應依賴 CLASSPATH 環境變數 patch,應直接將 JAR 打入 Docker image。
Rolling Update 期間的間歇性失敗模式¶
image 升級時容易遺漏此 JAR,因 K8s rolling update 特性會出現「部分 Pod 成功、部分失敗」的間歇性問題:
這種間歇性成功極容易誤導排查方向(例如:某次 snapshot 測試成功,實際上是打到舊 Pod)。
診斷指令¶
# 確認 JAR 是否存在於 container
kubectl exec <pod> -- ls /opt/bitnami/kafka/libs/ | grep msk
# 確認 CLASSPATH 環境變數(Bitnami image 中通常為空)
kubectl exec <pod> -- env | grep CLASSPATH
# 實際連線測試(唯一能確認修復有效的方式)
kubectl exec <pod> -- kafka-topics.sh \
--bootstrap-server <msk-endpoint> \
--list \
--command-config /opt/bitnami/kafka/config/client.properties
驗證流程¶
維護 verify-kafka.sh 腳本,每次 image 更新後執行,輸出 ALL CHECKS PASSED 才算完成。CI build 階段也應加入 JAR 存在性驗證步驟,防止升級時意外遺漏。
經驗教訓¶
-
JAR 上傳成功或 ls 確認存在,不等於 Kafka client 能正常使用——必須執行 kafka-topics.sh 實際連線 MSK 才能確認修復有效
-
MSK IAM auth 問題的第一排查步驟:確認 JAR 是否在 container 的 /opt/bitnami/kafka/libs/ 目錄下
-
間歇性成功(舊 Pod 正常、新 Pod 失敗)是 rolling update 期間 JAR 遺失的典型症狀,不可用單次成功推斷問題已解決
-
image 升級後必須立即執行 verify 腳本,不能靠過去的成功記錄推斷新 image 也正常
-
Bitnami Kafka image 的 JAR 載入機制需要確認,不能假設 CLASSPATH 環境變數一定有效
常見陷阱¶
-
CLASSPATH 環境變數 patch 在 Bitnami image 中可能無效,image 啟動腳本可能覆蓋該變數,需確認 JAR 載入機制
-
ConfigException 'Class could not be found' 容易誤判為設定值錯誤,實際上是 classpath / JAR 遺失問題
-
rolling update 期間新舊 Pod 並存,導致間歇性成功,容易誤判問題已修復——需確認所有新 Pod 皆正常
-
ImagePullBackOff 的失敗 Pod 不會自動清除,需手動刪除讓 controller 重新 reconcile
最佳實踐¶
-
kafka-client Dockerfile 明確加入
COPY aws-msk-iam-auth-*.jar /opt/bitnami/kafka/libs/,是最可靠的永久修法 -
JAR 版本固定在 Dockerfile 中(如
aws-msk-iam-auth-2.3.2-all.jar),避免版本漂移 -
CI build 階段加入 JAR 存在性驗證步驟,防止 image 升級時意外遺漏
-
每次 image 更新後執行 verify-kafka.sh,確認輸出 ALL CHECKS PASSED
-
修復後必須執行端對端測試(kafka-topics.sh 實際連線 MSK),而不只是確認 JAR 存在
相關概念¶
- EKS Node Group Migration Runbook
- Jenkins Pipeline kubectl exec Target
- K8s 多站點分支 Image 部署診斷
- Kubernetes emptyDir Runtime Dependency Anti-Pattern
來源 Sessions¶
| 日期 | Session | 貢獻摘要 |
|---|---|---|
| - | a8e3a9b9-80d0-4bdd-b09d-be69ab423f5d | 融合自原始頁面 msk-iam-auth-jar-classpath |
| - | e9680a7b-7572-4a2f-949b-d4d7c75a4e96 | 融合自原始頁面 msk-iam-auth-jar-dependency |