Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理...

nnaka2992
February 20, 2025

 データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る

2025/2/20 に開催された「Kubernetes Novice Tokyo #36」の登壇資料です。
https://k8s-novice-jp.connpass.com/event/343899/

ステートフルなワークロードをKubernetesでホストする場合はStatefulSetを利用することが多いですが、ステートフルなワークロードであるPostgreSQLのオペレータである、CloudNativePGではStatefulSetを利用していません。

この資料ではなぜCloudNativePGがStatefulSetを使わない理由に迫ります。

そもそもなぜマネージドデータベースではなく、KubernetesにDBを立てるのか気になる方は次のスライドを、
- CloudNativePGを布教したい
- https://speakerdeck.com/nnaka2992/cloudnativepgwobu-jiao-sitai

CloudNativePGのより詳細な動きが気になる方は次のスライドをご参照ください。
- CloudNativePGがCNCF Sandboxプロジェクトになったぞ!
- https://speakerdeck.com/nnaka2992/cloudnativepggacncf-sandboxpuroziekutoninatutazo-cloudnativepgnoshi-zu-minoshao-jie

nnaka2992

February 20, 2025
Tweet

More Decks by nnaka2992

Other Decks in Programming

Transcript

  1. \du 2 株式会社スリーシェイク Sreake事業部 Alias - nnaka2992 - nkDATE -

    中楯直希 業務内容 - DBRE兼SRE見習い - 全人類にデータベースを好きになってもらうために 活動しています - 自称データ雑用係 - DBAでもDBREでもデータエンジニアでも 興味あること - DBをKubernetesにのせること - SREっぽいこと - データベース関連ならなんでも nnaka2992 @nnaka2992 @nnaka2992.bsky.social
  2. CloudNativePGの概要 4 • CloudNativePGはKubernetesでPostgreSQLの構築・運 用を楽にするオペレーター ◦ Primary / Secondary構成を簡単に作れる ◦

    バックアップ・リストアの効率化 ◦ 宣言的な設定管理 ◦ レプリカクラスタの作成 ≒ RDS / Cloud SQLみたいなものをKubernetesで作れる • コンテナイメージの作成が必要なものの幅広い拡張機能も サポート可能
  3. CloudNativePGがStatefulSetを利用しない件について (デモ) 7 • 前提となるyamlファイル # example.yaml apiVersion: postgresql.cnpg.io/v1 kind:

    Cluster metadata: name: cluster-sample spec: instances: 3 storage: storageClass: standard-rwo size: 1Gi # CNPGのAPIを使う # 作成するリソース=DBクラスタ # リソースのメタデータ ## クラスタ名・関連リソースPrefix # クラスタ設定 ## インスタンス数 ## ストレージ設定 ### 利用するストレージ ### ストレージ容量
  4. CloudNativePGがStatefulSetを利用しない件について (デモ) 8 1. GKEクラスタを作成 > gcloud container clusters create

    --zone asia-northeast1-a cloud-native-pg-demo Creating cluster cloud-native-pg-demo in asia-northeast1-a… 後略
  5. CloudNativePGがStatefulSetを利用しない件について (デモ) 9 2. GKEクラスタにアクセス > gcloud container clusters get-credentials

    --zone asia-northeast1-a \ cloud-native-pg-demo Fetching cluster endpoint and auth data. kubeconfig entry generated for cloud-native-pg-demo. > kubectl get nodes NAME STATUS ROLES AGE VERSION gke-cloud-native-pg-demo-default-pool-c92911f6-d487 Ready <none> 25m v1.31.5-gke.1023000 gke-cloud-native-pg-demo-default-pool-c92911f6-gt41 Ready <none> 25m v1.31.5-gke.1023000 gke-cloud-native-pg-demo-default-pool-c92911f6-nwvs Ready <none> 25m v1.31.5-gke.1023000
  6. CloudNativePGがStatefulSetを利用しない件について (デモ) 10 3. CloudNativePG オペレーターをインストール > kubectl apply --server-side

    -f \ https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.25/release s/cnpg-1.25.0.yaml namespace/cnpg-system serverside-applied 中略 validatingwebhookconfiguration.admissionregistration.k8s.io/cnpg-validating-webhook-configuration serverside-applied
  7. CloudNativePGがStatefulSetを利用しない件について (デモ) 11 4. PostgreSQL クラスタを作成 > kubectl apply -f

    example.yaml cluster.postgresql.cnpg.io/cluster-sample created > kubectl get all -l cnpg.io/cluster=cluster-sample
  8. CloudNativePGがStatefulSetを利用しない件について (デモ) 12 4. PostgreSQL クラスタを作成 > kubectl apply -f

    example.yaml cluster.postgresql.cnpg.io/cluster-sample created > kubectl get all -l cnpg.io/cluster=cluster-sample StatefulSetがいない!!!
  9. なぜStatefulSetを使わないのか 13 • PostgreSQLではPrimary / Secondaryで異なる設定項目が あるため単純なStatefulSetでは複雑になる ◦ Primaryの設定にSecondaryのサーバ名の設定 ◦

    SecondaryにはPrimaryの接続情報の設定 ◦ etc… • StatefulSetではPVCのリサイズをサポートしていない • 複数のPVC間での整合性を保ちにくい ◦ WALとPGDATAを異なるPVCに保存している • ノードのアップグレード時のPodの挙動を制御する必要があ る ◦ Pod / PVCを削除して他のノードで作り直すのか? ◦ ノードの再起動を待つ方がいいのか? https://www.postgresql.jp/document/16/html/runtime-config-replication.html
  10. 他オペレーターの対応 14 • zalando/postgres-operator ◦ PrimaryもSecondaryも同じStatefulSetを利用 • CrunchyData/postgres-operator ◦ PrimaryとSecondaryで異なるStatefulSetを利用

    • Timescale (非公開) ◦ PodとPVCをオペレーターで管理する ▪ (CloudNativePGと同じ) • Altinity/clickhouse-operator ◦ DBインスタンス毎にStatefulSetをカスタムしたCRDを利用する 情報があいまいです。嘘ついていたらごめんなさい
  11. まとめ 15 • CloudNativePGをつかうとKubernetesでのPostgreSQL 利用が楽になる • CloudNativePGはStatefulSetを使っていない • DBオペレーターは ◦

    StatefulSetを使っているものもあれば ◦ StatefulSetをカスタムして使っているものもあれば ◦ Pod / PVCを個別で管理しているもののある • ほかオペレーターの調査に NotebookLMに資料作成手伝ってもらいましたが便利ですね • オペレーターの挙動確認に KHIを使ってますがとても助かっています
  12. おまけ 16 • この資料でCloudNativePGに興味を持った方は下記の資 料も見てみてください ◦ CloudNativePGを布教したい ▪ https://speakerdeck.com/nnaka2992/cloudnativepgwobu-jiao-sitai ◦

    CloudNativePGがCNCF Sandboxプロジェクトになったぞ! ▪ https://speakerdeck.com/nnaka2992/cloudnativepggacncf-sandboxpuroziekutoninatutazo-clou dnativepgnoshi-zu-minoshao-jie
  13. 参考 17 • Custom Pod Controller | CloudNativePG v1.25 ◦

    https://cloudnative-pg.io/documentation/1.25/controller/ • 20.6. レプリケーション | PostgreSQL 16.4文書 ◦ https://www.postgresql.jp/document/16/html/runtime-config-replication.html • zalando/postgres-operator: Postgres operator creates and manages PostgreSQL clusters running in Kubernetes ◦ https://github.com/zalando/postgres-operator • Detailed Architecture | Crunchy Postgres for Kubernetes ◦ https://access.crunchydata.com/documentation/postgres-operator/latest/architecture • High Availability | Crunchy Postgres for Kubernetes ◦ https://access.crunchydata.com/documentation/postgres-operator/latest/tutorials/day-two/high-availa bility • Replacing StatefulSets With a Custom K8s Operator in Our Postgres Cloud Platform | Timescale ◦ https://www.timescale.com/blog/replacing-statefulsets-with-a-custom-k8s-operator-in-our-postgres-cl oud-platform#designing-an-alternative-to-statefulsets • Adventures in Data- Leaning on Kubernetes Storage to Run Hundreds of Real-Time Analytic Databases ◦ https://www.youtube.com/watch?v=ogN_DOHJTIY