使用 Helm 部署 RabbitMQ 高可用集群(HA)

打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

在这篇教程中,我们将先容如何通过 Helm 在 Kubernetes 集群中部署 RabbitMQ 高可用集群(HA)。我们将从下载和设置 Helm Chart 包开始,接着会先容一些常见错误的解决方案,以帮助你顺利完成部署。
步调 1:搜索并下载 RabbitMQ HA Helm Chart

首先,添加一些常见的 Helm 仓库,如 Bitnami、Aliyun 和 Azure 等
  1. helm repo add bitnami https://charts.bitnami.com/bitnami
  2. helm repo add stable http://mirror.azure.cn/kubernetes/charts
  3. helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  4. helm repo add incubator https://charts.helm.sh/incubator
  5. helm repo update
复制代码
然后,我们必要在 Helm 仓库中搜索 RabbitMQ HA Chart。使用以下下令可以列出所有干系的 RabbitMQ Chart。
  1. helm search repo rabbitmq
复制代码
输出示例:
  1. NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
  2. aliyun/rabbitmq                         0.6.21          3.7.3           Open source message broker software that implem...
  3. aliyun/rabbitmq-ha                      1.0.0           3.7.3           Highly available RabbitMQ cluster, the open sou...
  4. bitnami/rabbitmq                        15.2.3          4.0.5           RabbitMQ is an open source general-purpose mess...
  5. bitnami/rabbitmq-cluster-operator       4.4.2           2.12.0          The RabbitMQ Cluster Kubernetes Operator automa...
  6. stable/rabbitmq                         0.6.21          3.7.3           Open source message broker software that implem...
  7. stable/rabbitmq-ha                      1.0.0           3.7.3           Highly available RabbitMQ cluster, the open sou...
复制代码
选择 stable/rabbitmq-ha,然后使用 helm pull 下载该 Chart 包。
  1. helm pull stable/rabbitmq-ha
复制代码
解压下载的 Chart 包:
  1. tar -xvf rabbitmq-ha-1.0.0.tgz
  2. cd rabbitmq-ha/
复制代码
步调 2:修改 values.yaml 设置文件

在 Chart 解压后,我们可以找到 values.yaml 文件,修改此中的设置以满足我们的需求。
以下是关键设置项的修改示例:
  1. rabbitmqUsername: rabbitmq
  2. rabbitmqPassword: rabbitmq
  3. image:
  4.   repository: docker-0.unsee.tech/rabbitmq
  5.   tag: 3.7-alpine
  6.   pullPolicy: IfNotPresent
  7. service:
  8.   type: NodePort
  9. persistentVolume:
  10.   enabled: false  # 如果需要开启持久化存储,将此项改为 true
  11.   accessModes:
  12.     - ReadWriteMany
  13.   size: 8Gi
复制代码
在这里,我们更改了 RabbitMQ 的用户名和暗码,还设置了 RabbitMQ 镜像的自界说地点。同时,我们设置了 NodePort 类型的服务,并禁用了长期化存储(你可以根据需求修改为启用)。
步调 3:安装 RabbitMQ HA

完成设置后,使用 Helm 安装 RabbitMQ HA 集群。
  1. helm install rabbitmq-ha ./rabbitmq-ha
复制代码
安装完成后,可以通过以下下令查看服务和 Pod 状态。
查看服务状态:
  1. kubectl get svc
复制代码
输出示例:
  1. NAME                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                                         AGE
  2. kubernetes                ClusterIP   10.96.0.1    <none>        443/TCP                                         3d21h
  3. rabbitmq-ha-rabbitmq-ha   NodePort    10.96.3.50   <none>        15672:32241/TCP,5672:31214/TCP,4369:32046/TCP   2m53s
复制代码
查看 Pod 状态:
  1. kubectl get pod
复制代码
输出示例:
  1. NAME                                              READY   STATUS             RESTARTS   AGE
  2. nfs-subdir-external-provisioner-dc68ff47f-g8k6n   0/1     ImagePullBackOff   0          47m
  3. rabbitmq-ha-rabbitmq-ha-0                         1/1     Running            0          3m7s
  4. rabbitmq-ha-rabbitmq-ha-1                         1/1     Running            0          84s
  5. rabbitmq-ha-rabbitmq-ha-2                         1/1     Running            0          60s
复制代码
步调 4:浏览器访问 RabbitMQ 管理界面

RabbitMQ 管理界面可以通过 NodePort 服务进行访问,使用以下 IP 地点和端口:
  1. http://192.168.80.130:32241/
复制代码
登录账号暗码为:
  1. 用户名:rabbitmq
  2. 密码:rabbitmq
复制代码

常见错误及解决办法

错误 1:API 版本不兼容

