(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】etcdctlによるバックアップとリストアの流れ

スポンサーリンク

はじめに

Kubernetesのバックアップツールであるetchctlを利用してバックアップ&リストアが可能です。
ドキュメントを見ると数多くのオプションを指定して実施していましたが、今回は最低限のオプションでどこまで動くかモ含めて確認ました。

結論から言うと、バックアップ取得時は endpointのパスと証明書関連、リストア時は展開先のディレクトリのみで動作しました。

環境情報
  • kubeadm v1.18.0
  • etcdctl v3

etcdのyamlを確認する

Masterノードの以下にetcdのyamlが存在します。

$ cat /etc/kubernetes/manifests/etcd.yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://172.17.0.12:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://172.17.0.12:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://172.17.0.12:2380
    - --initial-cluster=master=https://172.17.0.12:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://172.17.0.12:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://172.17.0.12:2380
    - --name=master
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
...
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data

commandに記載のある引数はetcdctlにて利用します。またdata-dirに記載のあるディレクトリはetcdが保持している実体ファイルとなります。

確かに指定のあるディレクトリ配下にDBファイルと

 ls -lh /var/lib/etcd/member/snap/db
-rw------- 1 root root 3.3M .. /var/lib/etcd/member/snap/db

トランザクションログが配置されています。

$ ls -lh /var/lib/etcd2/member/wal/0000000000000000-0000000000000000.wal
-rw------- 1 root root 62M .. /var/lib/etcd2/member/wal/0000000000000000-0000000000000000.wal

etcdctlでバックアップを取る

以下がバックアップコマンドです。

$ ETCDCTL_API=3 etcdctl snapshot save <filename>

ただしデフォルトでコマンドを打つと

rpc error: code = Unavailable desc = transport is closing

endpointのURLが誤っていると

dial tcp 127.0.0.2:2379: connect: connection refused

証明書関連の指定がないと

context deadline exceeded

といったエラーになります。

引数を正しく指定すれば以下のようにコマンドが通り

$ ETCDCTL_API=3 etcdctl --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 snapshot save hoge.db
Snapshot saved at /tmp/hoge.db

ファイルができています。ファイルの大きさは/var/lib/etcd/member/snap/dbと同程度です。

$ ls -lh /tmp/hoge.db
-rw-r--r-- 1 root root 3.3M ... /tmp/hoge.db

etcdctlでバックアップをリストアする

以下がリストアコマンドです。

$ ETCDCTL_API=3 etcdctl snapshot restore <filename> [options]

以下のオプションで展開先のディレクトリを指定します。

--data-dir=""                                             Path to the data directory

ディレクトリは未作成でもコマンドは通りました。

$ ETCDCTL_API=3 etcdctl snapshot restore /tmp/hoge.db --data-dir="/var/lib/etcd2"
... | mvcc: restore compact to 3754
... | etcdserver/membership: added member 8e9e05c5... [http://localhost:2380] to cluster cdf818194e...

先ほどと同様にファイル群ができています。

$ ls /var/lib/etcd2/member/
snap  wal

etcdのyamlで読み込むディレクトリを変更する

冒頭のyamlで「/var/lib/etcd」となっている箇所を全て「/var/lib/etcd2」に修正します。他の証明書関連のディレクトリはそのままです。
yamlを修正するとkubeletが自動的にPodに反映させるので待ちます。(反映中はkubectlコマンドの結果が返ってきませんでした)

反映が終わればバックアップを取得した時点のPod群が展開されています。

試しに新たなPodを作成すれば

/var/lib/etcd2/member/snap/db

ではなく

/var/lib/etcd2/member/snap/db

に変更が入っていることが最終更新時刻から確認できます。

終わりに

任意の地点のPod群のバックアップをコマンド一発で取得できるので覚えておくと役立ちます。
尚、今回は最低限のオプションでバックアップ/リストアを行えることの確認をしてみましたが、公式ドキュメントを見るとinitial-cluster-tokenなども変更しているのでご注意ください。

以上、ご参考になれば幸いです。