iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

我真的覺得認為 K8s 到底在火什麼系列 第 27

etcd 元件淺解

在 Kubernetes 中元件間的通訊都是藉由 API Server 通訊,而 API Server 是和 etcd 通訊的唯一元件,因此在 Kubernetes 上所有狀態都是藉由 API Server 來修改。從下面這個系統上預設元件來看,etcdcorednsapiservercontroller-managerscheduler 都運行在 master 上,我們所下達的 kubectl 相關命令都是 API Serverkubelete(每個節點都會安裝的代理) 發起。

$ kubectl get pods -n kube-system -o custom-columns=POD:metadata.name,NODE:spec.nodeName 
POD                              NODE
coredns-66bff467f8-5pfbz         master
coredns-66bff467f8-v4txv         master
etcd-master                      master
kube-apiserver-master            master
kube-controller-manager-master   master
kube-flannel-ds-amd64-gljsn      master
kube-flannel-ds-amd64-s58vt      node01
kube-flannel-ds-amd64-w2q8g      node02
kube-proxy-fm749                 master
kube-proxy-xpt4b                 node01
kube-proxy-xxlnx                 node02
kube-scheduler-master            master

對於只有一個 master 來說其元件都沒有高可用性,如果有實現的話 etcdAPI Server 將可以並行執行,相對的其它元件只有一個會做回應,其餘都是備援狀態。

如何使用 etcd

etcd 是一個分散式以 Key-value 做儲存的軟體,etcd 在 Kubernetes 中是唯一儲存集群狀態和一些數據的地方,那為何只有 API Server 可以對 etcd 讀寫?它避免了 Optimistic Concurrency Control 或是增強驗證系統,這樣替換元件時也方便。

儲存在 etcd 的資源

儲存在 etcd 中的資源依照目前不同版本有不一樣的做法,在第二版會是以檔案系統方式建立,而第三版是以 / 做為取代目錄。這邊補充一個 etcd 使用 RAFT 演算法保證一致性。

$ sudo apt install etcd-client # 安裝套件

這邊使用的環境是 kubeadm 架設的,而預設 etcd 使用 tls。

$ sudo 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/namespaces/default -w=json | jq .
{
  "header": {
    "cluster_id": 14991974125033499000,
    "member_id": 13655367627031355000,
    "revision": 205622,
    "raft_term": 2
  },
  "kvs": [
    {
      "key": "L3JlZ2lzdHJ5L25hbWVzcGFjZXMvZGVmYXVsdA==",
      "create_revision": 152,
      "mod_revision": 152,
      "version": 1,
      "value": "azhzAAoPCgJ2MRIJTmFtZXNwYWNlErIBCpcBCgdkZWZhdWx0EgAaACIAKiQwN2ZjNjg5NS1lZDY2LTRlZDMtYWFkYS03MDRiZThmN2FjYjcyADgAQggInrvu+QUQAHoAigFPCg5rdWJlLWFwaXNlcnZlchIGVXBkYXRlGgJ2MSIICJ677vkFEAAyCEZpZWxkc1YxOh0KG3siZjpzdGF0dXMiOnsiZjpwaGFzZSI6e319fRIMCgprdWJlcm5ldGVzGggKBkFjdGl2ZRoAIgA="
    }
  ],
  "count": 1
}
$ sudo 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/namespaces/ --prefix -w=json | jq . # --prefix 查看子目錄

這邊的 Key 使用 base64 編碼,解碼後就可以知道其結構

$ echo L3JlZ2lzdHJ5L25hbWVzcGFjZXMvZGVmYXVsdA== | base64 -d
/registry/namespaces/default

備份後續如果可以的話會補上~~~

參考資源


上一篇
有狀態管理 StatefulSet
下一篇
切換群集的 context
系列文
我真的覺得認為 K8s 到底在火什麼30

尚未有邦友留言

立即登入留言