(O+P)ut

アウトプット



(O+P)ut

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

【Kubernetes】etcdに保管されているデータ群をetcdctlコマンドでgetする

スポンサーリンク

はじめに

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で行えることは覚えておきたいです。

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