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 --version
etcdctl 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目錄后就可以直接使用。
您也可以直接微信公眾號后臺回復 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版本、名字、命名空間等信息。