Technologieaustausch

[Rabbitmq in k8s installieren] Installieren Sie Rabbitmq und erstellen Sie einen Spiegelcluster in k8s – PVC-Version

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Einführung

Der in diesem Artikel erstellte Rabbitmq-Cluster wird in Form von Rabbitmq_peer_discovery_k8s erstellt. Das Plug-In liest automatisch Knoteninformationen aus der k8s-API und erstellt den Rabbitmq-Cluster. Die Daten müssen daher garantiert werden. Persistenz kann die Form von Hostpfad + Knotenaffinität oder die Form von PVC annehmen. In diesem Artikel wird die Verwendung von PVC zum Beibehalten von Daten beschrieben.

1. Bedingungen und Umgebungsbeschreibung

Die k8s-Version k8s-1.29.4 wird in Form eines gemeinsam genutzten Speichers erstellt. Wenn es sich um einen Cluster mit Alibaba Cloud handelt, kann die Datenpersistenz durch Mounten erreicht werden Bei Festplatten-, NAS- oder Objektspeicherung besteht der Nachteil der Verwendung von gemeinsam genutztem Speicher im häufigen Problem einer schlechten Lese- und Schreibleistung.

4.2. Configmap-Konfiguration erstellen

Speichern Sie die folgende Konfiguration in autotest-rabbitmq-config.yaml, konfigurieren Sie den Standard-Vhost und das Benutzerkennwort in der Konfiguration und initialisieren Sie die Informationen zum Clusterknoten [Planen Sie den Knotennamen vor der Installation].

apiVersion: v1
kind: ConfigMap
metadata:
  name: autozx-rabbitmq-config
  namespace: zx-app
  labels:
    appname: pcauto-zx
    app: autozx-rabbitmq-config 
data:
  enabled_plugins: |
    [rabbitmq_management,rabbitmq_peer_discovery_k8s].
  rabbitmq.conf: |
    cluster_name = autozx-rabbitmq
    listeners.tcp.default = 5672
    
    default_vhost = /
    default_user = admin
    default_pass = pconline

    default_user_tags.administrator = true
    default_user_tags.management = true
    default_user_tags.custom_tag = true

    channel_max = 1024
    tcp_listen_options.backlog = 2048

    cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
    cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
    cluster_formation.k8s.address_type = hostname
    cluster_formation.node_cleanup.interval = 30
    cluster_formation.node_cleanup.only_log_warning = true

    cluster_partition_handling = autoheal

    queue_master_locator=min-masters
    loopback_users.guest = false
    cluster_formation.k8s.hostname_suffix = .autozx-rabbitmq.zx-app.svc.cluster.local
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
4.3. Erstellen Sie Statefulset- und Service-Headless-Konfigurationen

Nehmen Sie 3 Kopien

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: autozx-rabbitmq 
  namespace: zx-app 
  labels:
    appname: pcauto-zx
    app: autozx-rabbitmq
