はじめに
Kubernetesではetcdctlを利用してクラスター情報のバックアップ&リストアが可能ですが、実際に中に格納されているデータの値を表示させることができます。本記事では例として、etcdの中に格納されたnamespaceの情報を確認しました。
環境情報
- kubeadm v1.18.0
- etcdctl v3.3
格納情報の構造を確認
以下の記事ではホスト上にetcdctlコマンドがある前提でしたが今回はkubectl exec
で実際のetcdポッドでコマンドを押下します。よってcacert&cert&keyに値する情報は実機上の場所指定する必要があります。
試し打ちとして、以下コマンドで一つのkey:valueの組み合わせが確認できます。
$ kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --limit=1 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key"
実行結果は以下のように一行目にKey、二行目にValueがJSON形式で表示されます。
/registry/apiextensions.k8s.io/customresourcedefinitions/bgpconfigurations.crd.projectcalico.org {"kind":"CustomResourceDefinition","apiVersion":"apiextensions.k8s.io/v1beta1","metadata":....
Kubernetesでは全てのKeyがregistry
から始まり、次の値は以下コマンドで確認すれば
$ kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --limit=1 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key" | cut -d"/" -f3 | sort | uniq -c | sort -rn
以下のような値がapiextensions.k8s.io含めて表示されます。
54 clusterroles 48 clusterrolesbindings 33 secrets ... 5 namespaces
名前空間の値を確認する
getの後に入れるパスで絞ることができます。--keys-only
を付与すればvalueは表示されません。
$ kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get /registry/namespaces --prefix --keys-only --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key" /registry/namespaces/default /registry/namespaces/kube-public /registry/namespaces/kube-system /registry/namespaces/xxxxxx /registry/namespaces/yyyyyy
値を表示しようとすると文字化けが発生しましたが
$ kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get /registry/namespaces/default --prefix --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key" /registry/namespaces/default k8s v1 Namespace_ E default "*$557bc.... ....
kubectl get namespaces default -o=yaml
で値を確認すると同等のデータが入っていることが確認できます。
metadata: ... uid: 557bc...
終わりに
etcdctlコマンドはPod群のバックアップを取得する以外ではあまり利用しませんが、値の確認がgetで行えることは覚えておきたいです。
以上、ご参考になれば幸いです。