前: DaemonSet
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へのアクセスを行うこともあります。
-
以下を満たすマニフェストを作成しデプロイしてください。なお、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
- 名前は
- StatefulSet
- 要件
-
StatefulSetリソースのオブジェクト一覧を表示し、
statefulがあることを確認してください。 -
Podリソースのオブジェクト一覧を表示し、
stateful-0,1,2の3つのPodがあることを確認してください。また起動時間から起動が順番に行われたことを確認してください。 -
Serviceリソースのオブジェクト一覧を表示し、
nginx-svcがあること。また、Headless Serviceであることを確認してください。
(Headless ServiceはClusterIPがNoneなServiceです。) -
接続確認に使用する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
-
Pod:
nginx-sts-1のIPアドレスを確認してからPod:nginx-sts-1を削除してください。 -
Pod:
nginx-sts-1がセルフ・ヒーリングされていることを確認してください。また、IPアドレスが変わっていることを確認してください。 -
testpodから次のコマンドで接続確認をしてください。
nslookup nginx-svc curl -s nginx-sts-1.nginx-svc.default.svc.cluster.local
-
作成したリソースを削除してください。
上記のように、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を使うことがほとんどだと思います。
以上で本演習は終了です。
具体的な操作およびその結果に関する回答例はこちらにあります。 具体的な操作方法がわからなかった場合や、想定した結果にならなかった場合などに参照してください。