【入門編】Kubernetesにおけるetcdのパフォーマンスチューニングと障害復旧:大規模クラスタで陥る罠とベストプラクティス – インフラ構成管理(IaC)活用バイブル

Kubernetes(K8s)という巨大なシステムを動かしている「心臓部」、それがetcd(エトシーディー)です。

こんにちは!インフラの世界に飛び込んだばかりのあなたへ。
「Kubernetesってなんだかすごそうだけど、裏側でどうやってデータが管理されているんだろう?」そんな疑問を持ったことはありませんか?

Podが増え、設定が変更され、デプロイが繰り返されるたび、そのすべての「状態(State)」を正確に、一瞬たりとも漏らさずに記録し続けているのがこのetcdです。いわば、Kubernetesクラスタの「脳であり、記憶装置」。

もしここが詰まったり、壊れたりしたら?――そう、クラスタ全体の機能が完全に停止してしまいます。
今回は、このetcdの役割から、大規模環境で陥りがちな罠、そして現場で役立つ実践的なチューニングとリカバリの手法まで、一緒に優しく丁寧に紐解いていきましょう。これをマスターすれば、Kubernetesのトラブルシューティングに怯える必要はなくなりますよ!

—

1. etcdってそもそも何をするツールなの?(役割の直感的な理解)

初心者の方がまず押さえておきたいのは、「etcdはリレーショナルデータベース(MySQLやPostgreSQLなど)とは似て非なるもの」という点です。

etcdは、分散KVS(Key-Valueストア)です。
Kubernetesにおいて、`kubectl apply` でマニフェストを流し込むと、そのデータは最終的にすべて etcd に `/registry/pods/` や `/registry/deployments/` といった階層構造のキーとして保存されます。

特徴:なぜRDBではなくetcdなのか?

1. Raftコンセンサスアルゴリズム:複数台(通常3台や5台などの奇数)でデータを同期し、リーダーが1台死んでも自動で新しいリーダーを選んで生き残り続けます。
2. Watch機能:「このキーの値が変わったら教えて!」という監視(Watch)が極めて高速に動作します。これが、K8sの「状態を常に望ましい状態に保つ(コントローラーパターン)」の根幹を支えています。

—

2. インストールと最も重要な基礎セットアップ

通常、K8sクラスタを構築するツール(kubeadmなど)を使うと、etcdはコントロールプレーン上で自動的に立ち上がります。しかし、その内部構造を理解するために、単体での起動や設定のキモを見ておきましょう。

ここでは、本番環境で絶対に避けるべき罠を踏まえた、精度高いセットアップのポイントを解説します。

最重要:etcdのハードウェア要件とストレージ設計

etcdのパフォーマンスを決定づけるのは、CPUでもメモリでもなく、「ディスクのI/O速度(特にFsyncのレイテンシ)」です。

etcdはデータが書き込まれるたびに、ディスクへの同期書き込み(fsync)を要求します。もしディスクが遅いと、書き込み完了を待つ間にタイムアウトが発生し、クラスタ全体がフリーズします。

  • ベストプラクティス:
  • etcd専用の超高速なSSD(NVMe推奨)を用意する。
  • OSの他のプロセスとディスクI/Oを競合させない。
  • スワップ(Swap)は絶対に無効化する。

動作確認:etcdに触れてみよう(Hello World)

etcdの操作には `etcdctl` というCLIツールを使います。
現代のetcd(v3 API)では、セキュリティのために証明書認証(TLS)が必須です。以下のコマンドで、クラスタの健康状態(ヘルスチェック)を確認してみましょう。

etcdのエンドポイントと証明書を指定して、クラスタメンバーの状態を確認する
ETCDCTL_API=3 etcdctl \
–endpoints=https://127.0.0.1:2379 \
–cacert=/etc/kubernetes/pki/etcd/ca.crt \
–cert=/etc/kubernetes/pki/etcd/server.crt \
–key=/etc/kubernetes/pki/etcd/server.key \
member list

出力例(正常時):

8e9e05c52164694d, started, control-plane-01, https://192.168.1.10:2380, https://192.168.1.10:2379, false

これが返ってくれば、あなたとetcdの通信は成功です!

—

3. 大規模クラスタで陥る罠:なぜetcdは重くなるのか?

クラスタの規模が大きくなると、必ずと言っていいほどetcdのパフォーマンス問題に直面します。よくある「罠」とそのメカニズムを見てみましょう。

罠1:不要なデータの肥大化と「デフラグ(Defrag)」の欠如

etcdはデータを追記型(Append-only)で保存します。Kubernetesでは、Podの作成・削除、ConfigMapの更新などが頻繁に行われるため、古いデータ(リビジョン)がどんどんゴミとして蓄積されます。

etcdのデータファイルサイズ(DB size)は自動で縮小しません。これがデフォルトの制限である2GB(または設定した上限)に達すると、「etcdserver: mvcc: database space exceeded」という恐怖のエラーが発生し、クラスタへの書き込みが一切できなくなります。

対策:定期的なデフラグの実行

データ容量を物理的に削るために、デフラグを定期的に行う必要があります。

データの断片化を解消し、ディスク容量を解放するデフラグコマンド
ETCDCTL_API=3 etcdctl \
–endpoints=https://127.0.0.1:2379 \
–cacert=/etc/kubernetes/pki/etcd/ca.crt \
–cert=/etc/kubernetes/pki/etcd/server.crt \
–key=/etc/kubernetes/pki/etcd/server.key \
defrag

※注意:デフラグ中は対象ノードのetcdの負荷が上がるため、クラスタ全体ではなく1台ずつローリング方式で実施するのが鉄則です。

罠2:アラート(Alarm)の放置

ストレージ容量の制限を超えてしまうと、etcdは「NOSPACE」アラートをトリガーします。このアラートが発報されている間は、デフラグを行っても書き込みブロックが解除されません。

解除の手順:
1. スペースを空ける(不要なデータの削除やスナップショットからの復旧)
2. アラートを明示的にクリアする

ETCDCTL_API=3 etcdctl alarm disarm \
–endpoints=https://127.0.0.1:2379 \
–cacert=/etc/kubernetes/pki/etcd/ca.crt \
–cert=/etc/kubernetes/pki/etcd/server.crt \
–key=/etc/kubernetes/pki/etcd/server.key

—

4. 障害復旧:コンセンサス崩壊からのバックアップ・リストア

「もし、誤ってデータを消してしまったら」「ハードウェアが吹っ飛んだら」――そんな最悪の事態に備えるのがSREの腕の見所です。etcdのバックアップとリストアは、実は非常にシンプルですが、手順を間違えると二度と復旧しなくなります。

ステップ1:スナップショットの取得(日々のルーチン)

まずは、現在のetcdの状態をスナップショットとしてファイルに保存します。

現在のetcdの状態をスナップショットファイルとして保存する
ETCDCTL_API=3 etcdctl snapshot save /var/backups/etcd-snapshot-$(date +%Y%m%d).db \
–endpoints=https://127.0.0.1:2379 \
–cacert=/etc/kubernetes/pki/etcd/ca.crt \
–cert=/etc/kubernetes/pki/etcd/server.crt \
–key=/etc/kubernetes/pki/etcd/server.key

これをCron等で定期実行しておくことが、夜安心して眠るための第一歩です。

ステップ2:バックアップからのリストア(復旧作業)

もしクラスタが破損した場合、保存したスナップショットからデータを復元します。

リストアを行う際は、既存のetcdデータディレクトリ(通常 `/var/lib/etcd`)をクリーンな状態にし、新しいクラスタメンバーとして復元コマンドを実行します。

スナップショットから新しいデータディレクトリへリストアを行う
ETCDCTL_API=3 etcdctl snapshot restore /var/backups/etcd-snapshot-20231025.db \
–data-dir=/var/lib/etcd \
–initial-cluster=control-plane-01=https://192.168.1.10:2380 \
–initial-cluster-token=etcd-cluster-1 \
–initial-advertise-peer-urls=https://192.168.1.10:2380

このコマンドを実行後、コントロールプレーンの静的マニフェスト(kube-apiserverなど)が新しいデータを参照するように起動すれば、クラスタは完全に元の状態へと蘇ります!

—

5. まとめと先輩からのメッセージ

今回は、Kubernetesの心臓部であるetcdのパフォーマンスと障害復旧について、現場のリアルな視点でお伝えしました。

  • ディスクI/Oの速さが正義(専用の高速SSDを使う)
  • デフラグと容量監視を怠ると、突然システムが止まる
  • 定期的なスナップショットこそが最強の保険

最初は難しく感じるかもしれませんが、仕組みを理解してしまえば、etcdは非常にロジカルで頼もしい相棒です。「これをマスターすれば、毎日の作業が劇的に楽になりますよ」。
トラブルが起きたときにも、慌てずに「あ、etcdの状態とストレージを確認しよう」と思える余裕が持てるはずです。

さあ、今日からあなたのKubernetesライフを、より堅牢で安心なものにアップデートしていきましょう!

タイトルとURLをコピーしました