説明
StatefulSet は、Pod に安定したネットワーク名を与えるため、spec.service_name で Headless Service を参照します。同じ名前空間の Service に cluster_ip = "None" を設定し、selector を実際の Pod ラベルに合わせる必要があります。
通常の Service や誤った selector を参照すると、Pod 固有の DNS 名やピアの検出が期待どおりに機能しない場合があります。
想定される影響
- 安定した Pod の DNS 名でピアに接続できない場合があります。
- 再起動やスケーリング時の検出が不安定になり、ステートフルなアプリケーションの復旧が難しくなる可能性があります。
対処方法
- StatefulSet の
service_nameが同じ名前空間の Headless Service を指すようにし、Service のcluster_ipに"None"を指定してください。 - Service の selector と実際の Pod ラベル、ポート、DNS 応答を確認してください。Service は別途作成する必要があります。
例
Service との関連付けだけを示す抜粋です。必須の Pod template や Service のポートなどは省略しています。変更前は cluster_ip を省略して通常の ClusterIP 割り当てを使い、変更後は Headless Service を指定します。
変更前
hcl
resource "kubernetes_service" "example" {
metadata {
name = "prometheus"
namespace = "monitoring"
}
spec {
selector = {
app = "prometheus"
}
}
}
resource "kubernetes_stateful_set" "example" {
metadata {
name = "prometheus"
namespace = "monitoring"
}
spec {
service_name = "prometheus"
selector {
match_labels = {
app = "prometheus"
}
}
}
}
変更後
hcl
resource "kubernetes_service" "example" {
metadata {
name = "prometheus"
namespace = "monitoring"
}
spec {
cluster_ip = "None"
selector = {
app = "prometheus"
}
}
}
resource "kubernetes_stateful_set" "example" {
metadata {
name = "prometheus"
namespace = "monitoring"
}
spec {
service_name = "prometheus"
selector {
match_labels = {
app = "prometheus"
}
}
}
}
補足:
- 変更前: 通常の ClusterIP Service を参照しており、Headless Service ではありません。
- 変更後: cluster_ip に None を指定します。省略した Pod template にも selector と一致するラベルが必要です。