ステートレスなアプリを運用するには deployment を使うのが適切です。けれども、ステートフルなアプリには StatefulSet をお勧めします。deployment と違って、StatefulSet は管理下にある pod の同一性 (つまり予測可能な命名) と起動順序についてある保証を提供します。他に二点、deployment と違う点があります。一つは headless services を作成するために必要なネットワーク通信で、もう一つは StatefulSet が管理する pod ごとの persistent volume の永続性です。

これがどのように互いに連動しているかを確認するために、educational Kubernetes-native NoSQL datastore を使いましょう。

stateful app の作成から始めましょう。これは persistent volume と headless service をもっている StatefulSet です。

$ kubectl apply -f https://raw.githubusercontent.com/mhausenblas/mehdb/master/app.yaml

1 分ほど待つと、すべてのリソースが作成済みになったのが確認できます。

$ kubectl get sts,po,pvc,svc
NAME                     DESIRED   CURRENT   AGE
statefulset.apps/mehdb   2         2         1m

NAME          READY   STATUS    RESTARTS   AGE
pod/mehdb-0   1/1     Running   0          1m
pod/mehdb-1   1/1     Running   0          56s

NAME                                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/data-mehdb-0   Bound    pvc-bc2d9b3b-310d-11e9-aeff-123713f594ec   1Gi        RWO            ebs            1m
persistentvolumeclaim/data-mehdb-1   Bound    pvc-d4b7620f-310d-11e9-aeff-123713f594ec   1Gi        RWO            ebs            56s

NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/mehdb   ClusterIP   None         <none>        9876/TCP   1m

では、stateful app が適切に動作しているかどうか確認しましょう。そのために、headless service mehdb:9876/status エンドポイントを使います。データストアにまだデータを入れていませんから、期待される結果は 0 個のキーです。

$ kubectl run -it --rm jumpod --restart=Never --image=quay.io/mhausenblas/jump:0.2 -- curl mehdb:9876/status?level=full
If you don't see a command prompt, try pressing enter.
0
pod "jumpod" deleted

実際、上記のように 0 個のキーが利用可能だとわかります。

なお、ステートフルなアプリに StatefulSet を使えば万事解決とは限りません。ワークロードをきめ細かく制御するためにカスタムコントローラーを書いて、custom resource を定義したほうがうまくいく場合もあります。

前へ | 次へ