阅读 1397

K8S部署RabbitMQ集群+镜像模式实现高可用

1. 安装helm

1.1. 安装helm

  • 项目地址:github.com/helm/helm

  • 安装:

# 下载(自行选择版本)
wget https://get.helm.sh/helm-v3.6.1-linux-amd64.tar.gz

# 解压
tar zxvf helm-v3.6.1-linux-amd64.tar.gz

# 安装
mv linux-amd64/helm /usr/local/bin/

# 验证
helm version复制代码

1.2. 基本命令参考

# 添加仓库
helm repo add 
# 查询 charts
helm search repo
# 更新repo仓库资源
helm repo update
# 查看当前安装的charts
helm list -A
# 安装
helm install 
# 卸载
helm uninstall
# 更新
helm upgrade复制代码

2. 安装RabbitMQ

2.1. 下载chart包

# 添加bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 查询chart
helm search repo bitnami

# 创建工作目录
mkdir -p ~/test/rabbitmq
cd ~/test/rabbitmq

# 拉取rabbitmq
helm pull bitnami/rabbitmq

# 解压
tar zxvf [rabbitmq] 
复制代码

image.png

2.2. 配置参数

2.2.1. 编辑配置文件

官方配置参考:github.com/bitnami/cha…

  • 进入工作目录,配置持久化存储、副本数等

  • 建议首次部署时直接修改values中的配置,而不是用–set的方式,这样后期upgrade不必重复设置。

cd  ~/test/rabbitmq/rabbitmq
vim values.yaml复制代码

2.2.2. 设置管理员密码

  • 方式一:在配置中指定

auth:
  username: admin
  password: "admin@mq"
  existingPasswordSecret: ""
  erlangCookie: secretcookie复制代码

image.png

  • 方式二:在安装时通过set方式指定(避免密码泄露)

--set auth.username=admin,auth.password=admin@mq,auth.erlangCookie=secretcookie复制代码

2.2.3. rabbitmq集群意外宕机强制启动 当rabbitmq启用持久化存储时,若rabbitmq所有pod同时宕机,将无法重新启动,因此有必要提前开启clustering.forceBoot

clustering:
  enabled: true
  addressType: hostname
  rebalance: false
  forceBoot: true复制代码

image.png

2.2.4. 模拟rabbitmq集群宕机(可跳过)

  • 未设置clustering.forceBoot时,如下图,通过删除rabbitmq集群所有pod模拟宕机,可见集群重新启动时第一个节点迟迟未就绪

image.png

  • 报错信息如下:

image.png

  • 启用clustering.forceBoot,并更新rabbitmq,可见集群重启正常

helm upgrade rabbitmq -n test .
kubectl delete pod -n test rabbitmq-0
get pod -n test -w复制代码

image.png

2.2.5. 指定时区

extraEnvVars: 
  - name: TZ
    value: "Asia/Shanghai"复制代码

2.2.6. 指定副本数

replicaCount: 3复制代码

2.2.7. 设置持久化存储

  • 若无需持久化,将enabled设置为false

  • 持久化需使用块存储,本文通过aws的ebs-csi创建storageClass,亦可使用自建块存储storageClass

注:sc最好具备扩容属性

persistence:
  enabled: true
  storageClass: "ebs-sc"
  selector: {}
  accessMode: ReadWriteOnce
  existingClaim: ""
  size: 8Gi复制代码

image.png

2.2.8. 设置service

  • 默认通过ClusterIP暴露5672(amqp)和15672(web管理界面)等端口供集群内部使用,外部访问方式将在第三章中详细说明

  • 不建议在values中直接配置nodeport,不方便后期灵活配置

2.3. 部署RabbitMQ

2.3.1. 创建命名空间

cd  ~/test/rabbitmq/rabbitmq
kubectl create ns test 
复制代码

2.3.2. 安装

  • 方式一 :在配置文件中指定管理员帐号密码

helm install rabbitmq -n test .复制代码

image.png

  • 方式二:通过set方式指定密码

helm install rabbitmq -n test . \
  --set auth.username=admin,auth.password=admin@mq,auth.erlangCookie=secretcookie复制代码

2.3.3. 查看rabbitmq安装状态

  • 查看rabbitmq安装进度

kubectl get pod -n test -w

1复制代码
  • 待各节点都正常启动后,查看svc

kubectl get svc -n test复制代码

image.png

当前rabbitmq通过ClusterIP方式暴露,供集群内部访问;外部访问方式将在下章介绍。

  • 查看集群状态

# 进入pod
kubectl exec -it -n test rabbitmq-0 -- bash

