Implementación de Zookeeper en Kubernetes: Despliegue en clúster y modo independiente

Paso 1: Configurar el repositorio de charts

Primero necesitamos agregar el repositorio de incubadora de Helm para acceder al chart de Zookeeper.

helm repo add incubator https://storage.googleapis.com/kubernetes-charts-incubator

Paso 2: Descargar el chart de Zookeeper

helm fetch incubator/zookeeper

Paso 3: Configurar el almacenamiento persistente

Modificamos el archivo values.yaml para habilitar la persistencia de datos:

persistence:
  enabled: true
  storageClass: "nfs-client"
  accessMode: ReadWriteOnce
  size: 5Gi

Notas importanets:

1. Verificar clases de almacenamiento existentes

Si ya tienes StorageClass configurado, puedes reutilizarlo. Primero verifica las clases disponibles:

kubectl get storageclasses -n <espacio-de-nombres>

Salida ejemplo:

NAME                 PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client           cluster.local/nfs-provisioner   Delete          Immediate           true                   15d

2. Configurar provisionador NFS (si es necesario)

Para versiones de Kubernetes 1.19 y superiores:

helm install nfs-provisioner stable/nfs-client-provisioner \
  --set nfs.server=192.168.1.100 \
  --set nfs.path=/exports/zookeeper

Para versiones anteriores a 1.19:

Utilizamos manifiestos YAML para crear el provisionador. Primero la cuenta de servicio:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner-sa

Luego los permisos RBAC necesarios:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-role
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["list", "watch", "create", "update", "patch"]

El binding correspondiente:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-binding
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner-sa
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-role
  apiGroup: rbac.authorization.k8s.io

La StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage-class
provisioner: nfs-subdir-external-provisioner

Finalmente, el deployment del provisionador:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner-deployment
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-provisioner
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: nfs-provisioner-sa
      containers:
        - name: nfs-provisioner
          image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-storage
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: "192.168.1.100"
            - name: NFS_PATH
              value: "/exports/zookeeper"
      volumes:
        - name: nfs-storage
          nfs:
            server: 192.168.1.100
            path: /exports/zookeeper

Instalación de Zookeeper en modo independiente

Para un despliegue standalone, aplicamos el siguiente manifiesto. Asegúrate de ajustar las rutas NFS según tu entorno.

kubectl apply -f zookeeper-standalone.yaml -n <espacio-de-nombres>

El manifiesto completo incluye Service, PVs, PVCs y Deployment:

apiVersion: v1
kind: Service
metadata:
  name: zk-svc
  labels:
    app: zookeeper
spec:
  type: NodePort
  ports:
    - name: client
      port: 2181
      targetPort: 2181
      nodePort: 30100
    - name: follower
      port: 2888
      targetPort: 2888
    - name: election
      port: 3888
      targetPort: 3888
  selector:
    app: zookeeper
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zk-data-pv
  labels:
    type: zk-data
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /exports/zookeeper/data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zk-data-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      type: zk-data
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zk-datalog-pv
  labels:
    type: zk-datalog
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /exports/zookeeper/datalog
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zk-datalog-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      type: zk-datalog
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zk-logs-pv
  labels:
    type: zk-logs
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /exports/zookeeper/logs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zk-logs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      type: zk-logs
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zookeeper-deploy
  labels:
    app: zookeeper
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zookeeper
  template:
    metadata:
      labels:
        app: zookeeper
    spec:
      containers:
        - name: zookeeper
          image: zookeeper:3.4.13
          imagePullPolicy: Always
          ports:
            - containerPort: 2181
            - containerPort: 2888
            - containerPort: 3888
          volumeMounts:
            - name: zk-data-vol
              mountPath: /data
            - name: zk-datalog-vol
              mountPath: /datalog
            - name: zk-logs-vol
              mountPath: /logs
      volumes:
        - name: zk-data-vol
          persistentVolumeClaim:
            claimName: zk-data-pvc
        - name: zk-datalog-vol
          persistentVolumeClaim:
            claimName: zk-datalog-pvc
        - name: zk-logs-vol
          persistentVolumeClaim:
            claimName: zk-logs-pvc

Despliegue de Nimbus (Storm)

Configuración mediante ConfigMap

kubectl apply -f storm-config.yaml -n <espacio-de-nombres>
apiVersion: v1
kind: ConfigMap
metadata:
  name: storm-config
data:
  storm.yaml: |
    storm.zookeeper.servers:
      - zk-svc
    nimbus.seeds:
      - nimbus-svc
    storm.log.dir: "/var/log/storm"
    storm.local.dir: "/opt/storm/data"

Despliegue de Nimbus

kubectl apply -f nimbus-deploy.yaml -n <espacio-de-nombres>
apiVersion: v1
kind: Service
metadata:
  name: nimbus-svc
  labels:
    app: nimbus
spec:
  ports:
    - name: nimbus-rpc
      port: 6627
      targetPort: 6627
  selector:
    app: storm-nimbus
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nimbus-data-pv
  labels:
    storage-for: nimbus-data
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /exports/storm/nimbus
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nimbus-data-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      storage-for: nimbus-data
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nimbus-logs-pv
  labels:
    storage-for: nimbus-logs
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /exports/storm/logs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nimbus-logs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      storage-for: nimbus-logs
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nimbus-deploy
  labels:
    app: storm-nimbus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: storm-nimbus
  template:
    metadata:
      labels:
        app: storm-nimbus
    spec:
      hostname: nimbus
      containers:
        - name: nimbus
          image: storm:1.2.2
          imagePullPolicy: Always
          command: ["storm", "nimbus"]
          ports:
            - containerPort: 6627
          volumeMounts:
            - name: config-vol
              mountPath: /conf/
            - name: nimbus-data-vol
              mountPath: /opt/storm/data
            - name: nimbus-logs-vol
              mountPath: /var/log/storm
      volumes:
        - name: config-vol
          configMap:
            name: storm-config
        - name: nimbus-data-vol
          persistentVolumeClaim:
            claimName: nimbus-data-pvc
        - name: nimbus-logs-vol
          persistentVolumeClaim:
            claimName: nimbus-logs-pvc

Interfaz de usuario para Storm (Storm UI)

kubectl create deployment storm-ui --image=adejonge/storm-ui -n <espacio-de-nombres>
kubectl expose deployment storm-ui --port=8080 --type=NodePort -n <espacio-de-nombres>

Interfaz web para Zookeeper

kubectl apply -f zk-ui.yaml -n <espacio-de-nombres>
apiVersion: v1
kind: Service
metadata:
  name: zk-ui-svc
  labels:
    app: zk-ui
spec:
  type: NodePort
  ports:
    - name: http
      port: 9090
      targetPort: 9090
      nodePort: 30020
  selector:
    app: zk-ui
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zk-ui-deploy
  labels:
    app: zk-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zk-ui
  template:
    metadata:
      labels:
        app: zk-ui
    spec:
      containers:
        - name: zkui
          image: maauso/zkui
          imagePullPolicy: Always
          env:
            - name: ZKLIST
              value: "zk-svc:2181"
          ports:
            - containerPort: 9090

Etiquetas: Kubernetes Zookeeper Helm nfs storageclass

Publicado el 7-15 09:54