※この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
PythonでJSONを扱う際、ネストが深くてアクセスが面倒くさい...そんな経験はありませんか? EKS(Elastic Kubernetes Service)環境でも、同様の課題に直面することがあります。特に、Ciliumなどの導入のためにノードグループにTaint(汚染)を設定した場合、CoreDNSやEBS CSI Driverといった標準的なEKSアドオンがデプロイに失敗するケースに遭遇しました。
何が起きたか(課題)
Taintを設定したノードグループに対してEKSアドオンをデプロイしようとすると、特定のEBS CSI DriverでInvalidParameterExceptionが発生し、デプロイが失敗するという問題に直面しました。
- Taint設定後、CoreDNSなどは
aws_eks_addonリソースのconfiguration_valuesでTolerationsを設定すれば動作した。 - しかし、AWS EBS CSI Driverに対して同じ設定を試みると、
InvalidParameterExceptionが発生した。 - エラーメッセージは、設定値がアドオンのスキーマ定義に適合していないことを示していた(
Json schema validation failed)。
このエラーは、EBS CSI DriverがTolerationsの設定をトップレベルではなく、より深くネストされた構造(nodeやcontrollerプロパティの下)で期待していることを示唆していました。
どう解決したか(概要)
この問題を解決するアプローチは、各EKSアドオンが持つ設定スキーマを正確に把握し、Terraformのconfiguration_valuesをそれに合わせて記述することです。LBYL(Look Before You Leap)の原則に従い、AWS CLIでスキーマを確認する手順を踏みました。
-
スキーマの確認:
aws eks describe-addon-configurationコマンドを使用して、EBS CSI Driverの設定スキーマを取得しました。これにより、Tolerationsがnodeやcontrollerの下にネストされていることを確認できました。例えば、EBS CSI Driverでは以下のようなネスト構造がスキーマで定義されていました:
{ "type": "object", "properties": { "node": { ... }, "controller": { ... } } } -
Terraform設定の修正: スキーマに基づき、Terraformの
aws_eks_addonリソース内のconfiguration_valuesをJSONエンコードする際に、ネスト構造を正確に再現しました。
CoreDNSなどの場合、Tolerationsはトップレベルで記述可能でしたが、EBS CSI Driverでは、デーモンセットとして動作するnodeコンポーネントと、コントローラーとして動作するcontrollerコンポーネントそれぞれに対してTolerationsをネストして定義する必要がありました。
CoreDNSの標準的な設定例:
configuration_values = jsonencode({
tolerations = [{
"key" : "node.cilium.io/agent-not-ready",
"operator" : "NoExecute",
"effect" : "NoExecute"
}]
})
EBS CSI Driverにおけるネストされた設定例(一部省略):
configuration_values = jsonencode({
node : { tolerations : [
{ key : "node.cilium.io/agent-not-ready", operator : "NoExecute", effect : "NoExecute" }
]},
controller : { tolerations : [
{ key : "node.cilium.io/agent-not-ready", operator : "NoExecute", effect : "NoExecute" }
]}
})
また、Taintのキーや値が固定されていない場合は、operator = "Exists"を利用して、特定のeffectを持つTaintを汎用的に容認する設定も試しました。
効果(Before/After)
スキーマに準拠した設定をTerraformで適用した結果、InvalidParameterExceptionは解消され、Taintが設定されたノードに対してもEBS CSI Driverのアドオンが正常にデプロイされるようになりました。これにより、Ciliumなどの他のTaintを必要とするコンポーネントとの共存が可能になりました。
- Before: EBS CSI Driverのデプロイ失敗(
InvalidParameterException)。 - After: Taintノード上でもEBS CSI Driverが正常に動作し、PodがRunning状態になった。
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。
👉 EBS CSI Driverが動かない!TerraformでTaint環境のEKSアドオンを動かす設定スキーマ活用術