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