4.6. etcd のバックアップ
etcd はすべてのオブジェクト定義、および永続マスターの状態を保存するキー値のストアです。他のコンポーネントは変更の有無を監視して、それぞれ必要な状態に切り替えます。
3.5 よりも前の OpenShift Container Platform バージョンは etcd バージョン 2 (v2) を使用し、3.5 以降ではバージョン 3 (v3) を使用します。etcd のデータモデルは、この 2 つのバージョン間で異なります。etcd v3 は v2 と v3 データモデルの両方を使用できますが、etcd v2 は v2 データモデルしか使用できません。etcd v3 サーバーでは、v2 および v3 データストアは並列して存在し、それぞれ独立しています。
v2 および v3 の両方の操作については、ETCDCTL_API
環境変数を使用して適切な API を使用できます。
$ etcdctl -v etcdctl version: 3.2.28 API version: 2 $ ETCDCTL_API=3 etcdctl version etcdctl version: 3.2.28 API version: 3.2
v3 への移行方法についての詳細は、OpenShift Container Platform 3.7 ドキュメントの Migrating etcd Data (v2 to v3) のセクションを参照してください。
OpenShift Container Platform バージョン 3.10 移行では、etcd を別のホストにインストールすることも、マスターホスト上の静的 Pod として実行することもできます。別個の etcd ホストを指定しない場合、etcd はマスターホストの静的 Pod として実行されます。この違いにより、静的 Pod を使用する場合はバックアッププロセスも異なります。
etcd のバックアッププロセスは 2 つの異なる手順で設定されています。
- 設定のバックアップ: 必要な etcd 設定および証明書が含まれます。
- データのバックアップ: v2 と v3 の両方のデータモデルが含まれます。
データのバックアッププロセスは、適切な証明書が提供され、etcdctl
ツールがインストールされている etcd クラスターに接続できるホストで実行できます。
バックアップファイルは可能な場合は OpenShift Container Platform 環境外の外部システムにコピーしてから暗号化する必要があります。
etcd のバックアップには現在のストレージボリュームへのすべての参照が含まれることに注意してください。etcd の復元時に、OpenShift Container Platform はノードでの以前の Pod の起動と同じストレージの再割り当てを開始します。このプロセスは、ノードをクラスターから削除し、新規ノードを代わりに追加するプロセスと変わりがありません。そのノードに割り当てられているすべてのものは、Pod のスケジュール先のノードに関係なく Pod に再び割り当てられます。
4.6.1. etcd のバックアップ
etcd のバックアップ時に、etcd 設定ファイルと etcd データの両方をバックアップする必要があります。
4.6.1.1. etcd 設定ファイルのバックアップ
保持する etcd 設定ファイルはすべて etcd が実行されているインスタンスの /etc/etcd
ディレクトリーに保存されます。これには、etcd 設定ファイル (/etc/etcd/etcd.conf
) およびクラスターの通信に必要な証明書が含まれます。それらすべてのファイルは Ansible インストーラーによってインストール時に生成されます。
手順
クラスターの各 etcd メンバーについての etcd 設定をバックアップします。
$ ssh master-0 1
# mkdir -p /backup/etcd-config-$(date +%Y%m%d)/
# cp -R /etc/etcd/ /backup/etcd-config-$(date +%Y%m%d)/
- 1
master-0
は、etcd メンバーの名前に置き換えます。
各 etcd クラスターメンバーの証明書および設定ファイルは一意のものです。
4.6.1.2. etcd データのバックアップ
前提条件
OpenShift Container Platform インストーラーはエイリアスを作成するため、etcdctl2
(etcd v2 タスクの場合) と etcdctl3
(etcd v3 タスクの場合) という名前のすべてのフラグを入力しなくて済みます。
ただし、etcdctl3
エイリアスは etcdctl
コマンドに詳細なエンドポイント一覧を提供しないため、--endpoints
オプションを指定し、すべてのエンドポイントを一覧表示する必要があります。
etcd をバックアップする前に、以下を確認してください。
-
etcdctl
バイナリーが利用可能であるか、またはコンテナー化インストールの場合はrhel7/etcd
コンテナーが利用可能でなければなりません。 - OpenShift Container Platform API サービスが実行中であることを確認します。
- etcd クラスターとの接続を確認します (ポート 2379/tcp)。
- etcd クラスターに接続するために使用する適切な証明書があることを確認します。
ヘルスを確認して、etcd クラスターが機能していることを確認します。
エンドポイントの正常性を確認します。
# etcdctl3 --cert="/etc/etcd/peer.crt" \ --key=/etc/etcd/peer.key \ --cacert="/etc/etcd/ca.crt" \ --endpoints="https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379" \1 endpoint health
- 1
- これらの値は、クラスターのエンドポイントに置き換えます。
出力例
https://master-0.example.com:2379 is healthy: successfully committed proposal: took = 5.011358ms https://master-1.example.com:2379 is healthy: successfully committed proposal: took = 1.305173ms https://master-2.example.com:2379 is healthy: successfully committed proposal: took = 1.388772ms
メンバーの一覧を確認します。
# etcdctl3 member list
出力例
2a371dd20f21ca8d, started, master-1.example.com, https://192.168.55.12:2380, https://192.168.55.12:2379 40bef1f6c79b3163, started, master-0.example.com, https://192.168.55.8:2380, https://192.168.55.8:2379 95dc17ffcce8ee29, started, master-2.example.com, https://192.168.55.13:2380, https://192.168.55.13:2379
手順
etcdctl backup
コマンドはバックアップを実行するために使用されますが、etcd v3 には バックアップ の概念がありません。代わりに、etcdctl snapshot save
コマンドを使用してライブメンバーの snapshot を取るか、または etcd データディレクトリーの member/snap/db
ファイルをコピーしてください。
etcdctl backup
コマンドは、ノード ID やクラスター ID などのバックアップに含まれるメタデータの一部を書き換えるので、バックアップでは、ノードの以前のアイデンティティーが失われます。バックアップからクラスターを再作成するには、新規の単一ノードクラスターを作成してから、残りのノードをクラスターに追加します。メタデータは新規ノードが既存クラスターに加わらないように再作成されます。
etcd データをバックアップします。
OpenShift Container Platform の以前のバージョンからアップグレードしたクラスターには、v2 データストアが含まれる可能性があります。すべての etcd データストアをバックアップしてください。
静的 Pod マニフェストから etcd エンドポイント IP アドレスを取得します。
$ export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
$ export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
管理者としてログインします。
$ oc login -u system:admin
etcd Pod 名を取得します。
$ export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
kube-system
プロジェクトに切り替えます。$ oc project kube-system
Pod の etcd データのスナップショットを作成し、これをローカルに保存します。
$ oc exec ${ETCD_POD} -c etcd -- /bin/bash -c "ETCDCTL_API=3 etcdctl \ --cert /etc/etcd/peer.crt \ --key /etc/etcd/peer.key \ --cacert /etc/etcd/ca.crt \ --endpoints $ETCD_EP \ snapshot save /var/lib/etcd/snapshot.db" 1
- 1
- スナップショットは、
/var/lib/etcd/
配下のディレクトリーに記述する必要があります。