概述
etcd 是一個基於 Raft 協議實現。開源的、分散式的鍵值儲存系統。主要用於在分散式系統中提供強一致性和高可用性的資料儲存。
etcd 在 Kubernetes 中的作用如下:
- 叢集狀態資料儲存:叢集配置,叢集狀態資訊等
- 保證叢集一致性和高可用:多例項的資料同步
- 服務發現和配置共享
- 叢集資料備份和恢復
作為 Kubernetes 的核心元件,etcd 為叢集的穩定性、可靠性和一致性提供了支撐。
安裝
命令列啟動
安裝參考官方文件 etcd install 指引即可,安裝後驗證:
$ etcd --version
輸出:
etcd Version: 3.5.10
Git SHA: 0223ca52b
Go Version: go1.21.3
Go OS/Arch: darwin/arm64
phoenix@xiaobindeMacBook-Pro ~ % etcd
在終端啟動 etcd:
$ etcd
輸出:
{"level":"warn","ts":"2023-11-23T06:59:49.265098+0800","caller":"embed/config.go:676","msg":"Running http and grpc server on single port. This is not recommended for production."}
{"level":"info","ts":"2023-11-23T06:59:49.265318+0800","caller":"etcdmain/etcd.go:73","msg":"Running: ","args":["etcd"]}
{"level":"info","ts":"2023-11-23T06:59:49.265352+0800","caller":"etcdmain/etcd.go:100","msg":"failed to detect default host","error":"default host not supported on darwin_arm64"}
{"level":"warn","ts":"2023-11-23T06:59:49.265361+0800","caller":"etcdmain/etcd.go:105","msg":"'data-dir' was empty; using default","data-dir":"default.etcd"}
#.....
容器啟動
在容器中啟動 etcd 例項:
$ docker run -d registry.aliyuncs.com/google_containers/etcd:3.5.0-0 /usr/local/bin/etcd
進入 etcd 容器:
docker ps|grep etcd
docker exec –it <containerid> sh
使用
etcd
的使用較為簡單,主要透過 etcdctl
來執行日常操作
檢視叢集
檢視 etcd 叢集中的所有成員:
$ etcdctl member list --write-out=table
輸出:
+------------------+---------+---------+-----------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+---------+-----------------------+-----------------------+------------+
| 8e9e05c52164694d | started | default | http://localhost:2380 | http://localhost:2379 | false |
+------------------+---------+---------+-----------------------+-----------------------+------------+
儲存鍵值對
透過 put
命令用於將指定的值儲存在指定的鍵下。使用方法如下:
$ etcdctl put [key] [value]
例如,要儲存鍵為 mykey
和值為 myvalue
的鍵值對,你可以執行:
$ etcdctl put mykey myvalue
輸出:
OK
這會在 etcd
中建立或更新鍵 mykey
的值為 myvalue
。
獲取鍵值對
get
命令用於檢索儲存在指定鍵下的值。使用方法如下:
$ etcdctl get [key]
繼續上面的例子,要獲取 mykey
的值,你可以執行:
$ etcdctl get mykey
輸出:
mykey
myvalue
觀察鍵值變化
透過 watch
命令可以觀察鍵的變化。當指定的鍵發生變化(例如更新或刪除)時,會輸出通知。使用方法如下:
$ etcdctl watch [key]
例如,要觀察 mykey
的變化,你可以執行:
$ etcdctl watch mykey
然後,在另一個終端更新 mykey
操作:
$ etcdctl put mykey newValue
$ etcdctl put mykey newValue2
$ etcdctl put mykey newValue3
然後執行 watch
命令的終端輸出:
PUT
mykey
newValue
PUT
mykey
newValue2
PUT
mykey
newValue3
租約機制
租約(Lease)是一種允許將鍵值對與一個有時間限制的租約關聯的機制。租約到期後,與其關聯的鍵值對會自動刪除。
這個特性主要用於:儲存臨時配置,實現分散式鎖,心跳機制,叢集成員管理等場景。
建立租約
使用 lease grant
命令可以建立一個租約:
$ etcdctl lease grant 60
輸出:
lease 694d8c03cd2f520c granted with TTL(60s)
這個命令會建立一個持續 60 秒的租約,並且返回一個租約 ID,用於後續的操作。
列出所有租約
使用 lease list
可以檢視所有活躍的租約:
$ etcdctl lease list
輸出:
found 1 leases
694d8c03cd2f520c
這裡列出當前所有活躍的租約
將鍵繫結到租約
使用 --lease=<LEASE_ID>
選項引數可以把鍵繫結在租約上:
$ etcdctl put mykey myvalue --lease=694d8c03cd2f520c
輸出:
OK
這個鍵將在租約到期時自動刪除。
保持活躍
使用 lease keep-alive
可以對租約進行續租:
$ etcdctl lease keep-alive 694d8c03cd2f520c
輸出:
lease 694d8c03cd2f5214 keepalived with TTL(60)
lease 694d8c03cd2f5214 keepalived with TTL(60)
lease 694d8c03cd2f5214 keepalived with TTL(60)
# ....
這條命令將保持租約活躍,防止其到期。
撤銷租約
使用 lease revoke
可以提前結束租約:
$ etcdctl lease revoke 694d8c03cd2f520c
輸出:
lease 694d8c03cd2f520c revoked
這將撤銷租約並刪除所有與之相關聯的鍵。
備份和恢復
在 etcd 中,snapshot
功能是一種重要的資料保護和恢復機制。它允許你儲存 etcd
資料庫的當前狀態,並在需要時從這些快照中恢復資料。
建立快照
使用 etcdctl snapshot save
命令可以建立當前的資料快照:
$ etcdctl snapshot save snapshot.db
輸出:
{"level":"info","ts":"2023-11-25T11:05:38.646873+0800","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"snapshot.db.part"}
{"level":"info","ts":"2023-11-25T11:05:38.652861+0800","logger":"client","caller":"v3@v3.5.10/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2023-11-25T11:05:38.653092+0800","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
{"level":"info","ts":"2023-11-25T11:05:38.657127+0800","logger":"client","caller":"v3@v3.5.10/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2023-11-25T11:05:38.660291+0800","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"98 kB","took":"now"}
{"level":"info","ts":"2023-11-25T11:05:38.660394+0800","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"snapshot.db"}
這會將當前 etcd 資料庫的狀態儲存到名為 snapshot.db
的檔案中。
恢復資料
使用 etcdctl snapshot restore
命令可以從快照檔案中恢復資料:
$ etcdctl snapshot restore snapshot.db
輸出:
2023-11-25T11:06:10+08:00 info snapshot/v3_snapshot.go:260 restoring snapshot {"path": "snapshot.db", "wal-dir": "default.etcd/member/wal", "data-dir": "default.etcd", "snap-dir": "default.etcd/member/snap"}
2023-11-25T11:06:10+08:00 info membership/store.go:141 Trimming membership information from the backend...
2023-11-25T11:06:10+08:00 info membership/cluster.go:421 added member {"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"]}
2023-11-25T11:06:10+08:00 info snapshot/v3_snapshot.go:287 restored snapshot {"path": "snapshot.db", "wal-dir": "default.etcd/member/wal", "data-dir": "default.etcd", "snap-dir": "default.etcd/member/snap"}
這會從 snapshot.db
中恢復資料,並且配置新的 etcd 例項。
在 K8S 中建立 etcd
安裝 Helm
首先,安裝 Helm 包管理工具,它主要用於簡化 Kubernetes 應用程式的部署和管理。
新增 bitnami 倉庫
然後將 Bitnami 倉庫新增到你的 Helm 包中:
$ helm repo add bitnami https://charts.bitnami.com/bitnami
Bitnami 提供了許多預打包的 K8S 應用和服務,新增它你可以方便的搜尋、配置和安裝各種安全可靠的應用。
下載 chart
從 Bitnami 倉庫下載解壓編輯 etcd
的 Helm chart:
$ helm pull bitnami/etcd
$ tar -xvf etcd-6.8.4.tgz
$ vi etcd/values.yaml
在本地環境為了避免產生不必要的資料檔案,將資料持久化設定為 false:
persistence:
## @param persistence.enabled If true, use a Persistent Volume Claim. If false, use emptyDir.
enabled: false
這意味著 etcd 資料不會被持久化儲存,當 Pod 重啟時資料會丟失。
安裝 chart
將 chart 部署到 Kubernetes 叢集中:
$ helm install my-release ./etcd
執行這個命令,Helm 會根據位於 /etcd
目錄中的 values.yaml
檔案和其他 chart 檔案,建立一組 Kubernetes 資源來部署 etcd 應用。
啟動 etcd 客戶端
啟動 etcd 客戶端:
$ kubectl run my-release-etcd-client --restart='Never' --image docker.io/bitnami/etcd:3.5.0-debian-10-r94 --env ROOT_PASSWORD=$(kubectl get secret --namespace default my-release-etcd -o jsonpath="{.data.etcd-root-password}" | base64 --decode) --env ETCDCTL_ENDPOINTS="my-release-etcd.default.svc.cluster.local:2379" --namespace default --command -- sleep infinity
此命令建立一個 etcd 客戶端 Pod,用於和 etcd 服務進行互動。
驗證
首先檢視 Pod:
$ kubectl get pod
輸出:
NAME READY STATUS RESTARTS AGE
my-release-etcd-0 1/1 Running 0 7m28s
my-release-etcd-client 1/1 Running 0 74s
進入容器:
$ kubectl exec --namespace default -it my-release-etcd-client -- bash
儲存鍵:
$ etcdctl --user root:$ROOT_PASSWORD put /message Hello
獲取鍵:
$ etcdctl --user root:$ROOT_PASSWORD get /message
輸出:
/message
Hello
到這裡在 K8S 中建立 etcd,從設定環境、安裝 etcd,到透過客戶端驗證的基本使用到這裡就完成了。