1 k8s如何使用etcd
在k8s中所有對象的manifest都需要儲存到某個地方,這樣他們的manifest在api server重新開機和失敗的時候才不會丢失。
隻有api server能通路etcd,其它元件隻能間接通路etcd的好處是
- 增強樂觀鎖系統及驗證系統的健壯性
- 友善後續存儲的替換,隻需修改api server元件的相關接口。
etcd是一個響應快、分布式、一緻的K-V存儲,也是k8s存儲叢集狀态和中繼資料的唯一地方。
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中使用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
3 檢視k8s儲存在etcd中的資料
資源都存儲在/registry下
[root@k8s-master01 ~]# etcdctl get --prefix / --keys-only|head -10 ##--keys-only表示隻看key,相對應的--print-value-only表示隻看value
檢視/registry/pods下的内容,通過輸出結果可以看出。key的命名規則為/registry/pods/namespace_name/pod_name
[root@k8s-master01 ~]# etcdctl get --prefix /registry/pods --keys-only|head -10
檢視kube-system命名空間下的條目
[root@k8s-master01 ~]# etcdctl get --prefix /registry/pods/kube-system --keys-only|head -10
4 檢視某個pod的值
在k8s中,pod等資源的value是以protobuf格式存儲的,是以我們無法直接使用etcdctl指令去查詢,會出現亂碼現象。
對此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/
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版本、名字、命名空間等資訊。