spec:
  serviceName: "autozx-rabbitmq"
  replicas: 3
  selector:
    matchLabels:
      app: autozx-rabbitmq
  template:
    metadata:
      labels:
        app: autozx-rabbitmq
    spec:
      containers:
      - name: rabbitmq-server
        image: pcgroup-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/rabbitmq:3.12.14-management 
        imagePullPolicy: IfNotPresent
        env:
        - name: RABBITMQ_ERLANG_COOKIE
          value: "YZSDHWMFSMKEMBDHSGGZ"
        - name: K8S_SERVICE_NAME
          value: autozx-rabbitmq 
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: RABBITMQ_USE_LONGNAME
          value: "true"
        - name: RABBITMQ_NODENAME
          value: rabbit@$(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local
        ports:
        - name: http
          containerPort: 15672 
        - name: amqp
          containerPort: 5672 
        readinessProbe:
          exec:
            command:
            - rabbitmq-diagnostics
            - status
          initialDelaySeconds: 20
          periodSeconds: 60
          timeoutSeconds: 10
        volumeMounts:
        - name: rbmq-data
          mountPath: /var/lib/rabbitmq
        - name: rabbitmq-config-volume
          mountPath: /etc/rabbitmq/ 
      restartPolicy: Always 
      serviceAccountName: rabbitmq-cluster
      terminationGracePeriodSeconds: 30
      volumes:
        - name: rabbitmq-config-volume
          configMap:
            name: autozx-rabbitmq-config
  volumeClaimTemplates:
  - metadata:
      name: rbmq-data
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: example-storageclass
      resources:
        requests:
          storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
  name: autozx-rabbitmq
  namespace: zx-app
  labels:
    appname: pcauto-zx
    app: autozx-rabbitmq
spec:
  ports:
  - port: 5672
  clusterIP: None
  selector:
    app: autozx-rabbitmq
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

Hinweis: Wenn Sie vermeiden möchten, dass derselbe Pod demselben Knoten zugewiesen wird, können Sie die folgende Konfiguration hinzufügen:

      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - autozx-rabbitmq
              topologyKey: "kubernetes.io/hostname"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
4.4. Autorisierungskonfiguration

Konfigurieren Sie serviceAccount, Role und RoleBinding, um Statefulset zum Lesen von Knoteninformationen zu autorisieren

apiVersion: v1
kind: Service
metadata:
  name: autozx-rabbitmq-manage
  namespace: zx-app
  labels:
    app: autozx-rabbitmq-manage
    appname: pcauto-zx
spec:
  ports:
  - port: 5672
    name: amqp
  - port: 15672
    name: http
  selector:
    app: autozx-rabbitmq
  type: LoadBalancer 
[root@autobbs-docker-240-213 rabbitmq]# cat rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: rabbitmq-cluster
  namespace: zx-app
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rabbitmq-cluster
  namespace: zx-app
rules:
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rabbitmq-cluster
  namespace: zx-app
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rabbitmq-cluster
subjects:
- kind: ServiceAccount
  name: rabbitmq-cluster
  namespace: zx-app
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
4.5. Dienstkonfiguration erstellen

Konfigurieren Sie einen Dienst-Proxy-Dienst für den AMQP-Port 5672 und den Verwaltungsport 15672.

apiVersion: v1
kind: Service
metadata:
  name: autozx-rabbitmq-manage
  namespace: zx-app
  labels:
    app: autozx-rabbitmq-manage
    appname: pcauto-zx
spec:
  ports:
  - port: 5672
    name: amqp
  - port: 15672
    name: http
  selector:
    app: autozx-rabbitmq
  type: LoadBalancer 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

5. Konfiguration nach der Installation

Stellen Sie den Rabbitmq-Cluster auf einen 3-Knoten-Spiegelcluster ein. Nach Abschluss von Schritt 4.4 können Sie sich über die IP des Loadbalancers bei der Konsole anmelden: http://ip:15672 und den in der Konfigurationszuordnung festgelegten Standardbenutzer und Standardpass verwenden Anmeldung.
Fügen Sie hier eine Bildbeschreibung ein

Einstellungen für den Spiegelmodus:
Fügen Sie hier eine Bildbeschreibung ein

Nach dem Einstellen:
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Der Spiegelungsmodus kann mit dem Befehl eingestellt werden:
Legen Sie den Image-Ausführungsbefehl des Demo-Vhosts fest:
rabbitmqctl set_policy -p demo ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Spiegelungsmodus für Standard-vhost/ festlegen:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

6. Installationsanweisungen

  • Ersetzen Sie vor der Verwendung der Konfiguration autozx in der Konfiguration durch den von Ihnen benötigten Namen. Der konfigurierte Namespace lautet: zx-app. Ändern Sie ihn in Ihren eigenen Namespace. Der App-Name lautet pcauto-zx. Ändern Sie ihn in Ihren eigenen Anwendungsnamen. Diese Bezeichnung kann ebenfalls verwendet werden gelöscht werden.
  • Die Spiegeladresse in der Konfiguration verwendet eine private Spiegeladresse. Der Spiegel wird von Dockerhub heruntergeladen und in das private Spiegellagerhaus gespiegelt, wenn eine direkte Verbindung zu k8s im externen Netzwerk hergestellt werden kann -Management direkt einsetzbar. Andernfalls konfigurieren Sie eine passable Spiegeladresse.
  • Der Standardbenutzername und das Standardkennwort lauten admin.
  • Die Speicherklasse in der PVC-Vorlage: example-storageclass wird in Ihre eigene Speicherklasse geändert
  • „5. Konfiguration nach der Installation“ Da die Konfigurationsmethoden gleich sind, wird der Screenshot im vorherigen Artikel verwendet.