Kubernetes クラスタのバックアップを取りたい
Kuberentes クラスタの安全性の保持のために、バックアップを取得したい時があります。
組み込みのスナップショット機能を使用して ETCD データベースのスナップショットを取得するときに利用するコマンドを、この記事では説明します。
- etcdctl snapshot save
- etcdctl snapshot restore
etcdctl snapshot save
ETCD のスナップショットを取得するコマンド。
これによって、渡したパスにスナップショットが取得されます。
コマンド実行例を次に示します。
$ ETCDCTL_API=3 etcdctl --endpoints=http://ENDPOINTS \
--cacert=CACERT_PATH \
--cert=CERT_PATH \
--key=SERVER_KEY_PATH \
snapshot save /opt/snapshot-pre-boot.db
Snapshot saved at /opt/snapshot-pre-boot.db
それぞれのオプションの意味を次に示します。
-
--endpoints
: ETCD サーバが実際にクライアントから接続を受け付けるアドレスを指定 -
--cacert
: ETCD CA 証明書ファイルのパスを指定 -
--cert
: ETCD サーバ証明書ファイルのパスを指定 -
--key
: ETCD サーバがクライアントを識別するために使用する SSL 鍵ファイル
これらのアドレスやパスの確認方法は、後述の「ETCD の設定の確認方法」を参照ください。
etcdctl snapshot restore
スナップショットを復元するコマンド。
これによって、etcdctl snapshot save
で取得したスナップショットを復元できます。
コマンド実行例を次に示します。
$ ETCDCTL_API=3 etcdctl --data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db
バックアップを作成したサーバと同じサーバで復元する場合には、
上記のように、--data-dir
のオプションのみが必要になる。
復元後には、/etc/kubernetes/manifests/etcd.yaml
をアップデートするのを忘れないでください。
上記の場合は、ETCD のスナップショットを新しいパス /var/lib/etcd-from-backup
へ復元したため、
それを YAML ファイルへ反映させます。
具体的には、etcd-data の hostPath の部分を修正します。
volumes:
- hostPath:
path: /var/lib/etcd-from-backup
type: DirectoryOrCreate
name: etcd-data
これによって、コンテナ上の /var/lib/etcd は、コントロールプレーン上の /var/lib/etcd-from-backup
を指すようになります。
このファイルが更新されると、ETCD Pod は /etc/kubernetes/manifests
ディレクトリの下に配置される静的 Pod であるため、自動的に再作成されます。
注意
ETCD Pod が変更されると、自動的に再起動され、kube-controller-manager および kube-scheduler も再起動されます。このポッドが再起動するまで 1-2 分かかります。次のコマンドを実行すると、ETCD ポッドがいつ再起動されるかを確認できます。
$ watch "crictl ps | grep etcd"
ETCD ポッドが Ready 1/1 になっていない場合は、次のコマンドで再起動し、1 分間待ってください。
$ kubectl delete pod -n kube-system etcd-controlplane
ETCD の設定の確認方法
ETCD のバージョン
$ kubectl describe pod etcd-controlplane -n kube-system| grep -i image
Image: registry.k8s.io/etcd:3.5.15-0
ETCD のクライアントからの接続を受付けるアドレス
$ kubectl describe pod etcd-controlplane -n kube-system | grep advertise-client-urls
--advertise-client-urls=https://192.168.28.11:2379
ETCD サーバ証明書ファイルのパス
$ kubectl describe pods etcd-controlplane -n kube-system | grep cert-file
--cert-file=/etc/kubernetes/pki/etcd/server.crt
ETCD CA 証明書ファイルのパス
$ kubectl describe pods etcd-controlplane -n kube-system | grep trusted-ca-file
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
SSL 鍵のファイルパス
$ kubectl describe pod etcd-controlplane -n kube-system | grep key-file
--key-file=/etc/kubernetes/pki/etcd/server.key