etcdをバックアップし復旧計画を立てる
目標
etcdのスナップショットを実際に取得して検証し、スナップショットが持つ時点の意味を、リソースの照合で確認し、復旧手順をドキュメントとして残します。
なぜ重要なのか
CKAの実技では、etcdのバックアップはほぼ毎回出ます。しかし、コマンドを暗記するだけでは足りません。このラボが強調するのは、スナップショットが時点を持つという事実です。スナップショットを取得したあとに作成したリソースは、そのファイルの中にはなく、復旧すると消えます。この感覚がないと、復旧後に「なぜ昨日作ったものがないのですか」という事故が起きます。
復旧計画を文章で書かせる理由もあります。復旧はコマンド1行ではなく、順序です。コントロールプレーンを停止し、新しいdata-dirに展開し、メンバー構成とpeer URLを合わせて、再び起動します。この順序をあらかじめ書いておかないと、障害の真っ只中で作ることになり、そのときの判断は、たいてい間違います。
この環境のetcdは、127.0.0.1:2379で動いています。実際のkubeadmクラスターなら、ここに--cacert、--cert、--keyの3つのオプションがさらに付きます。
ステップ
/root/cka-etcd/env.shを作成し、ETCDCTL_API=3とETCDCTL_ENDPOINTS=127.0.0.1:2379を、子プロセスに伝わるようにエクスポートしてください。- etcdのエンドポイントの状態(またはヘルス)の出力を、
/root/cka-etcd/status.txtに保存してください。ファイルにエンドポイントのアドレスが見えている必要があります。 - ネームスペース
cka-etcdを作成し、ConfigMappre-backupを作成してください。データはstage=beforeです。そのあと、cka-etcdのConfigMapの一覧を/root/cka-etcd/before.txtに保存してください。 - etcdのスナップショットを
/root/cka-etcd/snap.dbに保存してください。 - そのスナップショットの状態(メタデータ)の出力を、
/root/cka-etcd/snap-status.txtに保存してください。 - スナップショットを取得したあとにConfigMap
post-backup(データstage=after)をcka-etcdに作成し、ConfigMapの一覧を/root/cka-etcd/after.txtに保存してください。before.txtにはpost-backupがなく、after.txtには両方ある必要があります。 /root/cka-etcd/restore-plan.mdに、復旧手順を5行以上、200バイト以上で書いてください。snapshot restore、--data-dir、--initial-cluster、peerポート2380、apiserverという語がすべて入っている必要があり、復旧中にコントロールプレーンを一時的に停止するという内容も必要です。
参考
etcdctl snapshot statusがなければ、etcdutl snapshot statusを使ってみてください。最新のetcdは、オフライン作業をetcdutlに移しました。- スナップショットのファイルはbboltデータベースなので、テキストとして開いても意味がありません。サイズとstatusの出力で確認します。
- よくあるミス1: ステップ6を、ステップ4より先に行うことです。そうすると、照合が成立しません。
- よくあるミス2: 復旧計画に、apiserverを停止するステップを抜かしてしまうことです。生きているapiserverが書き込みを続けると、復旧したものとずれます。
etcdctlの環境変数を整理する
/root/cka-etcd/env.shを作成し、ETCDCTL_API=3とETCDCTL_ENDPOINTS=127.0.0.1:2379を、子プロセスに伝わるようにエクスポートしてください。
etcdctlは、v2とv3のAPIが分かれています。環境変数は子プロセスに伝わる必要があるので、ただ代入するだけでは足りません。
エンドポイントの状態を確認する
etcdのエンドポイントの状態(またはヘルス)の出力を、/root/cka-etcd/status.txtに保存してください。ファイルにエンドポイントのアドレスが見えている必要があります。
endpoint statusとendpoint healthの両方を使います。出力が標準エラー出力に出る場合があるので、リダイレクトに注意してください。
バックアップの基準点を作る
ネームスペースcka-etcdを作成し、ConfigMappre-backupを作成してください。データはstage=beforeです。そのあと、cka-etcdのConfigMapの一覧を/root/cka-etcd/before.txtに保存してください。
スナップショットがどの時点を持つかをあとで照合するには、今の状態をファイルに残す必要があります。このファイルには、まだないものがある必要があり、そうでないと、あとのステップが成立しません。
スナップショットを保存する
etcdのスナップショットを/root/cka-etcd/snap.dbに保存してください。
snapshot saveは、ファイルパスを引数として受け取ります。ディレクトリがなければ失敗するので、先に作成しておいてください。
スナップショットのメタデータを確認する
そのスナップショットの状態(メタデータ)の出力を、/root/cka-etcd/snap-status.txtに保存してください。
statusは、ハッシュ、リビジョン、キーの個数、サイズを表示します。最新のetcdは、このサブコマンドを別のツールに移したので、なければそちらを使ってみてください。
バックアップ後のリソースと照合する
スナップショットを取得したあとにConfigMappost-backup(データstage=after)をcka-etcdに作成し、ConfigMapの一覧を/root/cka-etcd/after.txtに保存してください。before.txtにはpost-backupがなく、after.txtには両方ある必要があります。
スナップショットを取得したあとに作成したリソースは、そのスナップショットの中にありません。その事実を、2つのファイルの差で証明するステップです。
総合: 復旧手順をドキュメントとして残す
/root/cka-etcd/restore-plan.mdに、復旧手順を5行以上、200バイト以上で書いてください。snapshot restore、--data-dir、--initial-cluster、peerポート2380、apiserverという語がすべて入っている必要があり、復旧中にコントロールプレーンを一時的に停止するという内容も必要です。
復旧はコマンド1行ではなく、順序です。何を先に停止し、どこに展開し、どの値を合わせれば再び起動するのかを書いてください。