交換日記アプリ 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つのプールを拠点をまたいで組む
- 拠点ごとにプールを完結させ、拠点間はレプリケーションでつなぐ
採ったのは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 は交換日記アプリです。同じ日のページを、ふたりが別々の時間に書けます。
返事を待たなくていい日記として作っています。
