国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程

這篇具有很好參考價(jià)值的文章主要介紹了KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

知識(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é)果截圖:

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

簡單的思考分析一下搜索結(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

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

  • Pods

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

  • Service

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程,k8s,容器平臺(tái),kubesphere,云計(jì)算

總結(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)境也有一定的借鑒意義。

本文由博客一文多發(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程

    KubeSphere 部署 Zookeeper 實(shí)戰(zhàn)教程

    知識(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

    2024年02月12日
    瀏覽(15)
  • K8S-1.23.17+Ceph+KubeSphere 一主二從部署攻略

    K8S-1.23.17+Ceph+KubeSphere 一主二從部署攻略

    ? 主機(jī)最低需求: ? 4 核 CPU,4 GB 內(nèi)存,硬盤:20 GBx2 (需保留一個(gè)未分區(qū)的磁盤) 從機(jī)最低需求: ? 4 核 CPU,8 GB 內(nèi)存,硬盤:20 GBx2 (需保留一個(gè)未分區(qū)的磁盤) ? Ubuntu : 22.04 K ubesphere: 3.4.1 Docker : 20.10.24 K 8s : 1.23.17 Rook: 1.13.6 ? 注釋掉swap行并保存 出現(xiàn)如下信息表示初始

    2024年03月15日
    瀏覽(49)
  • 基于kubesphere的k8s環(huán)境部署單點(diǎn)版本的rook-ceph

    基于kubesphere的k8s環(huán)境部署單點(diǎn)版本的rook-ceph

    基于kubesphere的k8s環(huán)境部署單點(diǎn)版本的rook-ceph,實(shí)驗(yàn)性質(zhì)大于使用性質(zhì),不推薦在物理資源有限的情況下使用。 Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments. Rook是一個(gè)開源的云原生存儲(chǔ)編

    2024年02月07日
    瀏覽(28)
  • 基于kubesphere的k8s環(huán)境部署三節(jié)點(diǎn)的rook-ceph集群

    基于kubesphere的k8s環(huán)境部署三節(jié)點(diǎn)的rook-ceph集群

    這次實(shí)驗(yàn)記錄的是使用虛擬機(jī)搭建的使用了三個(gè)計(jì)算存儲(chǔ)節(jié)點(diǎn)的rook-ceph集群,模擬真實(shí)的使用場景。補(bǔ)充之前發(fā)的只有單點(diǎn)的部署方式。 Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments. Ro

    2024年02月11日
    瀏覽(29)
  • 【k8s完整實(shí)戰(zhàn)教程6】完整實(shí)踐-部署一個(gè)federated_download項(xiàng)目

    【k8s完整實(shí)戰(zhàn)教程6】完整實(shí)踐-部署一個(gè)federated_download項(xiàng)目

    系列文章:這個(gè)系列已完結(jié),如對(duì)您有幫助,求點(diǎn)贊收藏評(píng)論。 讀者寄語: 再小的帆,也能遠(yuǎn)航! 【k8s完整實(shí)戰(zhàn)教程0】前言 【k8s完整實(shí)戰(zhàn)教程1】源碼管理-Coding 【k8s完整實(shí)戰(zhàn)教程2】騰訊云搭建k8s托管集群 【k8s完整實(shí)戰(zhàn)教程3】k8s集群部署kubesphere 【k8s完整實(shí)戰(zhàn)教程4】使用

    2023年04月16日
    瀏覽(29)
  • 基于K8S部署ZooKeeper準(zhǔn)備知識(shí)(StatefulSet)

    使用k8s部署zk時(shí),會(huì)部署一個(gè)headless service.科普一下headless service: Headless Service(無頭服務(wù))是 Kubernetes 中的一種服務(wù)類型,它與普通的 ClusterIP 服務(wù)有所不同。普通的 ClusterIP 服務(wù)會(huì)為每個(gè)服務(wù)分配一個(gè)虛擬 IP 地址,并通過負(fù)載均衡將流量轉(zhuǎn)發(fā)到后端 Pod。而 Headless Service 不分

    2024年02月08日
    瀏覽(62)
  • K8S如何部署ZooKeeper以及如何進(jìn)行ZooKeeper的平滑替換

    K8S如何部署ZooKeeper以及如何進(jìn)行ZooKeeper的平滑替換

    在之前的章節(jié)中,我們已經(jīng)成功地將Dubbo項(xiàng)目遷移到了云環(huán)境。在這個(gè)過程中,我們選擇了單機(jī)ZooKeeper作為注冊中心。接下來,我們將探討如何將單機(jī)ZooKeeper部署到云端,以及在上云過程中可能遇到的問題及解決方案。 ZooKeeper是一個(gè)開源的分布式協(xié)調(diào)服務(wù),由Apache軟件基金會(huì)

    2024年02月11日
    瀏覽(18)
  • k8s部署kafka,并使用zookeeper做注冊中心

    kafka在3.x版本后增加KRaft作為自己的注冊中心,可以不依賴外部的zk;這里上一篇已經(jīng)部署好了zk,kafka依然使用zk作為注冊中心。 這里使用kafka是為集成zipkin收發(fā)微服務(wù)接口鏈路日志數(shù)據(jù),只需要部署1個(gè)實(shí)列即可夠用。 編寫腳本yaml vi kafka.yaml 執(zhí)行部署 kubectl apply -f kafka.yaml 查

    2024年02月07日
    瀏覽(17)
  • 使用kubekey3.1.0搭建k8s(kubernetes1.28.0)+kubesphere3.4.0教程

    使用kubekey3.1.0搭建k8s(kubernetes1.28.0)+kubesphere3.4.0教程

    基于kubernetes的Kubesphere環(huán)境搭建教 創(chuàng)建三個(gè)虛擬機(jī):一個(gè)master,其余為node 虛擬機(jī)配置: 建議:master(100G以上存儲(chǔ)空間,8G以上運(yùn)行內(nèi)存) node(50G以上存儲(chǔ)空間,4G以上運(yùn)行內(nèi)存) 示例: master:192.168.203.131 node1:192.168.203.129 node2:192.168.203.130 可以使用以上兩種工具進(jìn)行遠(yuǎn)程

    2024年01月20日
    瀏覽(21)
  • 【業(yè)務(wù)功能118】微服務(wù)-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及應(yīng)用

    【業(yè)務(wù)功能118】微服務(wù)-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及應(yīng)用

    網(wǎng)址: openelb.io OpenELB 是一個(gè)開源的云原生負(fù)載均衡器實(shí)現(xiàn),可以在基于裸金屬服務(wù)器、邊緣以及虛擬化的 Kubernetes 環(huán)境中使用 LoadBalancer 類型的 Service 對(duì)外暴露服務(wù)。OpenELB 項(xiàng)目最初由 KubeSphere 社區(qū)發(fā)起,目前已作為 CNCF 沙箱項(xiàng)目加入 CNCF 基金會(huì),由 OpenELB 開源社區(qū)維護(hù)與支

    2024年02月03日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包