prefacio
puntos de conocimiento
- Clasificación: nivel de entrada
- Cómo usar AI Assistant para ayudar en el trabajo de operación y mantenimiento
- Instalación e implementación de Zookeeper de un solo nodo
- Instalación e implementación de Zookeeper en modo clúster
- Pensamientos de selección de aplicaciones de código abierto
Configuración real del servidor (la arquitectura 1:1 reproduce el entorno de producción a pequeña escala, la configuración es ligeramente diferente)
nombre de la CPU | IP | UPC | Memoria | disco del sistema | disco de datos | usar |
---|---|---|---|---|---|---|
ks-maestro-0 | 192.168.9.91 | 4 | 8 | 50 | 100 | KubeSphere/k8s-maestro |
ks-maestro-1 | 192.168.9.92 | 4 | 8 | 50 | 100 | KubeSphere/k8s-maestro |
ks-maestro-2 | 192.168.9.93 | 4 | 8 | 50 | 100 | KubeSphere/k8s-maestro |
ks-trabajador-0 | 192.168.9.95 | 4 | dieciséis | 50 | 100 | k8s-trabajador/CI |
ks-trabajador-1 | 192.168.9.96 | 4 | dieciséis | 50 | 100 | k8s-trabajador |
ks-trabajador-2 | 192.168.9.97 | 4 | dieciséis | 50 | 100 | k8s-trabajador |
almacenamiento-0 | 192.168.9.81 | 2 | 4 | 50 | 100+ | ElasticSearch/GlusterFS/Ceph/Longhorn/NFS/ |
almacenamiento-1 | 192.168.9.82 | 2 | 4 | 50 | 100+ | ElasticSearch/GlusterFS/Ceph/Longhorn |
almacenamiento-2 | 192.168.9.83 | 2 | 4 | 50 | 100+ | ElasticSearch/GlusterFS/Ceph/Longhorn |
registro | 192.168.9.80 | 2 | 4 | 50 | 200 | Sonatype Nexus 3 |
total | 10 | 32 | 88 | 500 | 1100+ |
El entorno de combate real implica información sobre la versión del software.
- Sistema operativo: openEuler 22.03 LTS SP2 x86_64
- KubeSphere: 3.3.2
- Kubernetes: v1.24.12
- Contenedor: 1.6.4
- GlusterFS: 10.0-8
- KubeKey: v3.0.8
- Guardián del zoológico: 3.8.2
Introducción
Hoy, nuestro contenido de combate real adopta la forma de simulación de escena para simular una escena que inevitablemente se encontrará en el trabajo real de operación y mantenimiento .
Como un novato en operaciones y mantenimiento que acaba de ingresar al lugar de trabajo y es nuevo en operaciones y mantenimiento nativos de la nube, Boss me arregló una tarea difícil hoy. Sí, lo leyó correctamente, es difícil .
Dificultad alta = 2 M 1 D = oído, nunca visto, nunca hecho, poco tiempo .
Los requisitos de la tarea presentados por Boss están organizados de la siguiente manera (los entiendo, adivino, busco y los organizo en base a las palabras originales de Boss, de hecho, Boos no dijo unas pocas palabras en absoluto):
- Implemente un Zookeeper de un solo nodo en el clúster K8s
- Implementar el modo de clúster Zookeeper en el clúster K8s
- Escenarios de uso: investigación y desarrollo, pruebas (es probable que se transfiera directamente a producción en una etapa posterior)
- Plazo de entrega de la tarea: mañana (el líder piensa que es muy simple)
- Requisitos básicos: siempre que se pueda usar (comprenda usted mismo)
Ya que no puedes negarte, y el tiempo es escaso y la tarea es pesada, ¡hagámoslo, vamos! ! !
2. Análisis de ideas de realización de tareas
Si un trabajador quiere hacer un buen trabajo, primero debe afilar sus herramientas. Dado que es una tarea a nivel de 2 M 1 D , primero saque las dos primeras tablas de las tres tablas de operación y mantenimiento en la era de la IA para ver si puede resolver el problema.
Como se hizo con solo dos ejes, el tercero no se usó.
El primer truco: asistente de IA
Palabras rápidas: "Quiero implementar zookeerper en K8. Dame un plan de implementación de un solo nodo y un modo de clúster, respectivamente. Tenga en cuenta que debe usar la clase de almacenamiento glusterfs, debe tener SVC y debe tener el ConfigMap de zoológico.cfg"
Nota importante: no soy bueno aprendiendo, no estoy familiarizado con los asistentes de IA y las palabras del mensaje no están bien escritas, por lo que el efecto final no es muy bueno.
Después de ingresar las palabras de solicitud anteriores, AI Assistant-3.5 bla, bla, bla me devolvió un montón de mensajes de texto, y solo tomé la esencia para mostrarla.
- Perfil de implementación de un solo nodo (
zookeeper-single.yaml
)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
selector:
app: zookeeper
ports:
- protocol: TCP
port: 2181
targetPort: 2181
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zookeeper-config
data:
zoo.cfg: |
tickTime=2000
dataDir=/data
clientPort=2181
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zookeeper
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.7.0
resources:
requests:
cpu: 100m
memory: 1Gi
ports:
- containerPort: 2181
volumeMounts:
- name: zookeeper-data
mountPath: /data
env:
- name: ZOOKEEPER_CONFIG_FILE
value: /opt/zookeeper-3.7.0/conf/zoo.cfg
- name: ZOO_SERVERS
value: "server.1=zookeeper-0.zookeeper.default.svc.cluster.local:2888:3888;2181"
volumes:
- name: zookeeper-data
persistentVolumeClaim:
claimName: zookeeper-data
- name: zookeeper-config
configMap:
name: zookeeper-config
- Archivo de configuración de implementación del modo de clúster (
zookeeper-cluster.yaml
):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
selector:
app: zookeeper
ports:
- protocol: TCP
port: 2181
targetPort: 2181
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zookeeper-config
data:
zoo.cfg: |
tickTime=2000
dataDir=/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper-0.zookeeper.default.svc.cluster.local:2888:3888
server.2=zookeeper-1.zookeeper.default.svc.cluster.local:2888:3888
server.3=zookeeper-2.zookeeper.default.svc.cluster.local:2888:3888
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
spec:
serviceName: zookeeper
replicas: 3
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.7.0
resources:
requests:
cpu: 100m
memory: 1Gi
ports:
- containerPort: 2181
volumeMounts:
- name: zookeeper-data
mountPath: /data
env:
- name: ZOOKEEPER_CONFIG_FILE
value: /opt/zookeeper-3.7.0/conf/zoo.cfg
volumes:
- name: zookeeper-data
persistentVolumeClaim:
claimName: zookeeper-data
- name: zookeeper-config
configMap:
name: zookeeper-config
Después de analizar el contenido, descubrí que parece que entiendo un poco, pero no lo entiendo completamente. Los archivos de configuración de nodo único y modo de clúster en los resultados devueltos se ven similares. Analicemos los resultados y, por cierto. , Piénsalo:
- El tipo de clase es diferente: el nodo único es Deployment y el modo de clúster es StatefulSet Esto parece estar bien en este momento y la idea es correcta.
- El número de copias de Deployment es 1 y el número de copias de StatefulSet es 3
- El modo de clúster no utiliza volumeClaimTemplates
- Hay varios elementos de configuración del servidor más en el archivo de configuración del modo de clúster zoo.cfg, pero parece que el procesamiento de myid no se ha implementado
Es necesario tener una cierta acumulación de conocimientos relacionados con K8s y Zookeeper para analizar si los resultados que da el asistente de IA cumplen con los requisitos, de lo contrario no pueden entender nada.
El segundo truco - motor de búsqueda
El motor de búsqueda ocupó el primer lugar en la asistencia de operación y mantenimiento antes de que saliera el asistente de IA , y ahora ocupa temporalmente el segundo lugar, y se estima que no hay posibilidad de volver a la cima (Represento mi ranking personal opinión).
Después de leer los resultados de salida del asistente de IA , siento que la estructura general y el contenido están bien, pero siento que los detalles no son tan interesantes, especialmente la implementación del modo de clúster. Lo comprobaremos en el tercer inciso de este trabajo.
Al mismo tiempo, también descubrí image: zookeeper:3.7.0
que dado que la imagen a la que se hace referencia es la oficial de DockerHub, debe haber una imagen correspondiente y el método de uso de la implementación en contenedores en DockerHub.
Esto también trae una nueva inspiración y un nuevo método de aprendizaje. También es la forma más simple y directa de convertir la implementación de Docker en implementación de Kubernetes. Vaya directamente al comando de implementación de Docker, comando de inicio y parámetros relacionados, y luego muévase directamente a It funciona en K8.
Entramos directamente a la web oficial de DokcerHub , y buscamos directamente con la palabra clave zookeeper .
Captura de pantalla de los resultados de la búsqueda:
Simplemente piense y analice los resultados de la búsqueda:
Las dos imágenes de cuidadores de zoológico mejor clasificadas, con un volumen de descarga de más de 100 millones , son producidas respectivamente por Docker oficial y Bitnami .
Zookeeper de Bitnami tuvo la mayor cantidad de descargas la semana pasada, con 1 140 215 descargas, más del doble de las 681 115 descargas de zookeeper de DockerHub.
Sugerencias: Bitnami , comencé a usar Bitnami hace más de diez años. El paquete de instalación de implementación con un clic que produjeron era un muy buen proveedor de servicios de solución de middleware de implementación con un clic en ese momento. Ahora debería ser más completo y mejor.
¿Por qué hacer el análisis anterior?
- Cuando elegimos una tecnología de código abierto, uno de los principales determinantes es la cantidad de usuarios , muy pocos usuarios indican que el producto está inmaduro, lo que significa que si algo sale mal, no tienes dónde buscar ayuda.
- Hay varios principios para mi selección de tecnología: oficial preferido (Apache oficial no está disponible, solo DockerHub oficial), gran cantidad de usuarios (más de 100 millones), mantenimiento y actualizaciones frecuentes (hace 7 días).
- Además de la imagen del cuidador del zoológico producida por DockerHub , la imagen producida por Bitnami también es una buena opción. Los ojos de las masas son exigentes. Si no es fácil de usar, es imposible que tanta gente la recomiende y la descargue.
- El ejemplo dado por AI Assistant usa la imagen oficial de DockerHub.
Tanto se ha dicho arriba, parece que no se ha mencionado el motor de búsqueda clave del segundo hacha.Entre los resultados que da el asistente de IA , el modo de nodo único parece no ser problema, pero el clúster mode siempre siente que falta algo. El punto clave es myid Por lo tanto, utilicé la palabra clave StatefulSet para implementar Zookeeper y busqué en el motor de búsqueda.
Hay dos direcciones en los resultados de búsqueda que tienen más valor de referencia:
- Basado en el esquema de implementación de Zookeeper proporcionado en los documentos oficiales de K8.
Un caso de tutorial Ejecución de ZooKeeper, un coordinador de sistemas distribuidos en el sitio web oficial de K8 . Este ejemplo parece complicado e introduce varias tecnologías nuevas.
- Esquema de implementación del clúster Zookeeper basado en la imagen realizada por Bitnami
Para ordenar la información que se ha obtenido, con el fin de completar rápidamente las tareas entregadas por los líderes, el orden del plan de prueba de verificación de hoy es el siguiente:
- Configuración de implementación de un solo nodo proporcionada por AI Assistant
- Configuración de implementación del modo de clúster proporcionada por AI Assistant
- Solución de implementación en modo clúster proporcionada por Bitnami
- Sitio web oficial de K8 Caso de implementación de Zookeeper
Porque la implementación de un solo nodo es relativamente simple. Por lo tanto, el punto clave de la prueba es si la configuración de implementación del modo de clúster proporcionada por el asistente de IA y Bitnami es factible. Si la solución es factible, no habrá un caso de sitio web oficial. De lo contrario, intente con el sitio web oficial de K8s. caso de despliegue de Zookeeper , pero para ser honesto, no quiero tocar por el momento, porque hay un punto técnico en este caso del que nunca he oído hablar, y si realmente intento hacerlo, es introducirá nuevos problemas.
Implementación de nodo único de Zookeeper
Creo que el plan de implementación de un solo nodo y los archivos de configuración devueltos por el asistente de IA se ven bien. Sin embargo, no copie y pegue directamente, solo utilícelo fuera de la caja. Asegúrese de consultar los ejemplos relacionados con Zookeeper en el sitio web oficial de DockerHub La combinación de los dos producirá una lista de recursos más confiable.
Pensamiento
La lista de recursos requeridos por un Zookeeper de un solo nodo en la parte superior del clúster K8s es la siguiente:
PersistentVolumeClaimPersistentVolumeClaim
Mapa de configuración:zoo.cfg
Despliegue
Servicio de clúster
Servicio Externo (opcional)
Después de conocer los objetivos de la tarea que deben completarse, se genera un conjunto de listas de configuración de recursos en función de la configuración proporcionada por el asistente de IA y los parámetros de configuración oficiales.
Nota: La práctica ha demostrado que el asistente de IA solo da una idea aproximada, y todavía hay muchas deficiencias en los detalles.Todas las listas de configuración de recursos en los siguientes ejemplos se compilan con referencia a los parámetros de configuración oficiales y los requisitos de uso reales.
Cuéntame brevemente qué ha cambiado.
- Selección de la versión de Zookeeper, usando una versión 3.8.2 detrás de la última versión estable oficial 3.9.0 para reemplazar 3.7.0 en el esquema de configuración proporcionado por el asistente de IA
- Configuración de registro de datos agregada
- Configuración de límite de recursos mejorada
- Mejorar la configuración de zoo.cfg
Lista de configuración de recursos
A menos que se especifique lo contrario, todas las operaciones relacionadas con K8 se realizan en el nodo Master-0 y el directorio raíz del archivo de configuración es /srv/opsman/k8s-yaml .
- Crear carpeta de inventario
cd /srv/opsman/k8s-yaml
mkdir -p zookeeper/single
cd zookeeper/single
- vi zookeeper-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-datalog
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 2Gi
Descripción: GlusterFS utilizado por la clase de almacenamiento de back-end .
- vi zookeeper-cm.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: zookeeper-config
data:
zoo-cfg: |
tickTime=2000
dataDir=/data
dataLogDir=/datalog
clientPort=2181
initLimit=10
syncLimit=5
- vi zookeeper-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zookeeper
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.8.2
resources:
requests:
cpu: 50m
memory: 500Mi
limits:
cpu: '2'
memory: 4000Mi
ports:
- name: zookeeper-2181
containerPort: 2181
protocol: TCP
volumeMounts:
- name: config
mountPath: /conf
- name: data
mountPath: /data
- name: datalog
mountPath: /datalog
volumes:
- name: data
persistentVolumeClaim:
claimName: zookeeper-data
- name: datalog
persistentVolumeClaim:
claimName: zookeeper-datalog
- name: config
configMap:
name: zookeeper-config
items:
- key: zoo-cfg
path: zoo.cfg
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
ports:
- name: zookeeper-2181
protocol: TCP
port: 2181
targetPort: 2181
selector:
app: zookeeper
type: ClusterIP
La implementación y el servicio de clúster se colocan en un archivo de configuración.
- vi zookeeper-external-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper-external-svc
labels:
app: zookeeper-external-svc
spec:
ports:
- name: tcp-zookeeper-external
protocol: TCP
port: 2181
targetPort: 2181
nodePort: 32181
selector:
app: zookeeper
type: NodePort
Nota: Elementos de configuración opcionales , si no es necesario que los servicios externos al clúster de K8s accedan a ellos, no se requiere configuración.
desplegar recursos
- Implementar PersistentVolumeClaim
kubectl apply -f zookeeper-pvc.yaml
- Implementar ConfigMaps
kubectl apply -f zookeeper-cm.yaml
- Despliegue
kubectl apply -f zookeeper-deploy.yaml
- Implementar servicios externos
kubectl apply -f zookeeper-svc.yaml
Verificación de recursos de implementación de K8s
- Verificar PersistentVolumeClaim
[root@ks-master-0 single]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
zookeeper-data Bound pvc-371c9406-1757-451a-9c89-bed47ac71dd4 1Gi RWO glusterfs 12s Filesystem
zookeeper-datalog Bound pvc-457a134c-0db2-4efc-902c-555daba2057e 2Gi RWO glusterfs 11s Filesystem
- Verificar implementación
[root@ks-master-0 single]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
zookeeper 1/1 1 1 5m1s zookeeper zookeeper:3.8.2 app=zookeeper
- Verificar pods
[root@ks-master-0 single]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
zookeeper-bcfc6cc5c-bh56m 1/1 Running 0 54s 10.233.120.8 ks-worker-1 <none> <none>
- Verificar servicio
[root@ks-master-0 single]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
zookeeper ClusterIP 10.233.58.30 <none> 2181/TCP 59s app=zookeeper
zookeeper-external-svc NodePort 10.233.40.37 <none> 2181:32181/TCP 59s app=zookeeper
Verificación de disponibilidad del servicio Zookeeper
Valide dentro del clúster K8s .
- Cree un pod de cliente Zookeeper en K8s para verificación
kubectl run zookeeper-client --image=zookeeper:3.8.2
- Verificar la conectividad del servidor Zookeeper
# 进入 Zookeeper Client 容器内部
kubectl exec -it zookeeper-client -- bash
# 连接 Zookeeper Server
bin/zkCli.sh -server 10.233.58.30:2181
# 成功结果如下
[root@ks-master-0 single]# kubectl exec -it zookeeper-client -- bash
root@zookeeper-client:/apache-zookeeper-3.8.2-bin# bin/zkCli.sh -server 10.233.58.30:2181
Connecting to 10.233.58.30:2181
2023-08-07 07:44:16,110 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:host.name=zookeeper-client
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.version=11.0.20
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.vendor=Eclipse Adoptium
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.home=/opt/java/openjdk
2023-08-07 07:44:16,117 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.class.path=/apache-zookeeper-3.8.2-bin/bin/......(此处有省略)
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.library.path=/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.io.tmpdir=/tmp
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:java.compiler=<NA>
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.name=Linux
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.arch=amd64
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.version=5.10.0-153.12.0.92.oe2203sp2.x86_64
2023-08-07 07:44:16,118 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:user.name=root
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:user.home=/root
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:user.dir=/apache-zookeeper-3.8.2-bin
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.memory.free=42MB
2023-08-07 07:44:16,119 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.memory.max=256MB
2023-08-07 07:44:16,120 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:os.memory.total=48MB
2023-08-07 07:44:16,123 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=10.233.58.30:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@18bf3d14
2023-08-07 07:44:16,128 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2023-08-07 07:44:16,134 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2023-08-07 07:44:16,143 [myid:] - INFO [main:o.a.z.ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
Welcome to ZooKeeper!
2023-08-07 07:44:16,171 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server zookeeper.default.svc.cluster.local/10.233.58.30:2181.
2023-08-07 07:44:16,173 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
2023-08-07 07:44:16,185 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /10.233.118.8:55022, server: zookeeper.default.svc.cluster.local/10.233.58.30:2181
JLine support is enabled
2023-08-07 07:44:16,251 [myid:10.233.58.30:2181] - INFO [main-SendThread(10.233.58.30:2181):o.a.z.ClientCnxn$SendThread@1452] - Session establishment complete on server zookeeper.default.svc.cluster.local/10.233.58.30:2181, session id = 0x1000178f5af0000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 10.233.58.30:2181(CONNECTED) 0]
- Cree datos de prueba para verificar la disponibilidad del servicio
# 创建测试数据
[zk: 10.233.58.30:2181(CONNECTED) 0] create /test test-data1
Created /test
# 读取测试数据
[zk: 10.233.58.30:2181(CONNECTED) 1] get /test
test-data1
Valide fuera del clúster K8s.
Este artículo usa directamente el nodo K8s Master-0 para instalar el cliente Zookeeper para la verificación de prueba.
- La instalación de openjdk se limita a la verificación de prueba.
yum install java-11-openjdk
- Instale el cliente de Zookeeper y vaya al sitio web oficial de Zookeeper para encontrar la versión correspondiente del paquete de software. Este artículo selecciona 3.8.2 como la versión de prueba.
# 下载并解压 Zookeeper(在国内源下载)
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz
tar xvf apache-zookeeper-3.8.2-bin.tar.gz
- Verificar la conectividad del servidor Zookeeper
cd apache-zookeeper-3.8.2-bin/bin/
./zkCli.sh -server 192.168.9.91:32181
# 成功结果如下(结果有省略)
[root@ks-master-0 bin]# ./zkCli.sh -server 192.168.9.91:32181
/usr/bin/java
Connecting to 192.168.9.91:32181
2023-08-07 15:46:53,156 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
......
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.9.91:32181(CONNECTED) 0]
- Cree datos de prueba para verificar la disponibilidad del servicio
# 创建测试数据
[zk: 192.168.9.91:32181(CONNECTED) 0] create /test2 test2-data1
Created /test2
# 读取测试数据
[zk: 192.168.9.91:32181(CONNECTED) 1] get /test2
test2-data1
Hasta el momento, se han completado la mitad de las tareas asignadas por Boss, se ha realizado el despliegue de Zookeeper mononodo y se han realizado las pruebas de conectividad y disponibilidad dentro y fuera del clúster K8s.
Sin embargo, el tiempo ha expirado y ha llegado al segundo día, por lo que, para una tarea desconocida, no es tan simple como imaginaba Boss.
Sin embargo, debido a la finalización de la tarea de un solo nodo, primero envíe el informe al jefe y explique las ideas de implementación, el proceso, los problemas y las soluciones encontradas durante el proceso de implementación (recuerde no decirle directamente al jefe que esto es difícil, usted estimar Si hay un problema con el tiempo, entonces es puramente una búsqueda).
Después de informar de acuerdo con la rutina anterior, obtuve la comprensión y la aprobación del Jefe (el Jefe es realmente muy bueno para hablar, siempre que pueda convencerlo con razón), permítame entregarle el entorno de Zookeeper de un solo nodo a la prueba, y luego continuar estudiando el esquema de implementación del modo de clúster.
Esta ola de operaciones no solo no recibió críticas, sino que también me ganó tiempo, ¡perfecto! ! !
Implementación de Zookeeper en modo clúster
Después de completar la tarea de implementar Zookeeper en un solo nodo, el siguiente paso es estudiar la implementación de Zookeeper en modo clúster. El ejemplo predeterminado dado por el asistente de IA no es confiable en absoluto, y soy demasiado perezoso. para entrenarlo.
¿Por qué dices eso?
Porque usé la solución proporcionada por el asistente de IA y usé Zookeeper proporcionado por DockerHub para intentar implementar el clúster de Zookeeper en el clúster de K8. Me tomó 2 días (principalmente porque estaba enfermo y quería obtener lo hizo, ¡pero no fui lo suficientemente capaz!)
A continuación, permítanme hablar brevemente sobre los intentos que hice, los problemas que encontré y las experiencias que tuve durante los dos días de ser torturado y loco (lo que casi me obligó a recurrir a un tercer hacha).
- La clave del modo clúster es resolver la configuración de myid y servidores
- No hay problema con la configuración de los servidores, que pueden escribirse directamente en el archivo de configuración o inyectarse mediante ENV
- myid es el punto clave Para la imagen de Zookeeper proporcionada en el almacén espejo de DockHub, el nodo myid no se puede configurar dinámicamente
- En el experimento, probé initContainers , SidecarContainer , ConfigMap montando scripts de inicio, etc., pero ninguno de ellos funcionó.
- No es que la imagen de DockHub no se pueda usar en absoluto, es solo que la secuencia de comandos de inicio debe modificarse e incluso la imagen debe reiniciarse .
- Los intentos anteriores y la preparación de la lista de configuración de recursos del producto final se prueban y verifican en la consola de administración gráfica de KubeSphere, que es mucho más conveniente que la interfaz de línea de comandos.
- Experiencia: Hay decenas de millones de caminos hacia el éxito. Cuando uno falla, puedes intentar cambiar el camino y no morir hasta el final . Nuestro propósito es resolver el problema, el método que puede resolver el problema es un buen método , el espíritu de excavar en el callejón sin salida también depende de la situación.
Al final, solo podemos encontrar otra salida. Afortunadamente, en la investigación anterior, hemos encontrado otras dos posibles soluciones.
- Implemente el clúster Zookeeper ( opción final ) utilizando la imagen creada por Bitnami .
- El esquema presentado en el ejemplo de la documentación oficial de Kubernetes usa el registro espejo.k8s.io/kubernetes-zookeeper:1.0-3.4.10 y usa PodDisruptionBudget para garantizar la disponibilidad del servicio.
Déjame decirte el motivo de la selección final :
- Pod Disruption Budget , un poco complicado y no adecuado para mi rango actual.
Pod Disruption Budget (Presupuesto de interrupción de pod) se conoce como PDB. Solo la versión de Kubernetes >= 1.21 puede usar Pod Disruption Budget. La función del PDB es limitar la cantidad de pods que pueden fallar al mismo tiempo debido a una interferencia voluntaria en una aplicación de múltiples réplicas.
No voy a entrar en detalles sobre los puntos específicos de conocimiento en este artículo, de todos modos no pienso usarlo ahora (¡ah! Principalmente porque no lo entiendo, es inevitable confundir a la gente). Puede consultar los casos de introducción y configuración de PDB en los documentos oficiales .
- La imagen creada por Bitnami implementa un clúster de Zookeeper. Hay muchos casos de referencia en Internet para esta solución, y esta solución utiliza la solución de implementación nativa de Zookeeper sin el mecanismo K8S adicional, lo que reduce la complejidad. Este es también el punto de elección .
A continuación, comencé a intentar usar la imagen de Zookeeper creada por Bitnami para completar la implementación del clúster de Zookeeper .
Pensamiento
La lista de recursos necesarios para un conjunto de clústeres de Zookeeper además del clúster de K8s es la siguiente:
StatefulSet
Servicio sin cabeza
ConfigMap: zoo.cfg (no se usa, todas las configuraciones usan la forma de ENV)
ConfigMap: setup.sh (secuencia de comandos de inicio, planificada para usar pero no utilizada, finalmente adoptada ENV y Command)
Servicio Externo (opcional)
Nota: Dado que el esquema de configuración de este artículo no considera la configuración de seguridad, solo se aplica a los entornos de desarrollo y prueba. No utilice los ejemplos de este artículo directamente en el entorno de producción. Debe consultar el documento de configuración oficial para agregar la configuración de ENV correspondiente antes de que pueda usarse en producción .
Lista de configuración de recursos
A menos que se especifique lo contrario, todas las operaciones relacionadas con K8 se realizan en el nodo Master-0 y el directorio raíz del archivo de configuración es /srv/opsman/k8s-yaml .
- Crear carpeta de inventario
cd /srv/opsman/k8s-yaml
mkdir -p zookeeper/cluster
cd zookeeper/cluster
- vi zookeeper-svc.yaml
---
# Headless Service,用于 Zookeeper 集群之间相互通讯
apiVersion: v1
kind: Service
metadata:
name: zk-hs
labels:
app: zookeeper
spec:
ports:
- name: tcp-client
protocol: TCP
port: 2181
targetPort: 2181
- name: tcp-follower
port: 2888
targetPort: 2888
- name: tcp-election
port: 3888
targetPort: 3888
selector:
app: zookeeper
clusterIP: None
type: ClusterIP
---
# Client Service,用于 K8S 集群内的应用访问 Zookeeper
apiVersion: v1
kind: Service
metadata:
name: zk-cs
labels:
app: zookeeper
spec:
ports:
- name: tcp-client
protocol: TCP
port: 2181
targetPort: 2181
selector:
app: zookeeper
type: ClusterIP
- vi zookeeper-sts.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
labels:
app: zookeeper
spec:
replicas: 3
selector:
matchLabels:
app: zookeeper
serviceName: zk-hs
template:
metadata:
name: zookeeper
labels:
app: zookeeper
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zookeeper
topologyKey: "kubernetes.io/hostname"
containers:
- name: zookeeper
image: bitnami/zookeeper:3.8.2
command:
- bash
- '-ec'
- |
HOSTNAME="$(hostname -s)"
if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; then
ORD=${BASH_REMATCH[2]}
export ZOO_SERVER_ID="$((ORD + 1 ))"
else
echo "Failed to get index from hostname $HOST"
exit 1
fi
exec /entrypoint.sh /run.sh
resources:
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 50m
memory: 500Mi
env:
- name: ZOO_ENABLE_AUTH
value: "no"
- name: ALLOW_ANONYMOUS_LOGIN
value: "yes"
- name: ZOO_SERVERS
value: >
zookeeper-0.zk-hs.default.svc.cluster.local:2888:3888
zookeeper-1.zk-hs.default.svc.cluster.local:2888:3888
zookeeper-2.zk-hs.ddefault.svc.cluster.local:2888:3888
ports:
- name: client
containerPort: 2181
- name: follower
containerPort: 2888
- name: election
containerPort: 3888
livenessProbe:
tcpSocket:
port: client
failureThreshold: 6
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
tcpSocket:
port: client
failureThreshold: 6
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
volumeMounts:
- name: data
mountPath: /bitnami/zookeeper
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "glusterfs"
resources:
requests:
storage: 2Gi
ilustrar:
- Solo usé la configuración ENV más básica, el foco está en ZOO_SERVERS , para más uso de parámetros, consulte la documentación oficial de Bitnami
- El comando de inicio se escribe directamente en Command , o se puede convertir en un ConfigMap y montar como un script
- default.svc.cluster.local , tenga en cuenta que el FQDN solo se puede escribir de esta manera, no lo escriba como uno personalizado, incluso si el nombre de dominio de mi clúster es opsman.top (este es un problema heredado, es demasiado tarde para leerlo detenidamente, hablemos de ello más tarde)
- vi zookeeper-external-svc.yaml
---
# External Client Service,用于 K8S 集群外部访问 Zookeeper
apiVersion: v1
kind: Service
metadata:
name: zookeeper-external-svc
labels:
app: zookeeper-external-svc
spec:
ports:
- name: tcp-zookeeper-external
protocol: TCP
port: 2181
targetPort: 2181
nodePort: 32181
selector:
app: zookeeper
type: NodePort
Nota: Elementos de configuración opcionales , si no es necesario que los servicios externos al clúster de K8s accedan a ellos, no se requiere configuración.
desplegar recursos
- Implementar servicio de clúster y sin cabeza
kubectl apply -f zookeeper-svc.yaml
- Implementación de StatefulSets
kubectl apply -f zookeeper-sts.yaml
- Implementar servicios externos
kubectl apply -f zookeeper-external-svc.yaml
Verificación de recursos de implementación de K8s
- Verificar PersistentVolumeClaim
[root@ks-master-0 cluster]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
data-zookeeper-0 Bound pvc-342c3869-17ca-40c7-9db0-755d5af0f85f 2Gi RWO glusterfs 2m7s Filesystem
data-zookeeper-1 Bound pvc-6744813f-0f5b-4138-8ffc-387f63044af3 2Gi RWO glusterfs 47s Filesystem
data-zookeeper-2 Bound pvc-731edc8d-189a-4601-aa64-a8d6754d93ec 2Gi RWO glusterfs 28s Filesystem
- Verificar StatefulSet
[root@ks-master-0 cluster]# kubectl get sts -o wide
NAME READY AGE CONTAINERS IMAGES
zookeeper 3/3 2m3s zookeeper bitnami/zookeeper:3.8.2
- Verificar pods
[root@ks-master-0 cluster]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
zookeeper-0 1/1 Running 0 2m42s 10.233.118.45 ks-worker-2 <none> <none>
zookeeper-1 1/1 Running 0 83s 10.233.120.17 ks-worker-1 <none> <none>
zookeeper-2 1/1 Running 0 64s 10.233.115.99 ks-worker-0 <none> <none>
- Verificar servicio
[root@ks-master-0 cluster]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
zk-cs ClusterIP 10.233.43.229 <none> 2181/TCP 3m58s app=zookeeper
zk-hs ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 3m58s app=zookeeper
zookeeper-external-svc NodePort 10.233.45.5 <none> 2181:32181/TCP 10s app=zookeeper
Verificación del estado del clúster de Zookeeper
- Verifique el nombre de host de la configuración de Pod creada por StatefulSet
[root@ks-master-0 cluster]# for i in 0 1 2; do kubectl exec zookeeper-$i -- hostname; done
zookeeper-0
zookeeper-1
zookeeper-2
- Verifique el nombre de dominio completo (Nombre de dominio completo, FQDN) de la configuración del Pod creada por StatefulSet
[root@ks-master-0 cluster]# for i in 0 1 2; do kubectl exec zookeeper-$i -- hostname -f; done
zookeeper-0.zk-hs.default.svc.cluster.local
zookeeper-1.zk-hs.default.svc.cluster.local
zookeeper-2.zk-hs.default.svc.cluster.local
- Verifique el contenido del archivo myid para cada servicio de Zookeeper
[root@ks-master-0 cluster]# for i in 0 1 2; do echo "myid zookeeper-$i";kubectl exec zookeeper-$i -- cat /bitnami/zookeeper/data/myid; done
myid zookeeper-0
1
myid zookeeper-1
2
myid zookeeper-2
3
- Verificar los archivos de configuración generados por Zookeeper
[root@ks-master-0 cluster]# kubectl exec -it zookeeper-0 -- cat /opt/bitnami/zookeeper/conf/zoo.cfg | grep -vE "^#|^$"
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/bitnami/zookeeper/data
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
preAllocSize=65536
snapCount=100000
maxCnxns=0
reconfigEnabled=false
quorumListenOnAllIPs=false
4lw.commands.whitelist=srvr, mntr
maxSessionTimeout=40000
admin.serverPort=8080
admin.enableServer=true
server.1=zookeeper-0.zk-hs.default.svc.cluster.local:2888:3888;2181
server.2=zookeeper-1.zk-hs.default.svc.cluster.local:2888:3888;2181
server.3=zookeeper-2.zk-hs.default.svc.cluster.local:2888:3888;2181
- Verificar el estado del clúster
[root@ks-master-0 cluster]# for i in 0 1 2; do echo -e "# myid zookeeper-$i \n";kubectl exec zookeeper-$i -- /opt/bitnami/zookeeper/bin/zkServer.sh status;echo -e "\n"; done
# myid zookeeper-0
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
# myid zookeeper-1
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
# myid zookeeper-2
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
Verificación de disponibilidad del servicio Zookeeper
Valide dentro del clúster K8s .
- Cree una verificación de Zookeeper Client Pod en K8 (creada durante la verificación de un solo nodo, no es necesario volver a crearla)
kubectl run zookeeper-client --image=zookeeper:3.8.2
- Verificar la conectividad del servidor Zookeeper
# 进入 Zookeeper Client 容器内部
kubectl exec -it zookeeper-client -- bash
# 连接 Zookeeper Server( 10.233.43.229 是 Cluster Service 的 IP)
bin/zkCli.sh -server 10.233.43.229:2181
# 成功结果如下(内容有省略)
[root@ks-master-0 cluster]# kubectl exec -it zookeeper-client -- bash
root@zookeeper-client:/apache-zookeeper-3.8.2-bin# bin/zkCli.sh -server 10.233.43.229:2181
Connecting to 10.233.43.229:2181
2023-08-08 10:08:40,864 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
.....
2023-08-08 10:08:40,872 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=10.233.43.229:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@18bf3d14
2023-08-08 10:08:40,886 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2023-08-08 10:08:40,892 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2023-08-08 10:08:40,903 [myid:] - INFO [main:o.a.z.ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
Welcome to ZooKeeper!
2023-08-08 10:08:40,920 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server zk-cs.default.svc.cluster.local/10.233.43.229:2181.
2023-08-08 10:08:40,923 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2023-08-08 10:08:40,948 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /10.233.118.8:38050, server: zk-cs.default.svc.cluster.local/10.233.43.229:2181
2023-08-08 10:08:41,064 [myid:10.233.43.229:2181] - INFO [main-SendThread(10.233.43.229:2181):o.a.z.ClientCnxn$SendThread@1452] - Session establishment complete on server zk-cs.default.svc.cluster.local/10.233.43.229:2181, session id = 0x10007253d840000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 10.233.43.229:2181(CONNECTED) 0]
- Cree datos de prueba para verificar la disponibilidad del servicio
# 创建测试数据
[zk: 10.233.43.229:2181(CONNECTED) 0] create /test test-data1
Created /test
# 读取测试数据
[zk: 10.233.43.229:2181(CONNECTED) 1] get /test
test-data1
Valide fuera del clúster K8s.
- Verificar la conectividad del servidor Zookeeper
# 进入 Zookeeper 安装包的 bin 目录
cd apache-zookeeper-3.8.2-bin/bin/
# 连接 Zookeeper Server( 192.168.9.91 是 K8S Master-0 节点的 IP,32181 是 External Service 定义的 NodePort 端口号)
./zkCli.sh -server 192.168.9.91:32181
# 成功结果如下(结果有省略)
[root@ks-master-0 bin]# ./zkCli.sh -server 192.168.9.91:32181
/usr/bin/java
Connecting to 192.168.9.91:32181
2023-08-08 18:13:52,650 [myid:] - INFO [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.2-139d619b58292d7734b4fc83a0f44be4e7b0c986, built on 2023-07-05 19:24 UTC
......
2023-08-08 18:13:52,660 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=192.168.9.91:32181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@5c072e3f
2023-08-08 18:13:52,666 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2023-08-08 18:13:52,671 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2023-08-08 18:13:52,686 [myid:] - INFO [main:o.a.z.ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
Welcome to ZooKeeper!
2023-08-08 18:13:52,708 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server ks-master-0/192.168.9.91:32181.
2023-08-08 18:13:52,709 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2023-08-08 18:13:52,721 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /192.168.9.91:45004, server: ks-master-0/192.168.9.91:32181
2023-08-08 18:13:52,776 [myid:192.168.9.91:32181] - INFO [main-SendThread(192.168.9.91:32181):o.a.z.ClientCnxn$SendThread@1452] - Session establishment complete on server ks-master-0/192.168.9.91:32181, session id = 0x10007253d840001, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.9.91:32181(CONNECTED) 0]
- Cree datos de prueba para verificar la disponibilidad del servicio
# 创建测试数据
[zk: 192.168.9.91:32181(CONNECTED) 0] create /test2 test2-data1
Created /test2
# 读取测试数据(读取了 2次 测试数据)
[zk: 192.168.9.91:32181(CONNECTED) 1] get /test
test-data1
[zk: 192.168.9.91:32181(CONNECTED) 2] get /test2
test2-data1
Hasta el momento, se ha implementado la implementación del modo de clúster Zookeeper y se han realizado pruebas de conectividad y disponibilidad dentro y fuera del clúster K8S.
Verificar en la consola de administración de KubeSphere
Tome algunas capturas de pantalla para ver el efecto de los recursos relacionados con Zookeeper que se muestran en la consola de administración de KubeSphere.
- StatefulSet
- vainas
- Servicio
Resumir
Este artículo presenta en detalle el proceso de instalación, implementación, prueba y verificación del modo de clúster y nodo único de Zookeeper en un clúster K8s basado en KubeSphere. Los detalles involucrados se resumen a continuación.
- Cómo usar los asistentes de IA y los motores de búsqueda para ayudar a completar las tareas de operación y mantenimiento.
- Cómo usar la imagen oficial de Zookeeper proporcionada por DockerHub para implementar un servicio de Zookeeper de un solo nodo en un clúster K8s y verificar la prueba.
- Cómo usar la imagen de Zookeeper proporcionada por Bitnami para implementar el servicio de clúster Zookeeper en el clúster K8s y verificar la prueba.
- Se presenta un ejemplo de implementación de un clúster de Zookeeper con PodDisruptionBudget , pero en realidad no se ha verificado.
El esquema de configuración de este artículo se puede usar directamente en el entorno de desarrollo y prueba, y también tiene cierto significado de referencia para el entorno de producción.
¡Este artículo está publicado por OpenWrite, una plataforma de publicación múltiple para blogs !