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マニフェストにも定義されています。