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] 复制代码
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复制代码
方式二:在安装时通过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复制代码
2.2.4. 模拟rabbitmq集群宕机(可跳过)
未设置
clustering.forceBoot
时,如下图,通过删除rabbitmq集群所有pod模拟宕机,可见集群重新启动时第一个节点迟迟未就绪
报错信息如下:
启用
clustering.forceBoot
,并更新rabbitmq,可见集群重启正常
helm upgrade rabbitmq -n test . kubectl delete pod -n test rabbitmq-0 get pod -n test -w复制代码
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复制代码
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 .复制代码
方式二:通过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复制代码
当前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:建议通过
ingress
或service-公网负载均衡器
暴露给外界访问
端口 | 暴露方式(见下文方式三) | 访问方式 |
---|---|---|
5672 | Service-LoadBalancer(配置为私网负载均衡器) | k8s集群内:rabbitmq.test:5672 私网:私网负载均衡IP:5672 |
15672 | ingress-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复制代码
即可通过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复制代码
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复制代码
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复制代码
控制台查看
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