1. 程式人生 > 其它 >k8s(docker-desktop)簡單搭建zookeeper三節點叢集

k8s(docker-desktop)簡單搭建zookeeper三節點叢集

  • 已經安裝了docker-desktop,並且其中的kubernetes啟動執行的。或者安裝了k8s環境就行
  • 可以正常下載dockerhub的映象,這裡採用了dockerhub官方製作的映象
  • 執行命令 kubectl apply -f zk1.yaml,執行前先把/data的3個宿主機路徑修改一下,把datadir的volumeMounts註釋放開。不修改也可以啟動叢集

zk1.yaml檔案如下

apiVersion: v1
kind: Service
metadata:
  name: zk1
  labels:
    zk: zk1
spec:
  selector:
    zk: zk1
  ports:
  - protocol: TCP
    port: 2181
    targetPort: 2181
    name: port-1
  - protocol: TCP
    port: 2888
    targetPort: 2888
    name: port-2
  - protocol: TCP
    port: 3888
    targetPort: 3888
    name: port-3
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  name: zk2
  labels:
    zk: zk2
spec:
  selector:
    zk: zk2
  ports:
  - protocol: TCP
    port: 2181
    targetPort: 2181
    name: port-1
  - protocol: TCP
    port: 2888
    targetPort: 2888
    name: port-2
  - protocol: TCP
    port: 3888
    targetPort: 3888
    name: port-3
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  name: zk3
  labels:
    zk: zk3
spec:
  selector:
    zk: zk3
  ports:
  - protocol: TCP
    port: 2181
    targetPort: 2181
    name: port-1
  - protocol: TCP
    port: 2888
    targetPort: 2888
    name: port-2
  - protocol: TCP
    port: 3888
    targetPort: 3888
    name: port-3
  type: NodePort
---
apiVersion: v1
kind: Pod
metadata:
  name: zk1
  namespace: default
  labels:
    zk: zk1
spec:
  containers:
  - image: zookeeper:3.6.3
    imagePullPolicy: IfNotPresent
    name: zk
    env:
    - name: ZOO_MY_ID
      value: "1"
    # 預設這個值,可以參考容器裡面的entry.sh的內容
    # 也可以去dockerhub的連結去檢視這個映象的dockerfile
    # - name: ZOO_DATA_DIR
    #   value: "/data"
    - name: ZOO_INIT_LIMIT
      value: "5000"
    - name: ZOO_SYNC_LIMIT
      value: "2000"
    - name: JVMFLAGS
      value: "-Dzookeeper.electionPortBindRetry=50" # 連線叢集重試50次,預設三次
    - name: ZOO_SERVERS
      value: "server.1=0.0.0.0:2888:3888;2181 server.2=zk2.default.svc.cluster.local:2888:3888;2181 server.3=zk3.default.svc.cluster.local:2888:3888;2181"
    ports:
    - containerPort: 2181
      protocol: TCP
      name: client
    - containerPort: 2888
      protocol: TCP
      name: server
    - containerPort: 3888
      protocol: TCP
      name: leader-election
    volumeMounts:
    # 這裡用環境變數,zoo.cfg這個檔案是不存在
    # - mountPath: /apache-zookeeper-3.6.3-bin/conf
    #  name: conf
    # 為什麼一定是data 不是/tmp/zookeeper ZOO_DATA_DIR指定的
    # 不配置資料持久的話,把這個配置註釋掉 最好配置,不然pod刪了資料就沒了
    #- mountPath: /data
    #  name: datadir
  volumes:
  #- name: conf
  #  hostPath:
  #    path: /XXXX/conf1XXXX
  - name: datadir
    hostPath:
    # 第一次啟動最好是個空資料夾 配置自己的資料的路徑,3個pod三個路徑
      path: /XXXX/tmp1/zookeeper
    #  type: Directory
---
apiVersion: v1
kind: Pod
metadata:
  name: zk2
  namespace: default
  labels:
    zk: zk2
spec:
  containers:
  - image: zookeeper:3.6.3
    imagePullPolicy: IfNotPresent
    name: zk
    env:
    - name: ZOO_MY_ID
      value: "2"
    - name: ZOO_INIT_LIMIT
      value: "5000"
    - name: ZOO_SYNC_LIMIT
      value: "2000"
    - name: JVMFLAGS
      value: "-Dzookeeper.electionPortBindRetry=50"
    - name: ZOO_SERVERS
      value: "server.1=zk1.default.svc.cluster.local:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zk3.default.svc.cluster.local:2888:3888;2181"
      # 如果不把本機的ip改成0.0.0.0,會報錯"server.1=zk1.default.svc.cluster.local:2888:3888;2181 server.2=zk2.default.svc.cluster.local:2888:3888;2181 server.3=zk3.default.svc.cluster.local:2888:3888;2181"
    ports:
    - containerPort: 2181
      protocol: TCP
      name: client
    - containerPort: 2888
      protocol: TCP
      name: server
    - containerPort: 3888
      protocol: TCP
      name: leader-election
    volumeMounts:
    # - mountPath: /apache-zookeeper-3.6.3-bin/conf
    #  name: conf
    #- mountPath: /data
     # name: datadir
  volumes:
  # - name: conf
  #  hostPath:
  #    path: /XXXX/conf2
  - name: datadir
    hostPath:
      path: /XXXX/tmp2/zookeeper
---
apiVersion: v1
kind: Pod
metadata:
  name: zk3
  namespace: default
  labels:
    zk: zk3
spec:
  containers:
  - image: zookeeper:3.6.3
    imagePullPolicy: IfNotPresent
    name: zk
    env:
    - name: ZOO_MY_ID
      value: "3"
    - name: ZOO_INIT_LIMIT
      value: "5000"
    - name: ZOO_SYNC_LIMIT
      value: "2000"
    - name: JVMFLAGS
      value: "-Dzookeeper.electionPortBindRetry=50"
    - name: ZOO_SERVERS
      value: "server.1=zk1.default.svc.cluster.local:2888:3888;2181 server.2=zk2.default.svc.cluster.local:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181"
    ports:
    - containerPort: 2181
      protocol: TCP
      name: client
    - containerPort: 2888
      protocol: TCP
      name: server
    - containerPort: 3888
      protocol: TCP
      name: leader-election
    volumeMounts:
    # - mountPath: /apache-zookeeper-3.6.3-bin/conf
    #  name: conf
    #- mountPath: /data
    #  name: datadir
  volumes:
  #- name: conf
  #  hostPath:
  #    path: /XXXX/conf3
  - name: datadir
    hostPath:
      path: /XXXX/tmp3/zookeeper
  • 連線pod分別檢視狀態kubectl exec -it zk1 -- sh kubectl exec -it zk2 -- sh kubectl exec -it zk3 -- sh
# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower