0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EBS CSI Driverが動かない!TerraformでTaint環境のEKSアドオンを動かす設定スキーマ活用術

0
Posted at

※この記事は、個人技術ブログ 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の設定をトップレベルではなく、より深くネストされた構造(nodecontrollerプロパティの下)で期待していることを示唆していました。

どう解決したか(概要)

この問題を解決するアプローチは、各EKSアドオンが持つ設定スキーマを正確に把握し、Terraformのconfiguration_valuesをそれに合わせて記述することです。LBYL(Look Before You Leap)の原則に従い、AWS CLIでスキーマを確認する手順を踏みました。

  1. スキーマの確認: aws eks describe-addon-configurationコマンドを使用して、EBS CSI Driverの設定スキーマを取得しました。これにより、Tolerationsがnodecontrollerの下にネストされていることを確認できました。

    例えば、EBS CSI Driverでは以下のようなネスト構造がスキーマで定義されていました:

    {
      "type": "object",
      "properties": {
        "node": { ... },
        "controller": { ... }
      }
    }
    
  2. 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アドオンを動かす設定スキーマ活用術

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?