PersistentVolumeの名前にsuffixを付与するだけのKubernetesのカスタムコントローラを作った

この記事はGMOペパボエンジニア Advent Calendar 2023 🎅会場の17日目の記事です!
昨日はkyuさんの「2023年にやったJetpackComposeの対応を少しだけ紹介します」でした!

こんばんは。今回は色々あって最近作ったKubernetesのカスタムコントローラを紹介しようと思います。

作ったもの

PersistentVolume(以下、PV)のnameにカスタムリソースが存在するnamespace名をsuffixとして付与するやつ。(現状はNFSしか対応してない)

なぜ作ったのか

まず、前提としてPVはcluster-wideなリソースなため、同名のPVは複数存在できません。

では、そもそもPVを手動で作らずにPersistentVolumeClaim(以下、 PVC)の動的プロビジョニングを利用すれば良いじゃないかと思われるかもしれないですね。確かに動的プロビジョニングが利用できれば名前の衝突はよしなに回避してくれるから問題はなさそうです。

しかしながら、今回は後述する理由によりPVCを利用するという選択肢は取れませんでした。

今回作成したいPVは以下の要件を満たす必要があります。

  1. namespaceごとに同じ名前のPVを1つ作成したい
  2. NFSをプロビジョニング
  3. NFSのマウント先はすべて同じパスをマウント(例: /shared/nfs)
  4. 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から完成まで持っていったカスタムコントローラは初めてだったのですがなんとか形になってよかったです。

今まではこんな小さいことにわざわざカスタムコントローラを書くのもなぁと思っていたのですが、意外とやることが明確ならサクサクかけたのでもう少し気軽にかけそう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA