StatefulSet と Headless Service の関連付けの確認

StatefulSet の安定したネットワーク識別子に使う Headless Service を構成してください。

説明

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 と一致するラベルが必要です。

参考資料