etcd 解析


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的原理解析請參考Etcd 架構與實現解析

使用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,一定要對該目錄做好備份。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM