zookeeper 설정

2025. 2. 28. 14:25k8s/Kafka

ConfigMap

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: zookeeper-config
  namespace: kafka
data:
  ZOOKEEPER_CLIENT_PORT: "2181"
  ZOOKEEPER_TICK_TIME: "2000"
  ZOOKEEPER_INIT_LIMIT: "5"
  ZOOKEEPER_SYNC_LIMIT: "2"
  ZOOKEEPER_SERVERS: |
  	# ZOOKEEPER_SERVER_ID는 1부터 시작함
	# pod의 hostname은 0부터 시작함
    server.1=zookeeper-0.zookeeper-headless:2888:3888
    server.2=zookeeper-1.zookeeper-headless:2888:3888
    server.3=zookeeper-2.zookeeper-headless:2888:3888

StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zookeeper
  namespace: kafka
spec:
  serviceName: zookeeper-headless
  replicas: 3
  selector:
    matchLabels:
      app: zookeeper
  template:
    metadata:
      labels:
        app: zookeeper
    spec:
      terminationGracePeriodSeconds: 30
      containers:
        - name: zookeeper
          image: confluentinc/cp-zookeeper:{tag}
          ports:
            - containerPort: 2181
              name: client
            - containerPort: 2888
              name: peer
            - containerPort: 3888
              name: leader-election
          envFrom:
            - configMapRef:
                name: zookeeper-config
          command:
            - "/bin/bash"
            - "-c"
            - |
              export ZOOKEEPER_SERVER_ID=$((${HOSTNAME##*-} + 1))
              echo "Starting Zookeeper with Server ID: $ZOOKEEPER_SERVER_ID"
              echo $ZOOKEEPER_SERVER_ID > /var/lib/zookeeper/myid
              exec /etc/confluent/docker/run
          volumeMounts:
            - name: data
              mountPath: /var/lib/zookeeper
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: zookeeper-storage
        resources:
          requests:
            storage: 5Gi

StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: zookeeper-storage
provisioner: nfs.csi.k8s.io  # Use the correct NFS CSI driver
reclaimPolicy: Retain
volumeBindingMode: Immediate

PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: zookeeper-pv-0
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: zookeeper-storage  # Changed from nfs-storage to zookeeper-storage
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    namespace: kafka
    name: data-zookeeper-0  # Ensures only this PVC binds to this PV
  nfs:
    path: /mnt/nfs/zookeeper-0
    server: <NFS_SERVER_IP>
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zookeeper-pv-1
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: zookeeper-storage
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    namespace: kafka
    name: data-zookeeper-1
  nfs:
    path: /mnt/nfs/zookeeper-1
    server: <NFS_SERVER_IP>
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zookeeper-pv-2
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: zookeeper-storage
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    namespace: kafka
    name: data-zookeeper-2
  nfs:
    path: /mnt/nfs/zookeeper-2
    server: <NFS_SERVER_IP>

Service

apiVersion: v1
kind: Service
metadata:
  name: zookeeper-headless
  namespace: kafka
  labels:
    app: zookeeper
spec:
  ports:
    - port: 2181
      name: client
    - port: 2888
      name: peer
    - port: 3888
      name: leader-election
  selector:
    app: zookeeper
  clusterIP: None  # Headless service for StatefulSet