Skip to content

Latest commit

 

History

History
86 lines (60 loc) · 4.62 KB

StatefulSet.md

File metadata and controls

86 lines (60 loc) · 4.62 KB

前: DaemonSet


StatefulSetとHeadless Service

StatefulSet

StatefulSetはDeployment(ReplicaSet)と同じく指定した数のPodを常に起動するようにするAPIリソースです。
違いは以下の3つです。わかりやすい1つ目と2つ目の動作をまず確認します。3つ目は長くなるので次章で解説します。

  • 起動するPod名に連番が付与される(Deploymentはランダム文字列)
  • 名前の連番通りにPodを1つずつ起動し、前のPodが起動完了してから次のPodを起動する。(Deploymentは起動順を気にしない)
  • 各PodごとにPVを割り当てるvolumeClaimTemplateが使える(Deploymentでは使えない)

StatefulSetはDBなどのステートフルなワークロードを想定したAPIリソースです。 たとえば3ノードのDBだとPrimary:1,Replica:2の構成などにすると思います。 この際、Primaryをまず起動し、次いでReplicaを起動します。 このような順番を意識した起動はDeploymentではできないため、StatefulSetを使います。 またHeadless Serviceを使った特定Podへのアクセスを行うこともあります。

演習

  1. 以下を満たすマニフェストを作成しデプロイしてください。なお、StatefulSetについては公式ドキュメントを参考にしてください。

    • 要件
      • StatefulSet
        • 名前はnginx-sts
        • labelはすべてapp: nginx
        • replicasは 3
        • serviceNameはnginx-svc
        • Pod
          • 名前はnginx
          • イメージはnginx:1.12
      • Service
        • 名前はnginx-svc
        • typeはClusterIP(明示的に指定する)
        • clusterIPにNone
        • ProtocolはTCP
        • 待ち受けポートは80
        • ターゲットポートは80
        • selectorはapp: nginx-sts
  2. StatefulSetリソースのオブジェクト一覧を表示し、statefulがあることを確認してください。

  3. Podリソースのオブジェクト一覧を表示し、stateful-0,1,2の3つのPodがあることを確認してください。また起動時間から起動が順番に行われたことを確認してください。

  4. Serviceリソースのオブジェクト一覧を表示し、nginx-svcがあること。また、Headless Serviceであることを確認してください。
    (Headless ServiceはClusterIPがNoneなServiceです。)

  5. 接続確認に使用するcurlコマンドが実行可能なtestpodを作成し、testpodから次のコマンドで接続確認をしてください。

    nslookup nginx-svc
    curl -s nginx-sts-0.nginx-svc.default.svc.cluster.local
    curl -s nginx-sts-1.nginx-svc.default.svc.cluster.local
    curl -s nginx-sts-2.nginx-svc.default.svc.cluster.local
  6. Pod:nginx-sts-1のIPアドレスを確認してからPod:nginx-sts-1を削除してください。

  7. Pod:nginx-sts-1がセルフ・ヒーリングされていることを確認してください。また、IPアドレスが変わっていることを確認してください。

  8. testpodから次のコマンドで接続確認をしてください。

    nslookup nginx-svc
    curl -s nginx-sts-1.nginx-svc.default.svc.cluster.local
  9. 作成したリソースを削除してください。

上記のように、Headless Serviceを使うことでPod IPアドレスが変わっても任意のPodにアクセスすることができます。単純に特定PodにアクセスするだけならPodのIPアドレスでも可能ですが、StatefulSetで展開しているPodでもセルフヒーリングで再作成されるとIPアドレスは変わってしまいます。Headless Serviceであればセルフヒーリング後も自動でPodを検出するため、宛先の指定を変える必要がありません。

とはいえ、Headless Serviceは少しイレギュラーなServiceです。replicas:2以上のStatefulSet以外で使うことは稀だと思います。replicas:1のStatefulSetやDeploymentの場合は通常のServiceを使うことがほとんどだと思います。

以上で本演習は終了です。

具体的な操作およびその結果に関する回答例はこちらにあります。 具体的な操作方法がわからなかった場合や、想定した結果にならなかった場合などに参照してください。


次: StatefulSet-volumeClaimTemplate