マイクロサービスシステム肥大化の悪夢
20個のマイクロサービスを管理していると想像してみてください。ある日突然、データベースのIPアドレスが変更されたり、重要なAPIキーを即座に更新する必要が出てきました。従来の方法では、各サービスにアクセスして.envファイルを修正し、20個すべてのコンテナを再起動しなければなりません。
このやり方は時間がかかるだけでなく、リスクも伴います。たった一つのサービスの更新を忘れるだけで、システム全体がダウンしてしまいます。私自身、クラスター内の一つのサービスの設定を更新し忘れたせいで、午前2時まで全設定ファイルをチェックし続けたという、苦い経験があります。それは決して心地よい体験ではありませんでした。
なぜMySQLやRedisは最適ではないのか?
この問題に直面したとき、多くの人がMySQLやRedisを使って設定を保存することを考えます。しかし、実際には多くの不都合が生じます。
- MySQL/PostgreSQL: 手紙を運ぶのに大型トラックを使うようなものです。数行の設定を取得するためだけに何百もの接続を維持するのは、リソースの大きな無駄です。
- Redis: 非常に高速ですが、デフォルトでは一貫性(Consistency)よりもパフォーマンスを優先します。設定管理において、一貫性は絶対です。サービスAが古い設定を受け取っている一方で、サービスBが新しい設定を受け取っているという状況は、絶対に避けなければなりません。
- 物理ファイル: 数十台のサーバー間でファイルを同期させるのは、運用面で大きな負担となります。
etcd — 分散システムの「脳」
etcdは、これらの課題を根本的に解決するために生まれました。これはGoで書かれ、Raft合意アルゴリズムを使用した分散型Key-Valueストアです。すべてのノードでデータの整合性を保証します。ご存知でしょうか? etcdはKubernetesの心臓部であり、クラスターの状態をすべて保存している場所なのです。
etcdの最大の利点は、Watch機能です。サービスが「何か更新はある?」と何度も問い合わせる代わりに、変更があった瞬間にetcd側から通知をプッシュします。これにより、アプリケーションはほぼリアルタイムで設定を更新できます。
Linuxへのetcdインストールガイド
ここでは、Linux(Ubuntu/CentOS)にバイナリ版のetcdをインストールします。これは、Kubernetes上でより複雑な構成をデプロイする前に、etcdに慣れるための最も早い方法です。
# v3.5.0をダウンロード
ETCD_VER=v3.5.0
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
# システムディレクトリに移動
sudo mv /tmp/etcd-download-test/etcd /usr/local/bin/
sudo mv /tmp/etcd-download-test/etcdctl /usr/local/bin/
etcd --versionコマンドでインストールを確認します。まずは試してみたい場合、以下のコマンドでシングルノードを起動できます。
etcd
この時、etcdはポート2379(クライアント用)と2380(ノード間通信用)で待機します。
etcdctlによるデータ操作
etcdctl
