EKS CoreDNSアドオンを v1.9.3-eksbuild.5
から v1.9.3-eksbuild.9
にバージョンアップする際に自前でマニフェスト管理しているPDBと競合するということが起きました。
本記事ではその解決方法を記載します。
調査
自前でマニフェスト管理しているPDBでは、minAvailable: 1
として設定しています。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: coredns
namespace: kube-system
spec:
minAvailable: 1
selector:
matchLabels:
k8s-app: kube-dns
エラー内容を見ると、minAvailableとmaxUnavailableは同時に設定することはできないという競合エラーが出ていることがわかります。
$ kustomize build k8s/dev/ | kubectl diff -f -
The PodDisruptionBudget "coredns" is invalid: spec: Invalid value: policy.PodDisruptionBudgetSpec{MinAvailable:(*intstr.IntOrString)(0xc02431df60), Selector:(*v1.LabelSelector)(0xc02431df80), MaxUnavailable:(*intstr.IntOrString)(0xc02431dfa0)}: minAvailable and maxUnavailable cannot be both set
公式ドキュメントを確認すると、v1.9.3-eksbuild.5以降およびv1.10.1-eksbuild.2ではPDBがデプロイされるようになり、
v1.9.3-eksbuild.7以降およびv1.10.1-eksbuild.4以降のPDBのデフォルト値は maxUnavailable: 1
になっているようです。
{
"podDisruptionBudget": {
"enabled": true,
"maxUnavailable": 1
}
}
v1.9.3-eksbuild.5
の時はアドオン側がminAvailable: 1
だったので競合していませんでしたが、v1.9.3-eksbuild.9
ではPDBのデフォルト値がmaxUnavailable: 1
になっているために競合が発生していたとわかりました。
解決方法
v1.9.3-eksbuild.7以降およびv1.10.1-eksbuild.4以降では、PodDisruptionBudgetを変更できるようです。
CloudFormationで管理しているアドオンのConfigurationValues
にPDB(minAvailable: 1)設定を追加します。
こうすることでアドオン側でデプロイされているPDB設定のデフォルト値(maxUnavailable: 1)を上書きすることができます。
CoreDNS:
Type: AWS::EKS::Addon
Properties:
AddonName: coredns
AddonVersion: !Ref CoreDNSVersion
ClusterName: !Ref EKSCluster
ResolveConflicts: OVERWRITE
ConfigurationValues: |
{
"podDisruptionBudget": {
"enabled": true,
"minAvailable": 1
}
}
マニフェストで用意していたPDBは不要になるため削除可能です。
まとめ
EKS CoreDNSアドオンを v1.9.3-eksbuild.5
から v1.9.3-eksbuild.9
にバージョンアップする際に自前でマニフェスト管理しているPDBと競合したときの解決方法をまとめました。
バージョンアップの際はドキュメントをよく読むことが大切です。