如果在安装过程中碰到以下错误:
  1. Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: [resource mapping not found for name: "rabbitmq-ha-rabbitmq-ha" namespace: "" from "": no matches for kind "Role" in version "rbac.authorization.k8s.io/v1beta1"]
复制代码
分析: 这是由于 Kubernetes 1.16 版本后,许多 API 版本被更新或废弃,rbac.authorization.k8s.io/v1beta1 和 apps/v1beta1 已被废弃。
解决方法: 将 Helm Chart 中的 API 版本更新为实用于 Kubernetes 1.22 及以上版本的 API 版本,具体如下:


  • rbac.authorization.k8s.io/v1(替换 v1beta1)
  • apps/v1(替换 v1beta1)
你必要在 templates/ 目录下的资源界说文件中手动更新这些 API 版本。
错误 2:StatefulSet 的 selector 和 labels 不匹配

如果碰到以下错误:
  1. Error: INSTALLATION FAILED: StatefulSet.apps "rabbitmq-ha-rabbitmq-ha" is invalid: [spec.selector: Required value, spec.template.metadata.labels: Invalid value: map[string]string{"app":"rabbitmq-ha", "release":"rabbitmq-ha"}: `selector` does not match template `labels`]
复制代码
分析: 错误表明,StatefulSet 的 spec.selector 部分与 spec.template.metadata.labels 部分的内容不一致。
解决方法: 打开 statefulset.yaml 文件,确保 spec.selector.matchLabels 和 spec.template.metadata.labels 部分的标签一致。
比方,修改以下部分:
  1. selector:
  2.   matchLabels:
  3.     app: {{ template "rabbitmq-ha.name" . }}
  4.     release: {{ .Release.Name }}
复制代码
同时确保 template.metadata.labels 部分的标签一致:
  1. labels:
  2.   app: {{ template "rabbitmq-ha.name" . }}
  3.   release: {{ .Release.Name }}
