写在最前

1. docker 部署

3. kubernetes 部署

3.1 statefulset

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: zookeeper
  namespace: bx
  annotations:
    kubesphere.io/creator: admin
spec:
  replicas: 3
  selector:
    matchLabels:
      app: zookeeper
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: zookeeper
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{}'
        kubesphere.io/restartedAt: '2025-06-17T09:14:31.678Z'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: zoo-config
          configMap:
            name: zookeeper-config
            defaultMode: 420
      containers:
        - name: zookeeper
          image: 'zookeeper:3.9.3'
          command:
            - sh
            - '-c'
            - |
              echo "$(( ${HOSTNAME##*-} + 1 ))" > /data/myid && \
              zkServer.sh start-foreground
          ports:
            - name: client
              containerPort: 2181
              protocol: TCP
            - name: peer
              containerPort: 2888
              protocol: TCP
            - name: leader-election
              containerPort: 3888
              protocol: TCP
          resources: {}
          volumeMounts:
            - name: data
              mountPath: /data
            - name: zoo-config
              mountPath: /conf/zoo.cfg
              subPath: zoo.cfg
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  volumeClaimTemplates:
    - kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: data
        creationTimestamp: null
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 2Gi
        volumeMode: Filesystem
      status:
        phase: Pending
  serviceName: zookeeper
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: RollingUpdate
  revisionHistoryLimit: 10

3.2 service

kind: Service
apiVersion: v1
metadata:
  name: zookeeper
  namespace: bx
  labels:
    app: zookeeper
  annotations:
    kubesphere.io/creator: admin
spec:
  ports:
    - name: client
      protocol: TCP
      port: 2181
      targetPort: 2181
    - name: peer
      protocol: TCP
      port: 2888
      targetPort: 2888
    - name: leader-election
      protocol: TCP
      port: 3888
      targetPort: 3888
  selector:
    app: zookeeper
  clusterIP: None
  clusterIPs:
    - None
  type: ClusterIP
  sessionAffinity: None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster

3.3 configmap

kind: ConfigMap
apiVersion: v1
metadata:
  name: zookeeper-config
  namespace: bx
data:
  zoo.cfg: |
    clientPort=2181
    dataDir=/data
    dataLogDir=/datalog
    tickTime=2000
    initLimit=5
    syncLimit=2
    autopurge.snapRetainCount=3
    autopurge.purgeInterval=0
    maxClientCnxns=60
    standaloneEnabled=true
    admin.enableServer=true

    server.1=zookeeper-0.zookeeper.bx.svc.cluster.local:2888:3888
    server.2=zookeeper-1.zookeeper.bx.svc.cluster.local:2888:3888
    server.3=zookeeper-2.zookeeper.bx.svc.cluster.local:2888:3888

3.4 常用命令

# ./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: leader

# 如果你已经成功启动kafka集群,可以使用以下命令来查看是否有数据
[zk: localhost:2181(CONNECTED) 1] ls /
[admin, brokers, cluster, config, consumers, controller, controller_epoch, feature, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]
[zk: localhost:2181(CONNECTED) 0] ls /brokers/ids
[1, 2, 3]