この記事はGMOペパボエンジニア Advent Calendar 2023 🎅会場の17日目の記事です! 昨日はkyuさんの「2023年にやったJetpackComposeの対応を少しだけ紹介します」でした!
こんばんは。今回は色々あって最近作ったKubernetesのカスタムコントローラを紹介しようと思います。
作ったもの
PersistentVolume(以下、PV)のnameにカスタムリソースが存在するnamespace名をsuffixとして付与するやつ。(現状はNFSしか対応してない)
なぜ作ったのか
まず、前提としてPVはcluster-wideなリソースなため、同名のPVは複数存在できません。
では、そもそもPVを手動で作らずにPersistentVolumeClaim(以下、 PVC)の動的プロビジョニングを利用すれば良いじゃないかと思われるかもしれないですね。確かに動的プロビジョニングが利用できれば名前の衝突はよしなに回避してくれるから問題はなさそうです。
しかしながら、今回は後述する理由によりPVCを利用するという選択肢は取れませんでした。
今回作成したいPVは以下の要件を満たす必要があります。
- namespaceごとに同じ名前のPVを1つ作成したい
- NFSをプロビジョニング
- NFSのマウント先はすべて同じパスをマウント(例:
/shared/nfs
) - NFSのマウントオプションを指定する
一番上の「namespaceごとに同じ名前のPVを1つ作成したい
」は一旦おいておくとして、問題はNFSにあります。
KubernetesはPersistentVolume/volumes それぞれでNFSをサポートしています。とりあえずその時点で「NFSをプロビジョニング
」は満たせました。
次に「マウント先はすべて同じパスをマウント
」です。
これはなかなか難しく、公式ドキュメントなどでNFSの動的プロビジョナーとして紹介されているkubernetes-sigs/nfs-subdir-external-provisionerではその名前の通り、PVC名のディレクトリをNFS上に作成しそこをマウントする挙動を取ります。
そこでそもそもPVを利用せずにDeploymentのvolumesに直接nfsをマウントさせるという方法も考えたのですが、この場合manifest上からのマウントオプションの指定がサポートされておらず、「NFSのマウントオプションを指定する
」を満たせなくなります。
このような経緯から今回カスタムコントローラを作成することにしました。
使い方
crdをクラスタにインストールした上で、namespaced-pv-controllerを以下のようなmanifestを作ってapply
カスタムリソースのマニフェストはこんな感じ。
当ててみると実行結果はこんな感じ(default NSなのでnfs-pv-default)
❯ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv-default 1Gi RWX Retain Available nfs 6s
基本的にPVでNFSをするときに設定できるプロパティは同じように設定できるのであまり使い勝手は変わらないはずです。
終わりに
0から完成まで持っていったカスタムコントローラは初めてだったのですがなんとか形になってよかったです。
今まではこんな小さいことにわざわざカスタムコントローラを書くのもなぁと思っていたのですが、意外とやることが明確ならサクサクかけたのでもう少し気軽にかけそう。