复制代码
完整的statefulset.yaml 示例:
  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4.   name: {{ template "rabbitmq-ha.fullname" . }}
  5.   labels:
  6.     app: {{ template "rabbitmq-ha.name" . }}
  7.     chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
  8.     release: {{ .Release.Name }}
  9.     heritage: {{ .Release.Service }}
  10. spec:
  11.   serviceName: {{ template "rabbitmq-ha.fullname" . }}
  12.   replicas: {{ .Values.replicaCount }}
  13.   updateStrategy:
  14.     type: {{ .Values.updateStrategy }}
  15.   selector:
  16.     matchLabels:
  17.       app: {{ template "rabbitmq-ha.name" . }}
  18.       release: {{ .Release.Name }}
  19.   template:
  20.     metadata:
  21.       labels:
  22.         app: {{ template "rabbitmq-ha.name" . }}
  23.         release: {{ .Release.Name }}
  24.       annotations:
  25.         {{- if not .Values.customConfigMap }}
  26.         checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
  27.         {{- end }}
  28.     spec:
  29.       terminationGracePeriodSeconds: 10
  30.       serviceAccountName: {{ template "rabbitmq-ha.serviceAccountName" . }}
  31.       containers:
  32.         - name: {{ .Chart.Name }}
  33.           image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
  34.           imagePullPolicy: {{ .Values.image.pullPolicy }}
  35.           ports:
  36.             - name: epmd
  37.               protocol: TCP
  38.               containerPort: 4369
  39.             - name: amqp
  40.               protocol: TCP
  41.               containerPort: 5672
  42.             - name: http
  43.               protocol: TCP
  44.               containerPort: 15672
  45.             {{- if .Values.rabbitmqSTOMPPlugin.enabled }}
  46.             - name: stomp-tcp
  47.               protocol: TCP
  48.               containerPort: 61613
  49.             - name: stomp-ssl
  50.               protocol: TCP
  51.               containerPort: 61614
  52.             {{- end }}
  53.             {{- if .Values.rabbitmqWebSTOMPPlugin.enabled }}
  54.             - name: stomp-ws
  55.               protocol: TCP
  56.               containerPort: 15674
  57.             {{- end }}
  58.             {{- if .Values.rabbitmqMQTTPlugin.enabled }}
  59.             - name: mqtt-tcp
  60.               protocol: TCP
  61.               containerPort: 1883
  62.             - name: mqtt-ssl
  63.               protocol: TCP
  64.               containerPort: 8883
  65.             {{- end }}
  66.             {{- if .Values.rabbitmqWebMQTTPlugin.enabled }}
  67.             - name: mqtt-ws
  68.               protocol: TCP
  69.               containerPort: 15675
  70.             {{- end }}
  71.           livenessProbe:
  72.             exec:
  73.               command:
  74.                 - rabbitmqctl
  75.                 - status
  76.             initialDelaySeconds: 30
  77.             timeoutSeconds: 5
  78.           readinessProbe:
  79.             exec:
  80.               command:
  81.                 - rabbitmqctl
  82.                 - status
  83.             initialDelaySeconds: 10
  84.             timeoutSeconds: 5
  85.           env:
  86.             - name: MY_POD_IP
  87.               valueFrom:
  88.                 fieldRef:
  89.                   fieldPath: status.podIP
  90.             - name: RABBITMQ_USE_LONGNAME
  91.               value: "true"
  92.             - name: RABBITMQ_NODENAME
  93.               value: "rabbit@$(MY_POD_IP)"
  94.             - name: K8S_SERVICE_NAME
  95.               value: {{ template "rabbitmq-ha.fullname" . }}
  96.             - name: RABBITMQ_ERLANG_COOKIE
  97.               valueFrom:
  98.                 secretKeyRef:
  99.                   name: {{ template "rabbitmq-ha.fullname" . }}
  100.                   key: rabbitmq-erlang-cookie
  101.             {{- if .Values.rabbitmqHipeCompile }}
  102.             - name: RABBITMQ_HIPE_COMPILE
  103.               value: {{ .Values.rabbitmqHipeCompile | quote }}
  104.             {{- end }}
  105.             - name: RABBITMQ_DEFAULT_USER
  106.               value: {{ .Values.rabbitmqUsername | quote }}
  107.             - name: RABBITMQ_DEFAULT_PASS
  108.               valueFrom:
  109.                 secretKeyRef:
  110.                   name: {{ template "rabbitmq-ha.fullname" . }}
  111.                   key: rabbitmq-password
  112.             - name: RABBITMQ_DEFAULT_VHOST
  113.               value: {{ .Values.rabbitmqVhost | quote }}
  114.           resources:
  115. {{ toYaml .Values.resources | indent 12 }}
  116.           volumeMounts:
  117.             - name: data
  118.               mountPath: /var/lib/rabbitmq
  119.             - name: config
  120.               mountPath: /etc/rabbitmq
  121.       {{- if .Values.nodeSelector }}
  122.       nodeSelector:
  123. {{ toYaml .Values.nodeSelector | indent 8 }}
  124.       {{- end }}
  125.       {{- if .Values.tolerations }}
  126.       tolerations:
  127. {{ toYaml .Values.tolerations | indent 8 }}
  128.       {{- end }}
  129.       {{- if eq .Values.podAntiAffinity "hard" }}
  130.       affinity:
  131.         podAntiAffinity:
  132.           requiredDuringSchedulingIgnoredDuringExecution:
  133.             - topologyKey: "kubernetes.io/hostname"
  134.               labelSelector:
  135.                 matchLabels:
  136.                   app: {{ template "rabbitmq-ha.name" . }}
  137.                   release: {{ .Release.Name }}
  138.       {{- else if eq .Values.podAntiAffinity "soft" }}
  139.       affinity:
  140.         podAntiAffinity:
  141.           preferredDuringSchedulingIgnoredDuringExecution:
  142.             - weight: 1
  143.               podAffinityTerm:
  144.                 topologyKey: kubernetes.io/hostname
  145.                 labelSelector:
  146.                   matchLabels:
  147.                     app: {{ template "rabbitmq-ha.name" . }}
  148.                     release: {{ .Release.Name }}
  149.       {{- end }}
  150.       volumes:
  151.         - name: config
  152.           configMap:
  153.             name: {{ template "rabbitmq-ha.fullname" . }}
  154. {{- if .Values.persistentVolume.enabled }}
  155.   volumeClaimTemplates:
  156.     - metadata:
  157.         name: data
  158.         annotations:
  159.         {{- range $key, $value := .Values.persistentVolume.annotations }}
  160.           {{ $key }}: {{ $value }}
  161.         {{- end }}
  162.       spec:
  163.         accessModes:
  164.         {{- range .Values.persistentVolume.accessModes }}
  165.           - {{ . | quote }}
  166.         {{- end }}
  167.         resources:
  168.           requests:
  169.             storage: {{ .Values.persistentVolume.size | quote }}
  170.       {{- if .Values.persistentVolume.storageClass }}
  171.       {{- if (eq "-" .Values.persistentVolume.storageClass) }}
  172.         storageClassName: ""
  173.       {{- else }}
  174.         storageClassName: "{{ .Values.persistentVolume.storageClass }}"
  175.       {{- end }}
  176.       {{- end }}
  177. {{- else }}
  178.         - name: data
  179.           emptyDir: {}
  180. {{- end }}
复制代码
结论

通过以上步调,你乐成地在 Kubernetes 集群上使用 Helm 部署了 RabbitMQ 高可用集群。你可以使用浏览器访问管理界面,并根据必要调解设置,处理常见的安装错误。在部署过程中,确保 Helm Chart 与 Kubernetes API 版本兼容,才能顺利完成安装。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表