前言
知識(shí)點(diǎn)
- 定級(jí):入門級(jí)
- 如何利用 AI 助手輔助運(yùn)維工作
- 單節(jié)點(diǎn) Zookeeper 安裝部署
- 集群模式 Zookeeper 安裝部署
- 開源應(yīng)用選型思想
實(shí)戰(zhàn)服務(wù)器配置(架構(gòu) 1:1 復(fù)刻小規(guī)模生產(chǎn)環(huán)境,配置略有不同)
主機(jī)名 | IP | CPU | 內(nèi)存 | 系統(tǒng)盤 | 數(shù)據(jù)盤 | 用途 |
---|---|---|---|---|---|---|
ks-master-0 | 192.168.9.91 | 4 | 8 | 50 | 100 | KubeSphere/k8s-master |
ks-master-1 | 192.168.9.92 | 4 | 8 | 50 | 100 | KubeSphere/k8s-master |
ks-master-2 | 192.168.9.93 | 4 | 8 | 50 | 100 | KubeSphere/k8s-master |
ks-worker-0 | 192.168.9.95 | 4 | 16 | 50 | 100 | k8s-worker/CI |
ks-worker-1 | 192.168.9.96 | 4 | 16 | 50 | 100 | k8s-worker |
ks-worker-2 | 192.168.9.97 | 4 | 16 | 50 | 100 | k8s-worker |
storage-0 | 192.168.9.81 | 2 | 4 | 50 | 100+ | ElasticSearch/GlusterFS/Ceph/Longhorn/NFS/ |
storage-1 | 192.168.9.82 | 2 | 4 | 50 | 100+ | ElasticSearch/GlusterFS/Ceph/Longhorn |
storage-2 | 192.168.9.83 | 2 | 4 | 50 | 100+ | ElasticSearch/GlusterFS/Ceph/Longhorn |
registry | 192.168.9.80 | 2 | 4 | 50 | 200 | Sonatype Nexus 3 |
合計(jì) | 10 | 32 | 88 | 500 | 1100+ |
實(shí)戰(zhàn)環(huán)境涉及軟件版本信息
- 操作系統(tǒng):openEuler 22.03 LTS SP2 x86_64
- KubeSphere:3.3.2
- Kubernetes:v1.24.12
- Containerd:1.6.4
- GlusterFS:10.0-8
- KubeKey: v3.0.8
- Zookeeper:3.8.2
簡介
今天我們的實(shí)戰(zhàn)內(nèi)容采用場景模擬的形式,模擬真實(shí)運(yùn)維工作中,必然會(huì)遇到的一個(gè)場景。
作為一個(gè)初入職場剛接觸云原生運(yùn)維的運(yùn)維小白,Boss 今天給我安排了一個(gè)高難度的任務(wù),對(duì),你沒看錯(cuò)就是高難度的。
高難度 = 2 M 1 D= 聽過、沒見過、沒干過、時(shí)間短。
Boss 提出的任務(wù)要求整理如下(都是我根據(jù) Boss 的原話,自己理解、猜測、搜索整理的,實(shí)際上 Boos 根本沒說幾個(gè)字):
- 在 K8s 集群上部署一個(gè)單節(jié)點(diǎn)模式的 Zookeeper
- 在 K8s 集群上部署集群模式的 Zookeeper
- 使用場景:研發(fā)、測試(后期很有可能直接轉(zhuǎn)生產(chǎn))
- 任務(wù)交付期:明天(領(lǐng)導(dǎo)認(rèn)為很簡單)
- 核心要求:能用就行(自己理解的)
既然不能拒絕,時(shí)間緊任務(wù)重,那就干吧,沖沖沖?。。?/p>
2. 任務(wù)實(shí)現(xiàn)思路分析
工欲善其事,必先利其器。既然是 2 M 1 D 級(jí)別的任務(wù),先搬出 AI 時(shí)代運(yùn)維三板斧中的前兩板,看看是否能解決問題。
由于只用了兩板斧就搞定了,所以就沒用到第三板。
第一板斧——AI 助手
提示詞: "我要在 K8s 上部署 zookeerper。分別給我一個(gè)單節(jié)點(diǎn)和集群模式的部署方案,注意需要使用存儲(chǔ)類 glusterfs、需要有 SVC、需要有 zoo.cfg 的 ConfigMap"
重點(diǎn)說明: 本人學(xué)藝不精,AI 助手玩的還不熟,提示詞寫的不好,所以最終效果也不是太好。
輸入上面的提示詞以后,AI 助手-3.5 吧啦吧啦返回了一堆文字給我,我只取了精華作為展示。
- 單節(jié)點(diǎn)部署配置文件(
zookeeper-single.yaml
)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
selector:
app: zookeeper
ports:
- protocol: TCP
port: 2181
targetPort: 2181
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zookeeper-config
data:
zoo.cfg: |
tickTime=2000
dataDir=/data
clientPort=2181
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zookeeper
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.7.0
resources:
requests:
cpu: 100m
memory: 1Gi
ports:
- containerPort: 2181
volumeMounts:
- name: zookeeper-data
mountPath: /data
env:
- name: ZOOKEEPER_CONFIG_FILE
value: /opt/zookeeper-3.7.0/conf/zoo.cfg
- name: ZOO_SERVERS
value: "server.1=zookeeper-0.zookeeper.default.svc.cluster.local:2888:3888;2181"
volumes:
- name: zookeeper-data
persistentVolumeClaim:
claimName: zookeeper-data
- name: zookeeper-config
configMap:
name: zookeeper-config
- 集群模式部署配置文件(
zookeeper-cluster.yaml
):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
selector:
app: zookeeper
ports:
- protocol: TCP
port: 2181
targetPort: 2181
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zookeeper-config
data:
zoo.cfg: |
tickTime=2000
dataDir=/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper-0.zookeeper.default.svc.cluster.local:2888:3888
server.2=zookeeper-1.zookeeper.default.svc.cluster.local:2888:3888
server.3=zookeeper-2.zookeeper.default.svc.cluster.local:2888:3888
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
spec:
serviceName: zookeeper
replicas: 3
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.7.0
resources:
requests:
cpu: 100m
memory: 1Gi
ports:
- containerPort: 2181
volumeMounts:
- name: zookeeper-data
mountPath: /data
env:
- name: ZOOKEEPER_CONFIG_FILE
value: /opt/zookeeper-3.7.0/conf/zoo.cfg
volumes:
- name: zookeeper-data
persistentVolumeClaim:
claimName: zookeeper-data
- name: zookeeper-config
configMap:
name: zookeeper-config
分析完內(nèi)容,我發(fā)現(xiàn)我好像懂了點(diǎn),但是又沒有完全懂,返回的結(jié)果中單節(jié)點(diǎn)和集群模式的配置文件看著差不太多,分析一下結(jié)果,順便捋一下思路:
- kind 類型不同: 單節(jié)點(diǎn)是 Deployment, 集群模式是 StatefulSet,這個(gè)目前看起來沒毛病,思路是對(duì)的
- Deployment 副本數(shù)為 1,StatefulSet 副本數(shù)為 3
- 集群模式?jīng)]有使用 volumeClaimTemplates
- 集群模式 zoo.cfg 配置文件中多了幾個(gè) server 的配置項(xiàng),但是好像沒有實(shí)現(xiàn) myid 的處理
必須有一定的 K8s 和 Zookeeper 相關(guān)知識(shí)積累才能分析出 AI 助手 給出的結(jié)果是否符合需求,否則根本看不懂。
第二板斧——搜索引擎
搜索引擎,在AI 助手出來以前在運(yùn)維輔助中排名第一,現(xiàn)在暫居第二了,估計(jì)也沒機(jī)會(huì)重回巔峰了(謹(jǐn)代表個(gè)人排名意見)。
看完了 AI 助手 的輸出結(jié)果,覺得整體結(jié)構(gòu)內(nèi)容沒問題,但是感覺細(xì)節(jié)上還是差那么點(diǎn)意思,尤其是集群模式的部署。我們會(huì)在本文第三小節(jié)驗(yàn)證。
同時(shí),我還發(fā)現(xiàn)了一點(diǎn) image: zookeeper:3.7.0
,既然引用的 Image 是 DockerHub 官方的,那么 DockerHub 上一定有對(duì)應(yīng)的 Image 及容器化部署的使用方法。
這也就帶來一個(gè)新的靈感和一種新的學(xué)習(xí)方法,同時(shí)也是最簡單直接的 Docker 部署轉(zhuǎn)化為 Kubernetes 部署的方法,直接去看 Docker 的部署命令、啟動(dòng)命令、相關(guān)參數(shù),然后直接搬到 K8s 上就可以。
直接轉(zhuǎn)到 DokcerHub 官網(wǎng),我們直接用關(guān)鍵詞 zookeeper 搜索一下。
搜索結(jié)果截圖:
簡單的思考分析一下搜索結(jié)果:
-
排名最高的兩個(gè) zookeeper 鏡像,下載量都超過 100M+, 分別是 Docker 官方和 Bitnami 出品的。
-
上周下載量最多的是 Bitnami 出品的 zookeeper,下載量高達(dá) 1,140,215,比 DockerHub 出品的 zookeeper 下載量 681,115,多了一倍還多。
小提示:Bitnami, 十幾年前我就開始用,它們出品的一鍵部署安裝包,當(dāng)時(shí)就是很牛的一鍵部署中間件解決方案服務(wù)商,現(xiàn)在應(yīng)該是更全面、更牛了。
為什么要做上面的分析?
- 當(dāng)我們做開源技術(shù)選型的時(shí)候,主要的決定因素之一就是使用者數(shù)量,使用者太少說明產(chǎn)品還不成熟,代表著出了問題你都沒地方尋求幫助。
- 我的技術(shù)選型幾個(gè)原則:首選官方(Apache 官方?jīng)]有,只能選 DockerHub 官方)、用戶量大(100M+)、維護(hù)更新頻繁(7 days ago)。
- 除了 DockerHub 出品的 zookeeper 鏡像之外,Bitnami 出品的鏡像也是一個(gè)很好的選擇,群眾的眼睛是雪亮的,如果不好用也不可能這么多人推薦、下載。
- AI 助手 給出的示例用的是 DockerHub 官方的鏡像。
上面說了那么多,好像沒有說到第二板斧的重點(diǎn)搜索引擎,AI 助手 給出的結(jié)果中,單節(jié)點(diǎn)模式看著沒什么問題,但是集群模式總感覺少點(diǎn)啥,重點(diǎn)的 myid 的處理方式我就沒看到。因此,我又用關(guān)鍵詞 StatefulSet 部署 Zookeeper 在搜索引擎中搜索了一番。
搜索結(jié)果中有兩個(gè)方向的思路比較有參考價(jià)值:
- 基于 K8s 官方文檔給出的 Zookeeper 部署方案。
K8s 官網(wǎng)的一個(gè)教程案例 Running ZooKeeper, A Distributed System Coordinator,這個(gè)例子看著比較復(fù)雜,而且引入了幾個(gè)新的技術(shù)。
- 基于 Bitnami 制作的鏡像提供的 Zookeeper 集群部署方案
梳理清楚已經(jīng)獲取的信息,為了快速完成領(lǐng)導(dǎo)交付的任務(wù),今天的驗(yàn)證測試方案順序如下:
- AI 助手 提供的單節(jié)點(diǎn)部署配置
- AI 助手 提供的集群模式部署配置
- Bitnami 提供的集群模式部署方案
- K8s 官網(wǎng) Zookeeper 部署案例
因?yàn)?,單?jié)點(diǎn)部署比較簡單。所以,測試問題重點(diǎn)就在于 AI 助手和 Bitnami 提供的集群模式部署配置是否可行,如果方案可行就沒官網(wǎng)案例什么事了,如果不行再去實(shí)驗(yàn) K8s 官網(wǎng) Zookeeper 部署案例,但是說實(shí)話我暫時(shí)還很不想碰,因?yàn)檫@個(gè)案例里有個(gè)技術(shù)點(diǎn)我壓根兒就沒聽過,真要搞的話又會(huì)引入新的問題。
Zookeeper 單節(jié)點(diǎn)部署
我覺得 AI 助手 返回的單節(jié)點(diǎn)的部署方案和配置文件看著還可以沒啥問題。但是,也不要直接復(fù)制、粘貼,拿來即用。一定要多參考 DockerHub 官網(wǎng)的 Zookeeper 相關(guān)示例,二者相結(jié)合,寫出來的才是更靠譜的資源清單。
思路梳理
在 K8s 集群上部一套單節(jié)點(diǎn)的 Zookeeper 需要的資源清單如下:
-
PersistentVolumeClaim
-
ConfigMap:zoo.cfg
-
Deployment
-
Cluster Service
-
External Service(可選)
知道了需要完成的任務(wù)目標(biāo),接下來結(jié)合 AI 助手給出的配置和官方配置參數(shù),生成一套資源配置清單。
注意: 實(shí)踐證明,AI 助手 給出的也只是一個(gè)大概,細(xì)節(jié)還是有很多不足的地方,下面示例中的所有資源配置清單,都是參考官方配置參數(shù)和實(shí)際使用需求整理的。
簡單說一下修改了哪些內(nèi)容。
- Zookeeper 版本選擇,使用了落后官方最新的穩(wěn)定版 3.9.0 一個(gè)版本的 3.8.2 替換 AI 助手給出的配置方案中的 3.7.0
- 增加了 dataLog 的配置
- 完善了資源限制的配置
- 完善了 zoo.cfg 的配置
資源配置清單
如無特殊說明,所有涉及 K8s 的操作都在 Master-0 節(jié)點(diǎn)上執(zhí)行 , 配置文件根目錄為 /srv/opsman/k8s-yaml。
- 創(chuàng)建資源清單文件夾
cd /srv/opsman/k8s-yaml
mkdir -p zookeeper/single
cd zookeeper/single
- vi zookeeper-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-datalog
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 2Gi
說明: 后端存儲(chǔ)類使用的 GlusterFS。
- vi zookeeper-cm.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zookeeper-config
data:
zoo-cfg: |
tickTime=2000
dataDir=/data
dataLogDir=/datalog
clientPort=2181
initLimit=10
syncLimit=5
- vi zookeeper-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zookeeper
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.8.2
resources:
requests:
cpu: 50m
memory: 500Mi
limits:
cpu: '2'
memory: 4000Mi
ports:
- name: zookeeper-2181
containerPort: 2181
protocol: TCP
volumeMounts:
- name: config
mountPath: /conf
- name: data
mountPath: /data
- name: datalog
mountPath: /datalog
volumes:
- name: data
persistentVolumeClaim:
claimName: zookeeper-data
- name: datalog
persistentVolumeClaim:
claimName: zookeeper-datalog
- name: config
configMap:
name: zookeeper-config
items:
- key: zoo-cfg
path: zoo.cfg
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
ports:
- name: zookeeper-2181
protocol: TCP
port: 2181
targetPort: 2181
selector:
app: zookeeper
type: ClusterIP
Deployment 和 Cluster Service 放在了一個(gè)配置文件。
- vi zookeeper-external-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper-external-svc
labels:
app: zookeeper-external-svc
spec:
ports:
- name: tcp-zookeeper-external
protocol: TCP
port: 2181
targetPort: 2181
nodePort: 32181
selector:
app: zookeeper
type: NodePort
注意:可選配置項(xiàng),如果不需要被 K8s 集群之外的服務(wù)訪問,則不需要配置。
部署資源
- 部署 PersistentVolumeClaim
kubectl apply -f zookeeper-pvc.yaml
- 部署 ConfigMap
kubectl apply -f zookeeper-cm.yaml
- 部署 Deployment
kubectl apply -f zookeeper-deploy.yaml
- 部署 External Service
kubectl apply -f zookeeper-svc.yaml
K8s 部署資源驗(yàn)證
- 驗(yàn)證 PersistentVolumeClaim
[root@ks-master-0 single]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
zookeeper-data Bound pvc-371c9406-1757-451a-9c89-bed47ac71dd4 1Gi RWO glusterfs 12s Filesystem
zookeeper-datalog Bound pvc-457a134c-0db2-4efc-902c-555daba2057e 2Gi RWO glusterfs 11s Filesystem
- 驗(yàn)證 Deployment
[root@ks-master-0 single]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
zookeeper 1/1 1 1 5m1s zookeeper zookeeper:3.8.2 app=zookeeper
- 驗(yàn)證 Pod
[root@ks-master-0 single]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
zookeeper-bcfc6cc5c-bh56m 1/1 Running 0 54s 10.233.120.8 ks-worker-1 <none> <none>
- 驗(yàn)證 Service
[root@ks-master-0 single]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
zookeeper ClusterIP 10.233.58.30 <none> 2181/TCP 59s app=zookeeper
zookeeper-external-svc NodePort 10.233.40.37 <none> 2181:32181/TCP 59s app=zookeeper
Zookeeper 服務(wù)可用性驗(yàn)證
在 K8s 集群內(nèi)部驗(yàn)證。
- 在 K8s 上創(chuàng)建一個(gè) Zookeeper Client Pod 驗(yàn)證
kubectl run zookeeper-client --image=zookeeper:3.8.2
- 驗(yàn)證 Zookeeper Server 連通性
# 進(jìn)入 Zookeeper Client 容器內(nèi)部
kubectl exec -it zookeeper-client -- bash
# 連接 Zookeeper Server
bin/zkCli.sh -server 10.233.58.30:2181
# 成功結(jié)果如下
[root@ks-master-0 single]# kubectl exec -it zookeeper-client -- bash
root@zookeeper-client:/apache-zookeeper-3.8.2-bin# bin/zkCli.sh -server 10.233.58.30:2181
Connecting to 10.233.58.30:2181
2023-08-07 07:44:16,110 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:host.name=zookeeper-client
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.version=11.0.20
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.vendor=Eclipse Adoptium
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.home=/opt/java/openjdk
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.class.path=/apache-zookeeper-3.8.2-bin/bin/......(此處有省略)
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.library.path=/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.io.tmpdir=/tmp
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.compiler=<NA>
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.name=Linux
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.arch=amd64
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.version=5.10.0-153.12.0.92.oe2203sp2.x86_64
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:user.name=root
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:user.home=/root
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:user.dir=/apache-zookeeper-3.8.2-bin
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.memory.free=42MB
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.memory.max=256MB
2023-08-07 07:44:16,120 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.memory.total=48MB
2023-08-07 07:44:16,123 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=10.233.58.30:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@18bf3d14
2023-08-07 07:44:16,128 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2023-08-07 07:44:16,134 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2023-08-07 07:44:16,143 [myid:] - INFO [main:o.a.z.ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
Welcome to ZooKeeper!
2023-08-07 07:44:16,171 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server zookeeper.default.svc.cluster.local/10.233.58.30:2181.
2023-08-07 07:44:16,173 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
2023-08-07 07:44:16,185 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /10.233.118.8:55022, server: zookeeper.default.svc.cluster.local/10.233.58.30:2181
JLine support is enabled
2023-08-07 07:44:16,251 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1452] - Session establishment complete on server zookeeper.default.svc.cluster.local/10.233.58.30:2181, session id = 0x1000178f5af0000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 10.233.58.30:2181(CONNECTED) 0]
- 創(chuàng)建測試數(shù)據(jù),驗(yàn)證服務(wù)可用性
# 創(chuàng)建測試數(shù)據(jù)
[zk: 10.233.58.30:2181(CONNECTED) 0] create /test test-data1
Created /test
# 讀取測試數(shù)據(jù)
[zk: 10.233.58.30:2181(CONNECTED) 1] get /test
test-data1
在 K8s 集群外部驗(yàn)證。
本文直接使用 K8s Master-0 節(jié)點(diǎn)安裝 Zookeeper 客戶端進(jìn)行測試驗(yàn)證。
- 安裝 openjdk,僅限于測試驗(yàn)證。
yum install java-11-openjdk
- 安裝 Zookeeper 客戶端,到 Zookeeper 官網(wǎng)找相應(yīng)版本的軟件包。本文選擇 3.8.2 作為測試版本。
# 下載并解壓 Zookeeper(在國內(nèi)源下載)
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz
tar xvf apache-zookeeper-3.8.2-bin.tar.gz
- 驗(yàn)證 Zookeeper Server 連通性
cd apache-zookeeper-3.8.2-bin/bin/
./zkCli.sh -server 192.168.9.91:32181
# 成功結(jié)果如下(結(jié)果有省略)
[root@ks-master-0 bin]# ./zkCli.sh -server 192.168.9.91:32181
/usr/bin/java
Connecting to 192.168.9.91:32181
2023-08-07 15:46:53,156 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
......
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.9.91:32181(CONNECTED) 0]
- 創(chuàng)建測試數(shù)據(jù),驗(yàn)證服務(wù)可用性
# 創(chuàng)建測試數(shù)據(jù)
[zk: 192.168.9.91:32181(CONNECTED) 0] create /test2 test2-data1
Created /test2
# 讀取測試數(shù)據(jù)
[zk: 192.168.9.91:32181(CONNECTED) 1] get /test2
test2-data1
至此,Boss 交代的任務(wù)完成了一半,已經(jīng)實(shí)現(xiàn)了單節(jié)點(diǎn) Zookeeper 的部署,并在 K8s 集群內(nèi)部和外部分別做了連通性、可用性測試。
但是,時(shí)間已超期,已經(jīng)來到了第二天,所以說啊,對(duì)于一個(gè)未知的任務(wù),實(shí)現(xiàn)起來,根本沒有 Boss 想象的那么簡單。
不過,由于完成了單節(jié)點(diǎn)的任務(wù),先上交匯報(bào)給 Boss,并說明一下實(shí)現(xiàn)思路、過程,部署過程中遇到的問題及解決方案(切記不要直接跟 Boss 說這個(gè)很難,你預(yù)估的時(shí)間有問題,那么說純屬找抽)。
按上面的套路匯報(bào)完,得到了 Boss 的理解和認(rèn)可(Boss 其實(shí)還是很好說話的,只要你能以理說服他),讓我先把單節(jié)點(diǎn)的 Zookeeper 環(huán)境交給測試使用,再去繼續(xù)研究集群模式的部署方案。
這波操作不僅沒有受到批評(píng),還給自己爭取了時(shí)間,完美?。?!
集群模式 Zookeeper 部署
單節(jié)點(diǎn)部署 Zookeeper 的任務(wù)完成以后,接下來開始研究集群模式的 Zookeeper 部署,AI 助手給出的默認(rèn)示例根本就不靠譜,我也懶得再調(diào)教他了。
為什么這么說?
因?yàn)槲依?AI 助手給的方案,利用 DockerHub 提供的 Zookeeper 去嘗試在 K8s 集群上部署 Zookeeper 集群,耗時(shí) 2 天(主要是犯病了,鉆了牛角尖,就想搞定它,無奈能力又不夠?。?/p>
接下來簡單說一下,我被折磨瘋了的兩天都做了哪些嘗試、遇到了哪些問題、有哪些心得體會(huì)(逼得我都差點(diǎn)祭出第三板斧了)。
- 集群模式的關(guān)鍵解決 myid 和 servers 的配置
- servers 的配置這個(gè)沒有問題很好解決,可以在配置文件中直接寫入或是用 ENV 的方式注入
- myid 是重點(diǎn),DockHub 鏡像倉庫中提供的 Zookeeper 鏡像,節(jié)點(diǎn) myid 不能動(dòng)態(tài)配置
- 在實(shí)驗(yàn)中嘗試了 initContainers 、SidecarContainer、ConfigMap 掛載啟動(dòng)腳本等方式,都沒有起到效果
- 不是說 DockHub 鏡像徹底不能用,只是需要進(jìn)行啟動(dòng)腳本改造,甚至需要重新打 Image,太麻煩了,已經(jīng)耗時(shí) 2 天了,不得不暫時(shí)放棄
- 上面幾種嘗試以及最后的成品資源配置清單的編寫,都是在 KubeSphere 的圖形化管理控制臺(tái)下測試驗(yàn)證的,比命令行界面方便了太多
- 心得: 通往成功的路有千萬條,一條不通時(shí)可以嘗試換條路,不要死磕到底。我們的目的是為了解決問題,能解決問題的辦法就是好辦法,鉆牛角尖的精神也要分情況
最終只能另尋出路,好在之前的調(diào)研中,已經(jīng)找到了另外兩種可能的解決方案。
- 使用 Bitnami 制作的鏡像部署 Zookeeper 集群(最終選擇)。
- Kubernetes 官方文檔示例中介紹的方案,該方案使用鏡像 registry.k8s.io/kubernetes-zookeeper:1.0-3.4.10,使用 PodDisruptionBudget 確保服務(wù)可用性。
說一下最終的選型理由:
- Pod Disruption Budget,有點(diǎn)復(fù)雜不太適合我目前段位。
Pod Disruption Budget (Pod 干擾 預(yù)算) 簡稱 PDB,Kubernetes version >= 1.21 才可以使用 PodDisruptionBudget。PDB 的作用是將限制在同一時(shí)間因自愿干擾導(dǎo)致的多副本應(yīng)用中發(fā)生宕機(jī)的 Pod 數(shù)量。
具體的知識(shí)點(diǎn),本文不細(xì)說了,反正我目前也不打算用了(唉!主要是說不明白難免誤人子弟),有興趣的可以參考官方文檔的 PDB 介紹和 PDB 配置案例。
- Bitnami 制作的鏡像部署 Zookeeper 集群,該方案網(wǎng)上的參考案例有很多,而且該方案采用 Zookeeper 原生部署方案,沒有額外的 K8S 機(jī)制,減少了復(fù)雜度。這個(gè)也是選擇的重點(diǎn)。
接下來,我就開始嘗試使用 Bitnami 制作的 Zookeeper 鏡像完成 Zookeeper 集群的部署。
思路梳理
在 K8s 集群上部一套 Zookeeper 集群需要的資源清單如下:
-
StatefulSet
-
Headless Service
-
ConfigMap:zoo.cfg(沒有使用,所有的配置都使用 ENV 的形式)
-
ConfigMap:setup.sh(啟動(dòng)腳本,計(jì)劃使用實(shí)際沒有使用,最終采取了 ENV 和 Command 方式)
-
External Service(可選)
注意:由于本文配置方案沒有考慮安全配置僅適用于開發(fā)、測試環(huán)境。不要把本文的示例直接拿到生產(chǎn)環(huán)境使用,必須參考官方配置文檔增加相應(yīng)的 ENV 配置,方可用于生產(chǎn)。
資源配置清單
如無特殊說明,所有涉及 K8s 的操作都在 Master-0 節(jié)點(diǎn)上執(zhí)行 , 配置文件根目錄為 /srv/opsman/k8s-yaml。
- 創(chuàng)建資源清單文件夾
cd /srv/opsman/k8s-yaml
mkdir -p zookeeper/cluster
cd zookeeper/cluster
- vi zookeeper-svc.yaml
---
# Headless Service,用于 Zookeeper 集群之間相互通訊
apiVersion: v1
kind: Service
metadata:
name: zk-hs
labels:
app: zookeeper
spec:
ports:
- name: tcp-client
protocol: TCP
port: 2181
targetPort: 2181
- name: tcp-follower
port: 2888
targetPort: 2888
- name: tcp-election
port: 3888
targetPort: 3888
selector:
app: zookeeper
clusterIP: None
type: ClusterIP
---
# Client Service,用于 K8S 集群內(nèi)的應(yīng)用訪問 Zookeeper
apiVersion: v1
kind: Service
metadata:
name: zk-cs
labels:
app: zookeeper
spec:
ports:
- name: tcp-client
protocol: TCP
port: 2181
targetPort: 2181
selector:
app: zookeeper
type: ClusterIP
- vi zookeeper-sts.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
labels:
app: zookeeper
spec:
replicas: 3
selector:
matchLabels:
app: zookeeper
serviceName: zk-hs
template:
metadata:
name: zookeeper
labels:
app: zookeeper
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zookeeper
topologyKey: "kubernetes.io/hostname"
containers:
- name: zookeeper
image: bitnami/zookeeper:3.8.2
command:
- bash
- '-ec'
- |
HOSTNAME="$(hostname -s)"
if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; then
ORD=${BASH_REMATCH[2]}
export ZOO_SERVER_ID="$((ORD + 1 ))"
else
echo "Failed to get index from hostname $HOST"
exit 1
fi
exec /entrypoint.sh /run.sh
resources:
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 50m
memory: 500Mi
env:
- name: ZOO_ENABLE_AUTH
value: "no"
- name: ALLOW_ANONYMOUS_LOGIN
value: "yes"
- name: ZOO_SERVERS
value: >
zookeeper-0.zk-hs.default.svc.cluster.local:2888:3888
zookeeper-1.zk-hs.default.svc.cluster.local:2888:3888
zookeeper-2.zk-hs.ddefault.svc.cluster.local:2888:3888
ports:
- name: client
containerPort: 2181
- name: follower
containerPort: 2888
- name: election
containerPort: 3888
livenessProbe:
tcpSocket:
port: client
failureThreshold: 6
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
tcpSocket:
port: client
failureThreshold: 6
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
volumeMounts:
- name: data
mountPath: /bitnami/zookeeper
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "glusterfs"
resources:
requests:
storage: 2Gi
說明:
- ENV 的配置我只用了最基本的,重點(diǎn)就是 ZOO_SERVERS,更多參數(shù)的用法請(qǐng)參考 Bitnami 官方文檔
- Command 里直接寫了啟動(dòng)命令,也可以做成 ConfigMap 掛載為腳本
- default.svc.cluster.local,注意 FQDN 只能這么寫,不要寫成自定義的,哪怕我的集群域名是 opsman.top(這個(gè)是遺留問題,來不及細(xì)看了,回頭再說)
- vi zookeeper-external-svc.yaml
---
# External Client Service,用于 K8S 集群外部訪問 Zookeeper
apiVersion: v1
kind: Service
metadata:
name: zookeeper-external-svc
labels:
app: zookeeper-external-svc
spec:
ports:
- name: tcp-zookeeper-external
protocol: TCP
port: 2181
targetPort: 2181
nodePort: 32181
selector:
app: zookeeper
type: NodePort
注意:可選配置項(xiàng),如果不需要被 K8s 集群之外的服務(wù)訪問,則不需要配置。
部署資源
- 部署 Cluster 和 Headless Service
kubectl apply -f zookeeper-svc.yaml
- 部署 StatefulSet
kubectl apply -f zookeeper-sts.yaml
- 部署外部 Services
kubectl apply -f zookeeper-external-svc.yaml
K8s 部署資源驗(yàn)證
- 驗(yàn)證 PersistentVolumeClaim
[root@ks-master-0 cluster]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
data-zookeeper-0 Bound pvc-342c3869-17ca-40c7-9db0-755d5af0f85f 2Gi RWO glusterfs 2m7s Filesystem
data-zookeeper-1 Bound pvc-6744813f-0f5b-4138-8ffc-387f63044af3 2Gi RWO glusterfs 47s Filesystem
data-zookeeper-2 Bound pvc-731edc8d-189a-4601-aa64-a8d6754d93ec 2Gi RWO glusterfs 28s Filesystem
- 驗(yàn)證 StatefulSet
[root@ks-master-0 cluster]# kubectl get sts -o wide
NAME READY AGE CONTAINERS IMAGES
zookeeper 3/3 2m3s zookeeper bitnami/zookeeper:3.8.2
- 驗(yàn)證 Pod
[root@ks-master-0 cluster]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
zookeeper-0 1/1 Running 0 2m42s 10.233.118.45 ks-worker-2 <none> <none>
zookeeper-1 1/1 Running 0 83s 10.233.120.17 ks-worker-1 <none> <none>
zookeeper-2 1/1 Running 0 64s 10.233.115.99 ks-worker-0 <none> <none>
- 驗(yàn)證 Service
[root@ks-master-0 cluster]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
zk-cs ClusterIP 10.233.43.229 <none> 2181/TCP 3m58s app=zookeeper
zk-hs ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 3m58s app=zookeeper
zookeeper-external-svc NodePort 10.233.45.5 <none> 2181:32181/TCP 10s app=zookeeper
Zookeeper 集群狀態(tài)驗(yàn)證
- 驗(yàn)證 StatefulSet 創(chuàng)建的 Pod 配置的主機(jī)名
[root@ks-master-0 cluster]# for i in 0 1 2; do kubectl exec zookeeper-$i -- hostname; done
zookeeper-0
zookeeper-1
zookeeper-2
- 驗(yàn)證 StatefulSet 創(chuàng)建的 Pod 配置的完全限定域名(Fully Qualified Domain Name,F(xiàn)QDN)
[root@ks-master-0 cluster]# for i in 0 1 2; do kubectl exec zookeeper-$i -- hostname -f; done
zookeeper-0.zk-hs.default.svc.cluster.local
zookeeper-1.zk-hs.default.svc.cluster.local
zookeeper-2.zk-hs.default.svc.cluster.local
- 驗(yàn)證每個(gè) Zookeeper 服務(wù)的 myid 文件內(nèi)容
[root@ks-master-0 cluster]# for i in 0 1 2; do echo "myid zookeeper-$i";kubectl exec zookeeper-$i -- cat /bitnami/zookeeper/data/myid; done
myid zookeeper-0
1
myid zookeeper-1
2
myid zookeeper-2
3
- 驗(yàn)證 Zookeeper 生成的配置文件
[root@ks-master-0 cluster]# kubectl exec -it zookeeper-0 -- cat /opt/bitnami/zookeeper/conf/zoo.cfg | grep -vE "^#|^$"
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/bitnami/zookeeper/data
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
preAllocSize=65536
snapCount=100000
maxCnxns=0
reconfigEnabled=false
quorumListenOnAllIPs=false
4lw.commands.whitelist=srvr, mntr
maxSessionTimeout=40000
admin.serverPort=8080
admin.enableServer=true
server.1=zookeeper-0.zk-hs.default.svc.cluster.local:2888:3888;2181
server.2=zookeeper-1.zk-hs.default.svc.cluster.local:2888:3888;2181
server.3=zookeeper-2.zk-hs.default.svc.cluster.local:2888:3888;2181
- 驗(yàn)證集群狀態(tài)
[root@ks-master-0 cluster]# for i in 0 1 2; do echo -e "# myid zookeeper-$i \n";kubectl exec zookeeper-$i -- /opt/bitnami/zookeeper/bin/zkServer.sh status;echo -e "\n"; done
# myid zookeeper-0
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
# myid zookeeper-1
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
# myid zookeeper-2
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
Zookeeper 服務(wù)可用性驗(yàn)證
在 K8s 集群內(nèi)部驗(yàn)證。
- 在 K8s 上創(chuàng)建一個(gè) Zookeeper Client Pod 驗(yàn)證(單節(jié)點(diǎn)驗(yàn)證時(shí)創(chuàng)建過,不需要再創(chuàng)建了)
kubectl run zookeeper-client --image=zookeeper:3.8.2
- 驗(yàn)證 Zookeeper Server 連通性
# 進(jìn)入 Zookeeper Client 容器內(nèi)部
kubectl exec -it zookeeper-client -- bash
# 連接 Zookeeper Server( 10.233.43.229 是 Cluster Service 的 IP)
bin/zkCli.sh -server 10.233.43.229:2181
# 成功結(jié)果如下(內(nèi)容有省略)
[root@ks-master-0 cluster]# kubectl exec -it zookeeper-client -- bash
root@zookeeper-client:/apache-zookeeper-3.8.2-bin# bin/zkCli.sh -server 10.233.43.229:2181
Connecting to 10.233.43.229:2181
2023-08-08 10:08:40,864 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
.....
2023-08-08 10:08:40,872 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=10.233.43.229:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@18bf3d14
2023-08-08 10:08:40,886 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2023-08-08 10:08:40,892 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2023-08-08 10:08:40,903 [myid:] - INFO [main:o.a.z.ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
Welcome to ZooKeeper!
2023-08-08 10:08:40,920 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server zk-cs.default.svc.cluster.local/10.233.43.229:2181.
2023-08-08 10:08:40,923 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2023-08-08 10:08:40,948 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /10.233.118.8:38050, server: zk-cs.default.svc.cluster.local/10.233.43.229:2181
2023-08-08 10:08:41,064 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1452] - Session establishment complete on server zk-cs.default.svc.cluster.local/10.233.43.229:2181, session id = 0x10007253d840000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 10.233.43.229:2181(CONNECTED) 0]
- 創(chuàng)建測試數(shù)據(jù),驗(yàn)證服務(wù)可用性
# 創(chuàng)建測試數(shù)據(jù)
[zk: 10.233.43.229:2181(CONNECTED) 0] create /test test-data1
Created /test
# 讀取測試數(shù)據(jù)
[zk: 10.233.43.229:2181(CONNECTED) 1] get /test
test-data1
在 K8s 集群外部驗(yàn)證。
- 驗(yàn)證 Zookeeper Server 連通性
# 進(jìn)入 Zookeeper 安裝包的 bin 目錄
cd apache-zookeeper-3.8.2-bin/bin/
# 連接 Zookeeper Server( 192.168.9.91 是 K8S Master-0 節(jié)點(diǎn)的 IP,32181 是 External Service 定義的 NodePort 端口號(hào))
./zkCli.sh -server 192.168.9.91:32181
# 成功結(jié)果如下(結(jié)果有省略)
[root@ks-master-0 bin]# ./zkCli.sh -server 192.168.9.91:32181
/usr/bin/java
Connecting to 192.168.9.91:32181
2023-08-08 18:13:52,650 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
......
2023-08-08 18:13:52,660 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=192.168.9.91:32181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@5c072e3f
2023-08-08 18:13:52,666 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2023-08-08 18:13:52,671 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2023-08-08 18:13:52,686 [myid:] - INFO [main:o.a.z.ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
Welcome to ZooKeeper!
2023-08-08 18:13:52,708 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server ks-master-0/192.168.9.91:32181.
2023-08-08 18:13:52,709 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2023-08-08 18:13:52,721 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /192.168.9.91:45004, server: ks-master-0/192.168.9.91:32181
2023-08-08 18:13:52,776 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1452] - Session establishment complete on server ks-master-0/192.168.9.91:32181, session id = 0x10007253d840001, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.9.91:32181(CONNECTED) 0]
- 創(chuàng)建測試數(shù)據(jù),驗(yàn)證服務(wù)可用性
# 創(chuàng)建測試數(shù)據(jù)
[zk: 192.168.9.91:32181(CONNECTED) 0] create /test2 test2-data1
Created /test2
# 讀取測試數(shù)據(jù)(讀取了 2次 測試數(shù)據(jù))
[zk: 192.168.9.91:32181(CONNECTED) 1] get /test
test-data1
[zk: 192.168.9.91:32181(CONNECTED) 2] get /test2
test2-data1
至此,實(shí)現(xiàn)了 Zookeeper 集群模式部署,并在 K8S 集群內(nèi)部和外部分別做了連通性、可用性測試。
在 KubeSphere 管理控制臺(tái)驗(yàn)證
截幾張圖看一看 Zookeeper 相關(guān)資源在 KubeSphere 管理控制臺(tái)中展示效果。
- StatefulSet
- Pods
- Service
總結(jié)
本文詳細(xì)介紹了 Zookeeper 單節(jié)點(diǎn)和集群模式在基于 KubeSphere 部署的 K8s 集群上的安裝部署、測試驗(yàn)證的過程。具體涉及的內(nèi)容總結(jié)如下。
- 如何利用 AI 助手 和 搜索引擎輔助完成運(yùn)維工作。
- 如何利用 DockerHub 官方提供的 Zookeeper 鏡像,在 K8s 集群上部署單節(jié)點(diǎn) Zookeeper 服務(wù)并驗(yàn)證測試。
- 如何利用 Bitnami 提供的 Zookeeper 鏡像,在 K8s 集群上部署 Zookeeper 集群服務(wù)并驗(yàn)證測試。
- 介紹了一種使用 PodDisruptionBudget 部署 Zookeeper 集群的示例,但是并未實(shí)際驗(yàn)證。
本文的配置方案可直接用于開發(fā)測試環(huán)境,對(duì)于生產(chǎn)環(huán)境也有一定的借鑒意義。文章來源:http://www.zghlxwxcb.cn/news/detail-653464.html
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-653464.html
到了這里,關(guān)于KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!