Tutoriel pratique sur le déploiement de KubeSphere Zookeeper

avant-propos

points de connaissance

  • Classement : entrée de gamme
  • Comment utiliser AI Assistant pour assister le travail O&M
  • Installation et déploiement de Zookeeper à nœud unique
  • Installation et déploiement de Zookeeper en mode cluster
  • Réflexions sur la sélection d'applications open source

Configuration réelle du serveur (l'architecture 1:1 reproduit l'environnement de production à petite échelle, la configuration est légèrement différente)

Nom du processeur IP CPU Mémoire disque système disque de données utiliser
ks-maître-0 192.168.9.91 4 8 50 100 KubeSphere/k8s-master
ks-maître-1 192.168.9.92 4 8 50 100 KubeSphere/k8s-master
ks-maître-2 192.168.9.93 4 8 50 100 KubeSphere/k8s-master
ks-travailleur-0 192.168.9.95 4 16 50 100 k8s-worker/CI
ks-travailleur-1 192.168.9.96 4 16 50 100 k8s-travailleur
ks-travailleur-2 192.168.9.97 4 16 50 100 k8s-travailleur
stockage-0 192.168.9.81 2 4 50 100+ ElasticSearch/GlusterFS/Ceph/Longhorn/NFS/
stockage-1 192.168.9.82 2 4 50 100+ ElasticSearch/GlusterFS/Ceph/Longhorn
stockage-2 192.168.9.83 2 4 50 100+ ElasticSearch/GlusterFS/Ceph/Longhorn
enregistrement 192.168.9.80 2 4 50 200 Sonatype Nexus 3
total dix 32 88 500 1100+

L'environnement de combat réel implique des informations sur la version du logiciel

  • Système d'exploitation : openEuler 22.03 LTS SP2 x86_64
  • KubeSphere : 3.3.2
  • Kubernetes :v1.24.12
  • Conteneur:1.6.4
  • GlusterFS:10.0-8
  • Clé Kube : v3.0.8
  • Gardien de zoo:3.8.2

Introduction

Aujourd'hui, notre contenu de combat réel adopte la forme de simulation de scène pour simuler une scène qui sera inévitablement rencontrée lors de travaux réels d'exploitation et de maintenance .

En tant que novice en matière d'exploitation et de maintenance qui vient d'entrer sur le lieu de travail et qui découvre l'exploitation et la maintenance natives du cloud, Boss m'a arrangé une tâche difficile aujourd'hui. Oui, vous l'avez bien lu, c'est difficile .

Difficulté élevée = 2 M 1 D = entendu, jamais vu, jamais fait, peu de temps .

