Advanced StatefulSet を使ってみよう

この記事は Kubernetes Advent Calendar 2021 の 2 日目です

makocchi
5 min readDec 1, 2021
image from unsplash.com

みなさんは StatefulSet を使っている時にこんなことを思ったことはありませんでしょうか?

  • 作成される Pod の名前に付く末尾の数字は 0 からじゃなくて 1 からにしたい
  • いやいや sort しにくいから、むしろ 10 からにしてほしい
  • mypod-N を削除して歯抜けの状態で運用したい

StatefulSet と上手く付き合っていく為には、通常の Deployment とは違う特徴を理解する必要がありますよね。運用を始めた当初では思わなかったけども、しばらく運用してみると上記に書かれたようなことを思ったことが 1 度くらいあるんじゃないでしょうか。

そんなあなたに Advanced StatefulSet

Advanced StatefulSet は通常の StatefulSet に加え、機能が追加された形で利用することができます。なおかつ、StatefulSet とほぼ同じ使い方ができる点で利用のハードルも低いという特徴があります。

具体的にはどんな機能なの?という話ですが、Advanced StatefulSet を使えば、作成される Pod の末尾の数字で好きな数字を歯抜けにできます。

この機能を使うことで、例えば mypod-0を歯抜けにするということが可能になりmypod-1 から始まるということが実現できます。

同じように mypod-0 mypod-1 mypod-3 mypod-4 … のように mypod-2 だけ歯抜けで維持するといったことも実現することができます。

Advanced StatefulSet を使うためには

Advanced StatefulSet は Custom Resourceとして定義する形になります。ですので Advanced StatefulSet Controller をデプロイする必要があります。

Advanced StatefulSet Controller は下記の repository にある manifest が用意されていますので、それを使ってデプロイすると良いでしょう。

具体的には下記のようにすれば大丈夫です。

上手く行けば advanced-statefulset-controller の Pod が立ち上がっていると思います。

さっそく Advanced StatefulSet を作ってみる

それでは Kubernetes の Document の StatefulSet のページにある web という StatefulSet を使ってさっそく試してみましょう。

web.yaml を少し編集する必要があります。具体的には apiVersion のところを apps/v1 から apps.pingcap.com/v1alpha1 にする必要があります。それ以外は何も変更する必要はありません。

通常の StatefulSet と同じように、こんな感じで Pod が作成されると思います。

作成された Advanced StatefulSet は statefulset.apps.pingcap.com を get することで確認することができますが、長いので asts を使うと良いでしょう。

もちろん scale もいつもと同じように可能です。

このまま使えば、既存の StatefulSet と全く同じように扱うことができますね。

歯抜け Pod を作る

では目玉機能である歯抜けの Pod を作りましょう。今回犠牲になってもらうのは web-1 にしてみます。

歯抜けの定義は asts に対して annotation を付与することで実現します。

annotation には delete-slots を指定します。 delete-slots: [1] のように指定すると数字の index の 1 が歯抜けになります。

delete-slots はもちろん複数の index を指定することもできます。次は web-1 に追加して web-3 にも犠牲になってもらいましょう。

これを上手く利用して delete-slots: [0] としておけば数字は 1 から始まることになるので、0 から始まるのが嫌だっていう場合にも対応可能です。今の所 delete-slots: [0-9] みたいな書き方には対応していないので、愚直に index を指定してあげないと駄目です。なので web-100 から Pod 作りたいんだ!みたいな場合は大変だと思います・・

歯抜けにしたけど、やっぱりやーめたという場合には delete-slotsannotation を消すか、 delete-slots: [] のようにすれば OK です。

まとめ

Advanced StatefulSet いかがだったでしょうか。もともとは PingCAP 社が開発しているようですね。PingCAP 社 は TiDB のオペレーターである tidb-operator も提供しているのですが、その内部で Advanced StatefulSet を使うことができるようになっています。

tidb-operator については先日発表した資料がありますので、もしよければご覧ください。

db tech showcase 2021 での資料

それではみなさんよい Kubernetes 生活を!

なお、Advanced StatefulSet はまだ十分に成熟していないのでご利用する際には十分に検証してからにしましょうね!

--

--

makocchi

Makoto Hasegawa | kubernetes | CKA(#CKA-1700–0150–0100) | CKAD(CKAD-1800–0005–0100) | docker | container | OpenStack