ETCD是一个分布式的键值对数据库,kubernetes用它来存储各种数据,例如pod、deployment、service等信息。
本节不介绍etcd原理,而是使用kubeadm安装集群后,深挖K8S如何利用它存储数据。
kubeadm安装集群后,etcd是以pod形式运行的:
直接在宿主机下运行:
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key get / --prefix --keys-only
获取所有key:
此时所有的object信息都被列出来,例如service、deployment、pod
等。
我们可以看到所有的Kuberentes的所有元数据都保存在/registry
目录下,下一层就是API对象类型(复数形式),再下一层是namespace
,最后一层是对象的名字。
以下是etcd中存储的kubernetes所有的元数据类型:
ThirdPartyResourceData
apiextensions.k8s.io
apiregistration.k8s.io
certificatesigningrequests
clusterrolebindings
clusterroles
configmaps
controllerrevisions
controllers
daemonsets
deployments
events
horizontalpodautoscalers
ingress
limitranges
minions
monitoring.coreos.com
namespaces
persistentvolumeclaims
persistentvolumes
poddisruptionbudgets
pods
ranges
replicasets
resourcequotas
rolebindings
roles
secrets
serviceaccounts
services
statefulsets
storageclasses
thirdpartyresources
如果想进一步查看某deployment的信息:
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key get /registry/deployments/dev/nginx -w=json| jq
发现key和value都是base64编码,解码后可以查询到这个deployment的详细信息: