Tutorial práctico de implementación de KubeSphere Zookeeper

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.0que 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 !

Supongo que te gusta

Origin blog.csdn.net/zpf17671624050/article/details/132227255
Recomendado
Clasificación