天天看點

K8S核心元件etcd詳解(二)

作者:singless233

1 k8s如何使用etcd

在k8s中所有對象的manifest都需要儲存到某個地方,這樣他們的manifest在api server重新開機和失敗的時候才不會丢失。

隻有api server能通路etcd,其它元件隻能間接通路etcd的好處是

  • 增強樂觀鎖系統及驗證系統的健壯性
  • 友善後續存儲的替換,隻需修改api server元件的相關接口。

etcd是一個響應快、分布式、一緻的K-V存儲,也是k8s存儲叢集狀态和中繼資料的唯一地方。

K8S核心元件etcd詳解(二)

2 如何更友善地使用etcdctl指令

https://github.com/etcd-io/etcd/tree/main/etcdctl#readme

etcd接口有V2和V3兩個版本,從Kubernetes1.6開始預設etcd版本都為v3,v2和v3接口不相容,是以使用etcdctl操作我們要确認好api版本。

[root@k8s-master01 ~]# yum install etcd -y ##安裝etcd服務,下載下傳後會自帶用戶端工具etcdctl[root@k8s-master01 ~]# etcdctl --versionetcdctl version: 3.3.11
API version: 2
[root@k8s-master01 ~]# export ETCDCTL_API=3 ##設定api版本為v3
[root@k8s-master01 ~]# etcdctl version ##不同接口使用的指令也有差異
etcdctl version: 3.3.11
API version: 3.3           
K8S核心元件etcd詳解(二)

另外在k8s中使用etcdctl連接配接etcd中要用到ca證書進行認證,而且還需要指定etcd節點ip和端口資訊,這就使得整個指令執行起來非常的冗長。

我們可以把相應的資訊通過變量定義,這樣在etcdctl指令在執行時可以根據相關的變量擷取需要的資訊。

[root@k8s-master01 ~]# cat /etc/profile.d/etcd
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
export ETCDCTL_ENDPOINTS=https://10.0.107.77:2379,https://10.0.113.204:2379,https://10.0.87.66:2379
[root@k8s-master01 ~]# source /etc/profile.d/etcd
[root@k8s-master01 ~]# etcdctl member list
15c808b23512a31a, started, k8s-master02, https://10.0.107.77:2380, https://10.0.107.77:2379
5ca9692dbcd57e55, started, k8s-master03, https://10.0.113.204:2380, https://10.0.113.204:2379
f8b45063ae1a7dfa, started, k8s-master01, https://10.0.87.66:2380, https://10.0.87.66:2379           
K8S核心元件etcd詳解(二)

3 檢視k8s儲存在etcd中的資料

資源都存儲在/registry下

[root@k8s-master01 ~]# etcdctl get --prefix / --keys-only|head -10 ##--keys-only表示隻看key,相對應的--print-value-only表示隻看value           
K8S核心元件etcd詳解(二)

檢視/registry/pods下的内容,通過輸出結果可以看出。key的命名規則為/registry/pods/namespace_name/pod_name

[root@k8s-master01 ~]# etcdctl get --prefix /registry/pods --keys-only|head -10           
K8S核心元件etcd詳解(二)

檢視kube-system命名空間下的條目

[root@k8s-master01 ~]# etcdctl get --prefix /registry/pods/kube-system --keys-only|head -10           
K8S核心元件etcd詳解(二)

4 檢視某個pod的值

在k8s中,pod等資源的value是以protobuf格式存儲的,是以我們無法直接使用etcdctl指令去查詢,會出現亂碼現象。

K8S核心元件etcd詳解(二)

對此OpenShift提供了一個工具etcdhelper來解碼proto格式的内容。下面連結提供了OpenShift官方的go源碼檔案,需要編譯成可執行檔案,放到/usr/local/bin目錄後就可以直接使用。

您也可以關注微信公衆号 singless 直接微信公衆号背景回複 etcd,下載下傳我已編譯好的etcdhelper指令檔案。

https://github.com/openshift/origin/tree/master/tools/etcdhelper

etcdhelper編譯

[root@k8s-master01 ~]# wget https://github.com/openshift/origin/archive/refs/heads/master.zip
[root@k8s-master01 ~]# unzip master.zip
[root@k8s-master01 ~]# cd origin-master/tools/etcdhelper/
[root@k8s-master01 etcdhelper]# ls
etcdhelper.go OWNERS README.md
[root@k8s-master01 etcdhelper]# go build etcdhelper.go
[root@k8s-master01 etcdhelper]# ls
etcdhelper etcdhelper.go OWNERS README.md
[root@k8s-master01 etcdhelper]# cp etcdhelper /usr/local/bin/           
K8S核心元件etcd詳解(二)

etcdhelper使用方法與etcdctl類似,也需要指定k8s的ca檔案路徑,預設直接連接配接本機的2789端口進行查詢。

另外要注意具體的get查詢指令要放到最後,否則指令無法正常執行

[root@k8s-master01 ~]# etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key get /registry/pods/kube-system/etcd-k8s-master01           

通過查詢結果我們可以看到,etcd中存儲了pod etcd-k8s-master01的中繼資料資訊,包括類型、api版本、名字、命名空間等資訊。

K8S核心元件etcd詳解(二)

繼續閱讀