前回の記事の後でまたPodアンチアフィニティでハマったので、メモを残しておきます。
この記事はKubernetes v1.19の話です。
本番とステージングの名前空間に複数のアプリケーションA, Bをデプロイしていて、CPUを使うアプリケーション同士が同じノードにスケジュールされないようにPodアンチアフィニティを設定していました。
しかし、A (本番), B (ステージング) が同じノードにスケジュールされてしまいました。
公式ドキュメントを読んでみると、以下のように書かれています。
このポリシーは、”XにてルールYを満たすPodがすでに稼働している場合、このPodもXで稼働させる(アンチアフィニティの場合は稼働させない)”という形式です。 Yはnamespaceのリストで指定したLabelSelectorで表されます。 Nodeと異なり、Podはnamespaceで区切られているため(それゆえPodのラベルも暗黙的にnamespaceで区切られます)、Podのラベルを指定するlabel selectorは、どのnamespaceにselectorを適用するかを指定する必要があります。
https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/#pod%E9%96%93%E3%82%A2%E3%83%95%E3%82%A3%E3%83%8B%E3%83%86%E3%82%A3%E3%81%A8%E3%82%A2%E3%83%B3%E3%83%81%E3%82%A2%E3%83%95%E3%82%A3%E3%83%8B%E3%83%86%E3%82%A3
名前空間セレクタはKubernetes v1.22でβリリース、v1.24でstableリリースされるのでまだ使えないようでした。
https://github.com/kubernetes/enhancements/issues/2249
結局、Kubernetesのバージョンアップ時に本番に影響なく、ステージングのクラスタで動作確認できた方がいいので、クラスタを分けることにしました。