0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

3拠点の Kubernetes を Karmada で束ねて、交換日記アプリを動かしている

0
Last updated at Posted at 2026-10-01

交換日記アプリ whatcha を、3つの別々の場所に置いた
Kubernetes で動かしています。この記事は、その構成と、そう決めた理由の話です。

(公開 IP・ホスト名・エンドポイント・証明書の置き場は書きません。拠点は「拠点A/B/C」と呼びます。)

なぜ1か所にまとめないのか

理由は2つです。

1つの拠点が落ちてもサービスが残ること。 日記は、書いた人にとっては戻ってこない
データです。「落ちていた間の分は書けませんでした」は、日記では謝って済む話になりません。

1つの事業者に握られないこと。 値上げも、規約変更も、アカウント停止も、
こちらの都合では起きません。性格の違う3つを持っていれば、どれか1つが使えなくなっても
動かし続けられます。

全体像

役割 使っているもの
クラスタをまとめる Karmada v1.19.0(コントロールプレーンの apiserver は Kubernetes v1.36 系)
分散データベース YugabyteDB 2026.1(TLS 有効、拠点ごとに master / tserver)
オブジェクトストレージ MinIO(拠点ごとに1セット)
アプリの RDB CloudNativePG(PostgreSQL)

Karmada は「クラスタの上のクラスタ」です。Deployment などを Karmada の apiserver に
投げると、PropagationPolicy の指定にしたがって各拠点へ配られます。
kubectl の作法がそのまま使えるのが効きます。

Kubernetes のバージョンは、意図して揃えていない

拠点Aは k3s v1.36 系、拠点Bは素の Kubernetes v1.35 系です。これは手を抜いた結果ではなく、
揃えないという判断です。

全拠点を同じバージョンに揃えると、上げる日には全拠点を同時に上げることになります。
そのバージョンに問題があったとき、逃げ場が1つも残りません。
片方を先に上げて、1日見て、問題がなければもう片方に進める。このために差をつけています。

Karmada は member cluster のバージョン差を許します。ただし、
PropagationPolicy は API の差までは埋めてくれません。 新しいバージョンにしか無い
フィールドを書けば、古い拠点では落ちます。揃えないことの対価は、
マニフェストを一番低いバージョンに合わせることです。安いほうの対価だと考えています。

MinIO は「拠点内で冗長、拠点間でレプリケーション」

MinIO を3拠点で使うとき、設計は2通りあります。

  1. 1つのプールを拠点をまたいで組む
  2. 拠点ごとにプールを完結させ、拠点間はレプリケーションでつなぐ

採ったのは2です。各拠点でこういう形にしています。

server http://minio-{0...2}.<内部サービス>/data{0...1}

3ノード × 2ドライブ = 6ドライブで erasure set を1つ。これが拠点ごとに立っていて、
拠点間は site replication でつながります。

1を選ばなかったのは、距離があるからです。 同じラックのディスク間はサブミリ秒ですが、
拠点をまたぐと桁が2つ3つ変わります。1つのプールを拠点またぎで組むと、
書き込みのたびにその往復が入ります。 「分散」という同じ言葉でも、距離が変わると
別の技術になります。耐障害性のために遅くするのではなく、
拠点内で速く、拠点間で非同期に守るほうを選びました。

YugabyteDB を TLS で動かすなら、yb-admin の引数が1つ増える

構成を確認しようとして、こう返ってきたことがあります。

$ yb-admin --master_addresses=<master>:7100 get_universe_config
Timed out: Unable to establish connection to leader master ...
Please verify the addresses and check if server is up,
or if you're missing --certs_dir_name.

答えは最後の一行です。 TLS を有効にしたクラスタでは --certs_dir_name が要ります。
見た目が「繋がらない」なので、つい疎通やアドレスを疑いに行くところですが、
証明書のディレクトリを渡せば通ります。

TLS を入れた日から、運用コマンドの引数が変わる。
これは YugabyteDB に限らず、入れた本人が忘れた頃に効いてきます。

まとめ

  • 3拠点にするのは、可用性の話であると同時に、交渉力の話です。 1社に預けない
  • バージョンを揃えないのは、同時に壊れないための設計。対価は API を低いほうに合わせること
  • 「分散」は距離で意味が変わる。 拠点内の冗長と、拠点間のレプリケーションは別物
  • TLS を入れたら、運用コマンドの引数が変わる

whatcha は交換日記アプリです。同じ日のページを、ふたりが別々の時間に書けます。
返事を待たなくていい日記として作っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?