EKS のアドオン更新中に発生した ConfigurationConflict を解消する

Amazon EKS

Amazon EKS クラスターを v1.32 に更新する作業の一環として、eksctl update addon -f config.yaml コマンドでアドオンを更新したところ、vpc-cni アドオンの ConfigurationConflict エラーにより更新が停止する問題に遭遇しました。 問題の解消にあたり調べたことの備忘録です。

目次

  1. 発生したエラー
  2. 特にカスタマイズをしていないので、なぜ Conflict したのか分からない
  3. エラーメッセージを頼りに AWS 公式資料を探す
  4. オプションについて調べる
  5. --resolve-conflict を省略したときのデフォルト値は分からない
  6. --configuration-values オプションでアドオンの設定値を変更できる
  7. --resolve-conflict OVERWRITE オプションで解消
  8. まとめ

発生したエラー

eksctl update addon を実行すると、通常は数分でアドオンの更新が終わりますが、コマンドが実行中のまま先に進まなくなりました。EKS のコンソールを見ると、vpc-cni アドオンの更新に失敗しており、次のようなエラーが表示されていました。

AddonVersion
v1.20.4-eksbuild.1

Error code
ConfigurationConflict

Error message
Conflicts found when trying to apply. Will not continue due to resolve conflicts mode. Conflicts: CustomResourceDefinition.apiextensions.k8s.io policyendpoints.networking.k8s.aws - .spec.versions

eksctl update addon コマンドはそのまま終了待機をしているようで先に進まなかったので ctrl-c で停止しました。そのまま待っているとタイムアウトで止まると思います。

特にカスタマイズをしていないので、なぜ Conflict したのか分からない

エラーメッセージによると、設定値の Conflict、衝突が起きているようです。ただし、私の EKS のアドオンは特にカスタマイズをしておらず、なぜ Conflict が起きているのか分かりませんでした。

eksctl の config.yaml は以下のようになっていました。attachPolicyARNs も AWS Managed Policy なので、特にカスタマイズはしていません。

eksctl-config.yaml

addons:
  - name: vpc-cni
    version: v1.20.4-eksbuild.1
    attachPolicyARNs:
      - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy

エラーメッセージを頼りに AWS 公式資料を探す

エラーメッセージを頼りに AWS 公式資料を探したところ、AWS re:Post に Conflict についての説明を見つけました。

When you use the AWS Command Line Interface (AWS CLI) to modify Amazon EKS managed add-on configurations, configuration conflicts might occur
Use the AWS CLI with the resolve-conflicts OVERWRITE parameter to explicitly override the existing configuration.

  • AWS CLI で EKS アドオンを更新すると、Conflict が起きる場合がある
  • その場合は --resolve-conflicts OVERWRITE オプションを使う

How do I prevent configuration conflicts when I create or update my Amazon EKS managed add-ons? | AWS re:Post

resolve-conflicts OVERWRITE オプションについて調べる

さらに resolve-conflicts OVERWRITE オプションについては Amazon VPC CNI のドキュメントに説明があります。

If you change this value to OVERWRITE, all settings are changed to Amazon EKS default values. If you’ve set custom values for any settings, they might be overwritten with Amazon EKS default values. If you change this value to none, Amazon EKS doesn’t change the value of any settings, but the update might fail. If the update fails, you receive an error message to help you resolve the conflict.

  • resolve-conflictsOVERWRITE にすると、設定値が EKS 側のデフォルト値で上書きされる
  • resolve-conflictsNONE にすると、EKS は設定を変更しないが、更新が失敗する場合がある

Update the Amazon VPC CNI (Amazon EKS add-on) - Amazon EKS

--resolve-conflict を省略したときのデフォルト値は分からない

eksctl のドキュメントの Eksctl Cluster Config File Schema#resolveConflicts - Config File Schema には、デフォルト値については記載がありません。

aws eks update-addon help コマンドについても --resolve-conflict を指定しなかった場合のデフォルト値については記載がありませんでした。

--resolve-conflicts (string)
  How to resolve field value conflicts for an Amazon EKS add-on if
  you've changed a value from the Amazon EKS default value. Conflicts
  are handled based on the option you choose:

  o None - Amazon EKS doesn't change the value. The update might fail.

  o Overwrite - Amazon EKS overwrites the changed value back to the
    Amazon EKS default value.

  o Preserve - Amazon EKS preserves the value. If you choose this
    option, we recommend that you test any field and value changes on
    a non-production cluster before updating the add-on on your
    production cluster.

  Possible values:

  o OVERWRITE

  o NONE

  o PRESERVE

--configuration-values オプションでアドオンの設定値を変更できる

Amazon VPC CNI のドキュメントには、アドオンの設定値を変更する方法についても説明がありました。

If you’re updating a configuration setting, replace "env":{"AWS_VPC_K8S_CNI_EXTERNALSNAT":"true"} with the setting that you want to set.

aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.20.3-eksbuild.1 \
    --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole \
    --resolve-conflicts PRESERVE --configuration-values '{"env":{"AWS_VPC_K8S_CNI_EXTERNALSNAT":"true"}}'

--configuration-values オプションで設定のカスタマイズができます。ここのオプションで設定した内容は EKS マネージドコンソールの vpc-cni アドオン > Edit add-on > Optional configuration settings > Configuration values で確認ができます。何も設定していないので、私の環境ではここは空欄になっていました。

Amazon EKS add-ons preserve customer edits | AWS Blogs

--resolve-conflict OVERWRITE オプションで解消

ここまで調べたところで、アドオンの設定はカスタマイズしていないので Conflict が起きている理由は分かりませんでした。EKS アドオンの設定値は初期値でよかったので、ドキュメントにかかれているように --resolve-conflicts OVERWRITE オプションを使ってアドオンの更新を実行したところ、エラーは出なくなり、アドオンの更新が完了しました。

eksctl設定ファイルは以下のように resolveConflicts: overwrite を追加しました。

eksctl-config.yaml

addons:
  - name: vpc-cni
    version: v1.20.4-eksbuild.1
    attachPolicyARNs:
      - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
    resolveConflicts: overwrite

まとめ

  • EKS アドオンの更新で、特にカスタマイズをしていなくても Conflict が起きることがある
  • その場合は resolve-conflicts OVERWRITE オプションを使って解消できる

同じようなトラブルに遭遇した方の参考になれば幸いです。

-技術ブログ
-