Etcd在kubernetes叢集中的作用
Etcd是Kubernetes叢集中的一個十分重要的元件,用於儲存叢集所有的網路配置和物件的狀態資訊。在後面具體的安裝環境中,我們安裝的etcd的版本是v3.1.5,整個kubernetes系統中一共有兩個服務需要用到etcd用來協同和儲存配置,分別是:
- 網路外掛flannel、對於其它網路外掛也需要用到etcd儲存網路的配置資訊
- kubernetes本身,包括各種物件的狀態和元資訊配置
注意:flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API,所以在下面我們執行etcdctl
的時候需要設定ETCDCTL_API
環境變數,該變數預設值為2。
原理
Etcd使用的是raft一致性演算法來實現的,是一款分散式的一致性KV儲存,主要用於共享配置和服務發現。關於raft一致性演算法請參考該動畫演示。
使用Etcd儲存Flannel網路資訊
我們在安裝Flannel的時候配置了FLANNEL_ETCD_PREFIX="/kube-centos/network"
引數,這是Flannel查詢etcd的目錄地址。
檢視Etcd中儲存的flannel網路資訊:
$ etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem ls /kube-centos/network -r 2018-01-19 18:38:22.768145 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated /kube-centos/network/config /kube-centos/network/subnets /kube-centos/network/subnets/172.30.31.0-24 /kube-centos/network/subnets/172.30.20.0-24 /kube-centos/network/subnets/172.30.23.0-24
檢視flannel的配置:
$ etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem get /kube-centos/network/config 2018-01-19 18:38:22.768145 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated { "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "host-gw" } }
使用Etcd儲存Kubernetes物件資訊
Kubernetes使用etcd v3的API操作etcd中的資料。所有的資源物件都儲存在/registry
路徑下,如下:
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
如果你還建立了CRD(自定義資源定義),則在此會出現CRD的API。
檢視叢集中所有的Pod資訊
例如我們直接從etcd中檢視kubernetes叢集中所有的pod的資訊,可以使用下面的命令:
ETCDCTL_API=3 etcdctl get /registry/pods --prefix -w json|python -m json.tool
此時將看到json格式輸出的結果,其中的key
使用了base64
編碼,關於etcdctl命令的詳細用法請參考使用etcdctl訪問kubernetes資料。
Etcd V2與V3版本API的區別
Etcd V2和V3之間的資料結構完全不同,互不相容,也就是說使用V2版本的API建立的資料只能使用V2的API訪問,V3的版本的API建立的資料只能使用V3的API訪問。這就造成我們訪問etcd中儲存的flannel的資料需要使用etcdctl
的V2版本的客戶端,而訪問kubernetes的資料需要設定ETCDCTL_API=3
環境變數來指定V3版本的API。
Etcd資料備份
我們安裝的時候指定的Etcd資料的儲存路徑是/var/lib/etcd
,一定要對該目錄做好備份。