Chuyển đến nội dung chính

レッスン9: etcdバックアップ & リストア

etcdctlスナップショットによるetcdバックアップ。バックアップからのクラスタリストア。 etcd用TLS証明書。CKA試験の重要タスク — 完全に習得が必要。

etcdバックアップとリストア手順

1. etcd — 概要

etcdはクラスタの全状態(Pods、Services、Secrets、ConfigMaps、Nodesなど)を保持する分散キーバリューストアです。etcdを失うことはクラスタ全体を失うことを意味します。

kube-apiserverマニフェストからのetcd情報:
  cat /etc/kubernetes/manifests/etcd.yaml

主要パス:
  --data-dir=/var/lib/etcd          # データディレクトリ
  --cert-file=/etc/kubernetes/pki/etcd/server.crt
  --key-file=/etc/kubernetes/pki/etcd/server.key
  --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
  --listen-client-urls=https://127.0.0.1:2379

2. etcdctlセットアップ

# APIバージョンの設定(常にv3を使用)
export ETCDCTL_API=3

# etcd証明書の確認
ls /etc/kubernetes/pki/etcd/
# ca.crt, server.crt, server.key, healthcheck-client.*

# 接続テスト
etcdctl member list \
  --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

試験のポイント:etcdctlを使用する前にETCDCTL_API=3を設定する必要があります。API v2は異なるコマンドを使用し、互換性がありません。試験で証明書パスを忘れた場合:cat /etc/kubernetes/manifests/etcd.yaml | grep certまたはkubectl describe pod etcd -n kube-systemで確認できます。

3. etcdバックアップ

ETCDCTL_API=3 etcdctl snapshot save /opt/etcd-backup.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

# バックアップの検証
ETCDCTL_API=3 etcdctl snapshot status /opt/etcd-backup.db \
  --write-out=table

# 出力:
+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| abcdef12 |    12345 |       1234 |     4.5 MB |
+----------+----------+------------+------------+

4. etcdリストア

# ステップ1: 新しいデータディレクトリにリストア
ETCDCTL_API=3 etcdctl snapshot restore /opt/etcd-backup.db \
  --data-dir=/var/lib/etcd-restore

# ステップ2: etcdマニフェストの更新(新しいデータディレクトリを使用)
vi /etc/kubernetes/manifests/etcd.yaml

# --data-dirとhostPathボリュームを変更:
spec:
  containers:
  - command:
    - --data-dir=/var/lib/etcd-restore  # 変更
  volumes:
  - hostPath:
      path: /var/lib/etcd-restore       # 変更
      type: DirectoryOrCreate
    name: etcd-data

# ステップ3: kubeletがマニフェストの変更を検知 → etcdを再起動
# etcdの再起動を待機(2-3分かかる場合あり)
kubectl get pods -n kube-system | grep etcd

試験のポイント:リストア後、コントロールプレーン全体が再起動して同期するのを待つ必要があります。systemctl restart kubeletの実行が必要な場合もあります。APIサーバーが起動しない場合、ログを確認:crictl logs $(crictl ps -a --name kube-apiserver -q)。

5. チートシート — etcdバックアップ/リストア

# バックアップ(4つの必須フラグ):
ETCDCTL_API=3 etcdctl snapshot save BACKUP_PATH \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=CA_CERT \
  --cert=SERVER_CERT \
  --key=SERVER_KEY

# リストア(最小限):
ETCDCTL_API=3 etcdctl snapshot restore BACKUP_PATH \
  --data-dir=NEW_DATA_DIR

# 次にetcd.yamlを更新 → data-dir + volumeパス
証明書ファイルパスフラグ
CA証明書/etc/kubernetes/pki/etcd/ca.crt--cacert
サーバー証明書/etc/kubernetes/pki/etcd/server.crt--cert
サーバーキー/etc/kubernetes/pki/etcd/server.key--key

6. 練習問題

Q1:etcdスナップショットリストアを/var/lib/etcd-newに実行しました。クラスタが復旧しません。最も可能性の高い原因は?

  • A) kubeadm initを再実行する必要がある
  • B) etcd静的Podマニフェストのdata-dirとボリュームパスを新しいディレクトリに更新する必要がある ✓
  • C) etcdctl restoreに--forceフラグが必要
  • D) kube-apiserver証明書をローテーションする必要がある

解説:新しいディレクトリにリストアした後、etcd静的Podマニフェスト(/etc/kubernetes/manifests/etcd.yaml)を更新する必要があります:--data-dirフラグとhostPathボリュームパスの両方を新しいディレクトリに変更します。そうしないと、etcdは古い(壊れた)データディレクトリを読み込み続けます。

Q2:etcdctl v3 APIコマンドを使用するために設定が必要な環境変数は?

  • A) ETCD_VERSION=3
  • B) ETCDCTL_API=3 ✓
  • C) KUBECONFIG=/etc/kubernetes/etcd.conf
  • D) ETCD_ENDPOINT=localhost:2379

解説:ETCDCTL_API=3はv3 APIコマンド(snapshot save、snapshot restore)を有効にします。設定しないと、etcdctlはv2をデフォルトとして使用し、コマンド構文が異なり、etcd v3クラスタ(全Kubernetesクラスタ)と互換性がありません。

Q3:etcdctlがetcdサーバーと通信するために必要なTLS証明書はどこにありますか?

  • A) /etc/kubernetes/pki/apiserver*.crt
  • B) /etc/kubernetes/pki/etcd/ ディレクトリ ✓
  • C) ~/.kube/config
  • D) /var/lib/etcd/certs/

解説:etcd証明書は/etc/kubernetes/pki/etcd/に保存されています。重要なファイル: ca.crt(CA)、server.crtとserver.key(etcdctl用)。これらのパスはetcd静的Podマニフェストにも定義されています。