Les exigences de tâche proposées par Boss sont organisées comme suit (je comprends, je suppose, je les recherche et je les organise en fonction des mots originaux de Boss, en fait, Boos n'a pas du tout dit quelques mots):

  • Déployer un Zookeeper à nœud unique sur le cluster K8s
  • Déployer Zookeeper en mode cluster sur le cluster K8s
  • Scénarios d'utilisation : recherche et développement, tests (il est susceptible d'être directement transféré à la production à un stade ultérieur)
  • Période de livraison des tâches : demain (le chef pense que c'est très simple)
  • Exigences de base : tant qu'il peut être utilisé (à comprendre par vous-même)

Puisque vous ne pouvez pas refuser, que le temps est compté et que la tâche est lourde, faisons-le, go ! ! !

2. Analyse des idées de réalisation de tâches

Si un ouvrier veut faire du bon travail, il doit d'abord affûter ses outils. Puisqu'il s'agit d'une tâche au niveau de 2 M 1 D , sortez d'abord les deux premières planches des trois planches d'exploitation et de maintenance à l'ère de l'IA pour voir si cela peut résoudre le problème.

Comme cela a été fait avec seulement deux axes, le troisième n'a pas été utilisé.

Le premier tour - Assistant IA

Mots d'invite : "Je souhaite déployer zookeerper sur K8. Donnez-moi respectivement un plan de déploiement en mode nœud unique et cluster. Notez que vous devez utiliser la classe de stockage glusterfs, vous devez disposer de SVC et vous devez disposer du ConfigMap de zoo.cfg"

Remarque importante : je ne suis pas doué pour apprendre, je ne connais pas les assistants IA et les mots rapides ne sont pas bien écrits, donc l'effet final n'est pas très bon.

Après avoir saisi les mots rapides ci-dessus, AI Assistant-3.5 bla bla bla m'a renvoyé un tas de textes, et je n'ai pris que l'essence pour l'affichage.

  • Profil de déploiement à nœud unique ( 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
  • Fichier de configuration de déploiement en mode cluster ( 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

Après avoir analysé le contenu, j'ai trouvé que je semblais comprendre un peu, mais je ne le comprends pas complètement. Les fichiers de configuration du mode nœud unique et cluster dans les résultats renvoyés se ressemblent. Analysons les résultats, et au fait , Pensez-y:

  • Le type de kind est différent : le nœud unique est Deployment et le mode cluster est StatefulSet . Cela semble bien fonctionner pour le moment et l'idée est correcte.
  • Le nombre de copies de Deployment est de 1 et le nombre de copies de StatefulSet est de 3
  • Le mode cluster n'utilise pas volumeClaimTemplates
  • Il y a plusieurs autres éléments de configuration du serveur dans le fichier de configuration zoo.cfg en mode cluster, mais il semble que le traitement de myid n'ait pas été implémenté

Il est nécessaire d'avoir une certaine accumulation de connaissances liées aux K8 et au Zookeeper afin d'analyser si les résultats donnés par l'assistant IA répondent aux exigences, sinon il est impossible de comprendre.

La deuxième astuce - moteur de recherche

Le moteur de recherche s'est classé premier dans l'assistance à l'exploitation et à la maintenance avant la sortie de l' assistant IA , et maintenant il est temporairement classé deuxième, et on estime qu'il n'y a aucune chance de revenir au sommet (je représente mon classement personnel avis).

Après avoir lu les résultats de sortie de l'assistant IA , j'ai l'impression que la structure globale et le contenu sont corrects, mais j'ai l'impression que les détails ne sont pas si intéressants, notamment le déploiement du mode cluster. Nous le vérifierons dans la troisième sous-section de cet article.

Dans le même temps, j'ai également découvert image: zookeeper:3.7.0que puisque l'image référencée est l'image officielle de DockerHub, il doit y avoir une image correspondante et la méthode d'utilisation du déploiement conteneurisé sur DockerHub.

Cela apporte également une nouvelle inspiration et une nouvelle méthode d'apprentissage, et c'est aussi le moyen le plus simple et le plus direct de convertir le déploiement Docker en déploiement Kubernetes. Allez directement voir les commandes de déploiement, les commandes de démarrage et les paramètres associés de Docker, puis passez directement à Ça fonctionne sur les K8.

Allez directement sur le site officiel de DokcerHub , et on recherche directement avec le mot clé zookeeper .

Capture d'écran des résultats de recherche :

Réfléchissez simplement et analysez les résultats de la recherche :

  • Les deux images de gardien de zoo les mieux classées, avec un volume de téléchargement de plus de 100M+ , sont respectivement produites par Docker official et Bitnami .

  • Zookeeper de Bitnami a enregistré le plus de téléchargements la semaine dernière, avec 1 140 215 téléchargements, soit plus du double des 681 115 téléchargements de zookeeper de DockerHub.

Astuce : Bitnami , j'ai commencé à utiliser Bitnami il y a plus de dix ans. Le package d'installation de déploiement en un clic qu'ils ont produit était à l'époque un très bon fournisseur de services de solution middleware de déploiement en un clic. Maintenant, il devrait être plus complet et meilleur.

Pourquoi faire l'analyse ci-dessus?

  • Lorsque nous choisissons une technologie open source, l'un des principaux déterminants est le nombre d'utilisateurs Trop peu d'utilisateurs indiquent que le produit est immature, ce qui signifie qu'en cas de problème, vous n'avez aucun endroit où demander de l'aide.
  • Il y a plusieurs principes pour ma sélection de technologie : officiel préféré (Apache officiel n'est pas disponible, seulement DockerHub officiel), grand nombre d'utilisateurs (100M+), maintenance et mises à jour fréquentes (il y a 7 jours).
  • En plus de l'image du gardien de zoo produite par DockerHub , l'image produite par Bitnami est également un bon choix. Les yeux des masses sont avertis. Si elle n'est pas facile à utiliser, il est impossible pour autant de personnes de la recommander et de la télécharger.
  • L'exemple donné par AI Assistant utilise l'image officielle de DockerHub.

Tant de choses ont été dites plus haut, il semblerait que le moteur de recherche clé du deuxième axe n'ait pas été mentionné Parmi les résultats donnés par l'assistant IA , le mode mono-nœud ne semble pas poser de problème, mais le cluster mode a toujours l'impression qu'il manque quelque chose. Le point clé est myid Par conséquent, j'ai utilisé le mot-clé StatefulSet pour déployer Zookeeper et j'ai recherché dans le moteur de recherche.

Il y a deux directions dans les résultats de recherche qui ont plus de valeur de référence :

  • Basé sur le schéma de déploiement de Zookeeper donné dans les documents officiels de K8.

Un cas de tutoriel Running ZooKeeper, A Distributed System Coordinator sur le site officiel de K8s Cet exemple semble compliqué et introduit plusieurs nouvelles technologies.

  • Schéma de déploiement du cluster Zookeeper basé sur l'image réalisée par Bitnami

Pour trier les informations qui ont été obtenues, afin de terminer rapidement les tâches livrées par les dirigeants, l'ordre du plan de test de vérification d'aujourd'hui est le suivant :

  • Configuration de déploiement à nœud unique fournie par AI Assistant
  • Configuration de déploiement en mode cluster fournie par AI Assistant
  • Solution de déploiement en mode cluster fournie par Bitnami
  • Site officiel de K8s Mallette de déploiement Zookeeper

Parce que le déploiement à nœud unique est relativement simple. Par conséquent, le point clé du test est de savoir si la configuration de déploiement en mode cluster fournie par l'assistant AI et Bitnami est réalisable. Si la solution est réalisable, il n'y aura pas de cas de site Web officiel. Sinon, essayez le site Web officiel de K8. Cas de déploiement Zookeeper , mais pour être honnête, je ne veux pas le faire pour le moment. Touchez, car il y a un point technique dans ce cas dont je n'ai jamais entendu parler du tout, et si j'essaie vraiment de le faire, il introduira de nouveaux problèmes.

Déploiement d'un seul nœud Zookeeper

Je pense que le plan de déploiement à nœud unique et les fichiers de configuration renvoyés par l'assistant AI semblent corrects. Cependant, ne copiez pas et ne collez pas directement, utilisez-le simplement. Assurez-vous de vous référer aux exemples liés à Zookeeper sur le site officiel de DockerHub La combinaison des deux produira une liste de ressources plus fiable.

Pensée

La liste des ressources requises par un Zookeeper à nœud unique au-dessus du cluster K8s est la suivante :

  • PersistentVolumeClaim

  • ConfigMap:zoo.cfg

  • Déploiement

  • Service de grappe

  • Service externe (optionnel)

Après avoir pris connaissance des objectifs de tâche à accomplir, un ensemble de listes de configuration de ressources est généré en fonction de la configuration donnée par l'assistant IA et des paramètres de configuration officiels.

Remarque : La pratique a prouvé que l'assistant IA ne donne qu'une idée approximative, et il y a encore de nombreuses lacunes dans les détails. Toutes les listes de configuration des ressources dans les exemples suivants sont compilées en référence aux paramètres de configuration officiels et aux exigences d'utilisation réelles.

Dites-moi brièvement ce qui a été modifié.

  • Sélection de la version de Zookeeper, en utilisant une version 3.8.2 derrière la dernière version stable officielle 3.9.0 pour remplacer 3.7.0 dans le schéma de configuration donné par l'assistant IA
  • Ajout de la configuration du journal de données
  • Configuration améliorée de la limite des ressources
  • Améliorer la configuration de zoo.cfg

Liste de configuration des ressources

Sauf indication contraire, toutes les opérations impliquant des K8 sont effectuées sur le nœud Master-0 et le répertoire racine du fichier de configuration est /srv/opsman/k8s-yaml .

  • Créer un dossier d'inventaire
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

Description : GlusterFS utilisé par la classe de stockage backend .

  • 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

Le déploiement et le service de cluster sont placés dans un fichier de configuration.

  • 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

Remarque : Éléments de configuration facultatifs , s'ils n'ont pas besoin d'être accessibles par des services extérieurs au cluster K8s, aucune configuration n'est requise.

déployer des ressources

  • Déployer PersistentVolumeClaim
kubectl apply -f zookeeper-pvc.yaml
  • Déployer ConfigMaps
kubectl apply -f zookeeper-cm.yaml
  • Déploiement
kubectl apply -f zookeeper-deploy.yaml
  • Déployer des services externes
kubectl apply -f zookeeper-svc.yaml

Vérification des ressources de déploiement K8s

  • Vérifier 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
  • Vérifier le déploiement
[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
  • Vérifier les modules
[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>
  • Vérifier le service
[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

Vérification de la disponibilité du service Zookeeper

Validez au sein du cluster K8s .

  • Créer un pod client Zookeeper sur K8 pour vérification
kubectl run zookeeper-client --image=zookeeper:3.8.2
  • Vérifier la connectivité du serveur 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]
  • Créer des données de test pour vérifier la disponibilité du service
# 创建测试数据
[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

Validez en dehors du cluster K8s.

Cet article utilise directement le nœud K8s Master-0 pour installer le client Zookeeper pour la vérification des tests.

  • L'installation d'openjdk est limitée à la vérification des tests.
yum install java-11-openjdk
  • Installez le client Zookeeper et accédez au site Web officiel de Zookeeper pour trouver la version correspondante du progiciel. Cet article sélectionne 3.8.2 comme version de test.
# 下载并解压 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
  • Vérifier la connectivité du serveur 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]
  • Créer des données de test pour vérifier la disponibilité du service
# 创建测试数据
[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

Jusqu'à présent, la moitié des tâches assignées par Boss ont été réalisées, le déploiement de Zookeeper à nœud unique a été réalisé et les tests de connectivité et de disponibilité ont été effectués à l'intérieur et à l'extérieur du cluster K8s.

Cependant, le temps a expiré et il est arrivé au deuxième jour, donc, pour une tâche inconnue, ce n'est pas aussi simple que Boss l'imaginait.

Cependant, en raison de l'achèvement de la tâche de nœud unique, soumettez d'abord le rapport au patron et expliquez les idées de mise en œuvre, le processus, les problèmes et les solutions rencontrés pendant le processus de déploiement (n'oubliez pas de ne pas dire directement au patron que c'est difficile, vous estimation S'il y a un problème avec le temps, alors c'est purement une recherche).

Après avoir signalé selon la routine ci-dessus, j'ai obtenu la compréhension et l'approbation du patron (le patron est en fait très doué pour parler, tant que vous pouvez le convaincre avec raison), laissez-moi d'abord remettre l'environnement Zookeeper à nœud unique à le test, puis continuez à étudier le schéma de déploiement du mode cluster.

Cette vague d'opérations n'a non seulement pas reçu de critiques, mais elle a aussi permis de gagner du temps pour moi, parfait ! ! !

Déploiement de Zookeeper en mode cluster

Une fois la tâche de déploiement de Zookeeper sur un seul nœud terminée, l'étape suivante consiste à étudier le déploiement de Zookeeper en mode cluster. L' exemple par défaut donné par l'assistant IA n'est pas fiable du tout, et je suis trop paresseux pour le former.

Pourquoi dites vous cela?

Parce que j'ai utilisé la solution donnée par l'assistant AI ​​​​, et utilisé le Zookeeper fourni par DockerHub pour essayer de déployer le cluster Zookeeper sur le cluster K8s. Cela a pris 2 jours (principalement parce que j'étais malade, et je voulais obtenir c'est fait, mais je n'étais pas assez capable !)

Ensuite, permettez-moi de parler brièvement des tentatives que j'ai faites, des problèmes que j'ai rencontrés et des expériences que j'ai vécues pendant les deux jours où j'ai été torturé et fou (ce qui m'a presque obligé à recourir à une troisième hache).

  • La clé du mode cluster est de résoudre la configuration de myid et des serveurs
  • Il n'y a pas de problème avec la configuration des serveurs, qui peut être directement écrite dans le fichier de configuration ou injectée par ENV
  • myid est le point clé. Pour l'image Zookeeper fournie dans l'entrepôt miroir DockHub, le nœud myid ne peut pas être configuré dynamiquement
  • Dans l'expérience, j'ai essayé initContainers , SidecarContainer , ConfigMap montant des scripts de démarrage, etc., mais aucun d'entre eux n'a fonctionné.
  • Ce n'est pas que l'image DockHub ne peut pas être utilisée du tout, c'est juste que le script de démarrage doit être modifié, et même l'image doit être redémarrée .
  • Les tentatives ci-dessus et la préparation de la liste finale de configuration des ressources du produit sont toutes testées et vérifiées sous la console de gestion graphique KubeSphere, ce qui est beaucoup plus pratique que l'interface de ligne de commande.
  • Expérience : Il y a des dizaines de millions de chemins vers le succès. Quand un échoue, vous pouvez essayer de changer de chemin, et ne pas mourir jusqu'au bout . Notre but est de résoudre le problème, la méthode qui peut résoudre le problème est une bonne méthode , l'esprit de creuser dans l'impasse dépend aussi de la situation

En fin de compte, nous ne pouvons que trouver une autre issue.Heureusement, dans les recherches précédentes, nous avons trouvé deux autres solutions possibles.

  • Déployez le cluster Zookeeper ( choix final ) en utilisant l'image réalisée par Bitnami .
  • Le schéma introduit dans l'exemple de documentation officiel de Kubernetes utilise le miroir Registry.k8s.io/kubernetes-zookeeper:1.0-3.4.10 et utilise PodDisruptionBudget pour garantir la disponibilité du service.

Laissez-moi vous dire la raison de la sélection finale :

  • Pod Disruption Budget , un peu compliqué et pas adapté à mon rang actuel.

Le budget de perturbation des pods (budget de perturbation des pods) est appelé PDB. Seule la version Kubernetes >= 1.21 peut utiliser le budget de perturbation des pods. Le rôle du PDB est de limiter le nombre de pods qui peuvent tomber en même temps en raison d'une interférence volontaire dans une application multi-réplique.

Je ne rentrerai pas dans les détails des points de connaissance spécifiques dans cet article. De toute façon, je ne compte pas l'utiliser maintenant (ah ! Principalement parce que je ne comprends pas, c'est inévitable d'embrouiller les gens). peut se référer à l'introduction de l'APB et aux cas de configuration de l'APB dans les documents officiels .

  • L'image réalisée par Bitnami déploie un cluster Zookeeper, il existe de nombreux cas de référence sur Internet pour cette solution, et cette solution utilise la solution de déploiement native de Zookeeper sans mécanisme K8S supplémentaire, ce qui réduit la complexité. C'est aussi le point de choix .

Ensuite, j'ai commencé à essayer d'utiliser l'image Zookeeper créée par Bitnami pour terminer le déploiement du cluster Zookeeper .

Pensée

La liste des ressources requises pour un ensemble de clusters Zookeeper au-dessus du cluster K8s est la suivante :

  • StatefulSet

  • Service sans tête

  • ConfigMap : zoo.cfg (non utilisé, toutes les configurations utilisent la forme ENV)

  • ConfigMap : setup.sh (script de démarrage, prévu d'utiliser mais pas réellement utilisé, finalement adopté ENV et Command)

  • Service externe (optionnel)

Remarque : étant donné que le schéma de configuration de cet article ne tient pas compte de la configuration de sécurité, il s'applique uniquement aux environnements de développement et de test. N'utilisez pas les exemples de cet article directement dans l'environnement de production. Vous devez vous référer au document de configuration officiel pour ajouter la configuration ENV correspondante avant de pouvoir l'utiliser en production .

Liste de configuration des ressources

Sauf indication contraire, toutes les opérations impliquant des K8 sont effectuées sur le nœud Master-0 et le répertoire racine du fichier de configuration est /srv/opsman/k8s-yaml .

  • Créer un dossier d'inventaire
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

illustrer:

  • Je n'ai utilisé que la configuration ENV la plus basique, l'accent est mis sur ZOO_SERVERS , pour plus d'utilisation de paramètres, veuillez vous référer à la documentation officielle de Bitnami
  • La commande de démarrage est directement écrite dans Command , ou elle peut être transformée en ConfigMap et montée en tant que script
  • default.svc.cluster.local , notez que le FQDN ne peut être écrit que de cette manière, ne l'écrivez pas de manière personnalisée, même si le nom de domaine de mon cluster est opsman.top (il s'agit d'un problème hérité, il est trop tard à lire attentivement, nous en reparlerons plus tard)
  • 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

Remarque : Éléments de configuration facultatifs , s'ils n'ont pas besoin d'être accessibles par des services extérieurs au cluster K8s, aucune configuration n'est requise.

déployer des ressources

  • Déployer le cluster et le service sans tête
kubectl apply -f zookeeper-svc.yaml
  • Déployer des StatefulSets
kubectl apply -f zookeeper-sts.yaml
  • Déployer des services externes
kubectl apply -f zookeeper-external-svc.yaml

Vérification des ressources de déploiement K8s

  • Vérifier 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
  • Vérifier 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
  • Vérifier les modules
[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>
  • Vérifier le service
[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

Vérification de l'état du cluster Zookeeper

  • Vérifiez le nom d'hôte de la configuration de pod créée par le 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
  • Vérifier le nom de domaine complet (Fully Qualified Domain Name, FQDN) de la configuration de pod créée par 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
  • Vérifier le contenu du fichier myid pour chaque service 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
  • Vérifier les fichiers de configuration générés par 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
  • Vérifier l'état du cluster
[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

Vérification de la disponibilité du service Zookeeper

Validez au sein du cluster K8s .

  • Créer une vérification du pod client Zookeeper sur les K8 (créée lors de la vérification d'un nœud unique, pas besoin de créer à nouveau)
kubectl run zookeeper-client --image=zookeeper:3.8.2
  • Vérifier la connectivité du serveur 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]
  • Créer des données de test pour vérifier la disponibilité du service
# 创建测试数据
[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

Validez en dehors du cluster K8s.

  • Vérifier la connectivité du serveur 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]
  • Créer des données de test pour vérifier la disponibilité du service
# 创建测试数据
[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

Jusqu'à présent, le déploiement du mode cluster Zookeeper a été mis en œuvre et des tests de connectivité et de disponibilité ont été effectués à l'intérieur et à l'extérieur du cluster K8S.

Vérifier dans la console de gestion KubeSphere

Prenez quelques captures d'écran pour voir l'effet des ressources liées à Zookeeper affichées dans la console de gestion KubeSphere.

  • StatefulSet

  • Gousses

  • Service

Résumer

Cet article présente en détail le processus d'installation, de déploiement, de test et de vérification du mode nœud unique et cluster de Zookeeper sur un cluster K8s basé sur KubeSphere. Les détails impliqués sont résumés comme suit.

  • Comment utiliser les assistants d'intelligence artificielle et les moteurs de recherche pour aider à l'exécution des tâches d'O&M.
  • Comment utiliser l'image officielle Zookeeper fournie par DockerHub pour déployer un service Zookeeper à nœud unique sur un cluster K8s et vérifier le test.
  • Comment utiliser l'image Zookeeper fournie par Bitnami pour déployer le service de cluster Zookeeper sur le cluster K8s et vérifier le test.
  • Un exemple de déploiement d'un cluster Zookeeper à l'aide de PodDisruptionBudget est présenté , mais il n'a pas été réellement vérifié.

Le schéma de configuration de cet article peut être directement utilisé dans l'environnement de développement et de test, et il a également une certaine signification de référence pour l'environnement de production.

Cet article est publié par OpenWrite, une plateforme multi-post pour les blogs !

Je suppose que tu aimes

Origine blog.csdn.net/zpf17671624050/article/details/132227255
conseillé
Classement