# 查看集群状态
rabbitmqctl cluster_status

# 列出策略(尚未设置镜像模式)
rabbitmqctl list_policies

#设置集群名称
rabbitmqctl set_cluster_name [cluster_name]复制代码

3. 配置RabbitMQ集群外部访问方式

3.1. 建议方式

  • 不建议在默认安装方式中指定nodeport,而是另外创建

  • 5672:建议通过service-私网负载均衡器暴露给私网其它应用使用

  • 15672:建议通过ingressservice-公网负载均衡器暴露给外界访问

端口暴露方式(见下文方式三)访问方式
5672Service-LoadBalancer(配置为私网负载均衡器)k8s集群内:rabbitmq.test:5672 私网:私网负载均衡IP:5672
15672ingress-ALB(配置为公网负载均衡器)公网负载均衡URL

注:本文使用亚马逊托管版k8s集群,已配置aws-load-balancer-controller

3.2. 方式一:Service-Nodeport(5672,15672)

  • 获取原始Service-ClusterIP的yaml文件:

cd /test/rabbitmq
kubectl get svc -n test rabbitmq -o yaml > service-clusterip.yaml复制代码
  • 参考service-clusterip,创建service-nodeport.yaml

cp service-clusterip.yaml service-nodeport.yaml复制代码
  • 配置service-nodeport(去除多余信息)

apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-nodeport
  namespace: test
spec:
  ports:
  - name: amqp
    port: 5672
    protocol: TCP
    targetPort: amqp
    nodePort: 32672
  - name: http-stats
    port: 15672
    protocol: TCP
    targetPort: stats
    nodePort: 32673
  selector:
    app.kubernetes.io/instance: rabbitmq
    app.kubernetes.io/name: rabbitmq
  type: NodePort复制代码
  • 创建service

kubectl apply -f service-nodeport.yaml
kubectl get svc -n test复制代码

image.png

  • 即可通过NodeIP:Port访问服务。

3.3. 方式二:Service-公网LoadBalancer(5672,15672)

  • 创建service-loadbalancer.yaml

vim service-loadbalancer.yaml复制代码
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-loadbalance
  namespace: test
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
  ports:
  - name: amqp
    port: 5672
    protocol: TCP
    targetPort: amqp
  - name: http-stats
    port: 15672
    protocol: TCP
    targetPort: stats
  selector:
    app.kubernetes.io/instance: rabbitmq
    app.kubernetes.io/name: rabbitmq
  type: LoadBalancer复制代码
  • 创建service:

kubectl apply -f service-loadbalancer.yaml
kubectl get svc -n test复制代码

image.png

3.4. 方式三:Service-私网LoadBalancer(5672)+Ingress-公网ALB(15672)

3.4.1. 创建Service-私网LoadBalancer

vim service-lb-internal.yaml复制代码
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-lb-internal
  namespace: test
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    # service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing #注释后即为私网
spec:
  ports:
  - name: amqp
    port: 5672
    protocol: TCP
    targetPort: amqp
  selector:
    app.kubernetes.io/instance: rabbitmq
    app.kubernetes.io/name: rabbitmq
  type: LoadBalancer复制代码
kubectl apply -f service-lb-internal.yaml复制代码

3.4.2. 创建Ingress-ALB

vim ingress-alb.yaml复制代码
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rabbitmq
  namespace: test
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
  labels:
    app: rabbitmq
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: "rabbitmq"
              servicePort: 15672复制代码
kubectl apply -f ingress-alb.yaml复制代码

image.png

4. 配置镜像模式实现高可用

4.1. 镜像模式介绍

镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现 RabbitMQ 的 HA 高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在 consumer 消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

4.2. rabbitmqctl设置镜像模式

# 进入pod
kubectl exec -it -n test rabbitmq-0 -- bash

# 列出策略(尚未设置镜像模式)
rabbitmqctl list_policies

# 设置镜像模式
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all" , "ha-sync-mode":"automatic"}'

# 再次列出策略
rabbitmqctl list_policies复制代码

image.png

控制台查看

image.png

5. 清理RabbitMQ集群

5.1. 卸载RabbitMQ

helm uninstall rabbitmq -n test复制代码

5.2. 删除pvc

kubectl delete pvc -n test data-rabbitmq-0 data-rabbitmq-1 data-rabbitmq-2复制代码

5.3. 清理手动创建的service,ingress

kubectl delete -f service-nodeport.yaml
kubectl delete -f service-loadbalancer.yaml
kubectl delete -f ingress-alb.yaml


作者:RayPick
链接:https://juejin.cn/post/7025780151820484621


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