在 K8s 集群上部署 RabbitMQ 实战
作者:老Z,云原生爱好者,目前专注于云原生运维,KubeSphere Ambassador。
前言
知识点
- 定级:入门级
- RabbitMQ 单节点安装部署
- RabbitMQ 集群安装部署
- GitOps 运维思想
演示服务器配置
主机名 | IP | CPU | 内存 | 系统盘 | 数据盘 | 用途 |
---|---|---|---|---|---|---|
zdeops-master | 192.168.9.9 | 2 | 4 | 40 | 200 | Ansible 运维控制节点 |
ks-k8s-master-0 | 192.168.9.91 | 4 | 16 | 40 | 200+200 | KubeSphere/k8s-master/k8s-worker/Ceph |
ks-k8s-master-1 | 192.168.9.92 | 4 | 16 | 40 | 200+200 | KubeSphere/k8s-master/k8s-worker/Ceph |
ks-k8s-master-2 | 192.168.9.93 | 4 | 16 | 40 | 200+200 | KubeSphere/k8s-master/k8s-worker/Ceph |
storage-node-0 | 192.168.9.95 | 2 | 8 | 40 | 200+200 | ElasticSearch/GlusterFS |
storage-node-0 | 192.168.9.96 | 2 | 8 | 40 | 200+200 | ElasticSearch/GlusterFS |
storage-node-0 | 192.168.9.97 | 2 | 8 | 40 | 200+200 | ElasticSearch/GlusterFS |
harbor | 192.168.9.89 | 2 | 8 | 40 | 200 | Harbor |
合计 | 8 | 22 | 84 | 320 | 2800 |
演示环境涉及软件版本信息
- 操作系统:CentOS-7.9-x86_64
- Ansible:2.8.20
- KubeSphere:3.3.0
- Kubernetes:v1.24.1
- Rook:v1.9.7
- Ceph: v16.2.9
- GlusterFS:9.5.1
- ElasticSearch:7.17.5
- Harbor:2.5.1
- RabbitMQ:3.9.22
- RabbitMQ Cluster Operator:1.14.0
简介
RabbitMQ 单节点如何在 K8s 集群上部署?RabbitMQ 集群如何在 K8s 集群上部署?60分钟带你实战入门。
单节点 RabbitMQ 部署
思路梳理
- StatefulSet
- Headless Service:内部服务用
- External Service:外部管理用
- Secrets:管理用户名和密码
- Image:DockerHub 官方提供的 rabbitmq:3.9.22-management(带 management 插件)
准备离线镜像
此过程为可选项,离线内网环境可用,如果不配置内网镜像,后续的资源配置清单中注意更改容器的 image 为默认值。
在一台能同时访问互联网和内网 Harbor 仓库的服务器上进行下面的操作。
- 下载镜像
docker pull rabbitmq:3.9.22-management
- 重新打 tag
docker tag rabbitmq:3.9.22-management registry.zdevops.com.cn/library/rabbitmq:3.9.22-management
- 推送到私有镜像仓库
docker push registry.zdevops.com.cn/library/rabbitmq:3.9.22-management
- 清理临时镜像
docker rmi rabbitmq:3.9.22-management
docker rmi registry.zdevops.com.cn/library/rabbitmq:3.9.22-management
资源配置清单
- rabbitmq-secret.yaml
---
kind: Secret
apiVersion: v1
metadata:
name: rabbitmq-secret
namespace: zdevops
data:
pass: UEA4OHcwcmQ=
user: YWRtaW4=
type: Opaque
- rabbitmq-sts.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rabbitmq
namespace: zdevops
labels:
app: rabbitmq
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
template:
metadata:
creationTimestamp: null
labels:
app: rabbitmq
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
containers:
- name: rabbitmq
image: 'registry.zdevops.com.cn/library/rabbitmq:3.9.22-management'
ports:
- name: tcp-5672
containerPort: 5672
protocol: TCP
- name: http-15672
containerPort: 15672
protocol: TCP
env:
- name: RABBITMQ_DEFAULT_USER
valueFrom:
secretKeyRef:
name: rabbitmq-secret
key: user
- name: RABBITMQ_DEFAULT_PASS
valueFrom:
secretKeyRef:
name: rabbitmq-secret
key: pass
resources:
limits:
cpu: '2'
memory: 4000Mi
requests:
cpu: 100m
memory: 500Mi
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
serviceName: rabbitmq-headless
---
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-headless
namespace: zdevops
labels:
app: rabbitmq
spec:
ports:
- name: tcp-rabbitmq-5672
protocol: TCP
port: 5672
targetPort: 5672
selector:
app: rabbitmq
clusterIP: None
type: ClusterIP
- rabbitmq-external.yaml
---
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-external
namespace: zdevops
labels:
app: rabbitmq-external
spec:
ports:
- name: http-rabbitmq-external
protocol: TCP
port: 15672
targetPort: 15672
nodePort: 31672
selector:
app: rabbitmq
type: NodePort
GitOps
在运维开发服务器上操作
# 在已有代码仓库创建 rabbitmq/single 目录
[root@zdevops-master k8s-yaml]# mkdir -p rabbitmq/single
# 编辑资源配置清单
[root@zdevops-master k8s-yaml]# vi rabbitmq/single/rabbitmq-secret.yaml
[root@zdevops-master k8s-yaml]# vi rabbitmq/single/rabbitmq-sts.yaml
[root@zdevops-master k8s-yaml]# vi rabbitmq/single/rabbitmq-external.yaml
# 提交 Git
[root@zdevops-master k8s-yaml]# git add rabbitmq
[root@zdevops-master k8s-yaml]# git commit -am '添加rabbitmq 单节点资源配置清单'
[root@zdevops-master k8s-yaml]# git push
部署资源
在运维管理服务器上操作
- 更新镜像仓库代码
[root@zdevops-master k8s-yaml]# git pull
- 部署资源
[root@zdevops-master k8s-yaml]# kubectl apply -f rabbitmq/single/
验证
- Secret
[root@zdevops-master k8s-yaml]# kubectl get secret -n zdevops
NAME TYPE DATA AGE
rabbitmq-secret Opaque 2 8s
- StatefulSet
[root@zdevops-master k8s-yaml]# kubectl get sts -o wide -n zdevops
NAME READY AGE CONTAINERS IMAGES
rabbitmq 1/1 25s rabbitmq registry.zdevops.com.cn/library/rabbitmq:3.9.22-management
- Pods
[root@zdevops-master k8s-yaml]# kubectl get pods -o wide -n zdevops
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rabbitmq-0 1/1 Running 0 26s 10.233.87.13 ks-k8s-master-1 <none> <none>
- Service
[root@zdevops-master k8s-yaml]# kubectl get svc -o wide -n zdevops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
rabbitmq-external NodePort 10.233.4.224 <none> 15672:31672/TCP 36s app=rabbitmq
rabbitmq-headless ClusterIP None <none> 5672/TCP 36s app=rabbitmq
- 图形化管理界面
清理资源
- 清理 StatefulSet
[root@zdevops-master k8s-yaml]# kubectl delete sts rabbitmq -n zdevops
- 清理服务
[root@zdevops-master k8s-yaml]# kubectl delete svc rabbitmq-external rabbitmq-headless -n zdevops
集群模式 RabbitMQ 部署
思路梳理
使用官方提供的 RabbitMQ Cluster Operator for Kubernetes。
Open source RabbitMQ Cluster Kubernetes Operator by VMware。
官方文档快速部署
官方提供了快速部署的例子,只需要两步,这里我们仅作参考,后面我们参考内网离线镜像部署的方案。
- 部署 RabbitMQ Cluster Operator
kubectl apply -f https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
- 部署 RabbitMQ Cluster
kubectl apply -f https://raw.githubusercontent.com/rabbitmq/cluster-operator/main/docs/examples/hello-world/rabbitmq.yaml
准备离线镜像
此过程为可选项,离线内网环境可用,如果不配置内网镜像,后续的资源配置清单中注意更改容器的 image 为默认值。
在一台能同时访问互联网和内网 Harbor 仓库的服务器上进行下面的操作。
- 在 Harbor 中创建项目
curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" https://registry.zdevops.com.cn/api/v2.0/projects -d '{ "project_name": "rabbitmqoperator", "public": true}'
- 下载镜像
docker pull rabbitmqoperator/cluster-operator:1.14.0
- 重新打 tag
docker tag rabbitmqoperator/cluster-operator:1.14.0 registry.zdevops.com.cn/rabbitmqoperator/cluster-operator:1.14.0
- 推送到私有镜像仓库
docker push registry.zdevops.com.cn/rabbitmqoperator/cluster-operator:1.14.0
- 清理临时镜像
docker rmi rabbitmqoperator/cluster-operator:1.14.0
docker rmi registry.zdevops.com.cn/rabbitmqoperator/cluster-operator:1.14.0
资源配置清单
- 通过官网获取 RabbitMQ Cluster Operator 部署资源配置清单「cluster-operator.yml」
wget https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
- 修改 RabbitMQ Cluster Operator image 为内网镜像
sed -i 's#rabbitmqoperator#registry.zdevops.com.cn/rabbitmqoperator#g' cluster-operator.yml
- RabbitMQ Cluster 部署资源清单「rabbitmq-cluster.yaml」
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
namespace: zdevops
name: rabbitmq-cluster
labels:
app: rabbitmq-cluster
spec:
replicas: 3
image: registry.zdevops.com.cn/library/rabbitmq:3.9.22-management
resources:
limits:
cpu: 2
memory: 4Gi
requests:
cpu: 100m
memory: 500Mi
rabbitmq:
additionalConfig: |
default_user=admin
default_pass=P@88w0rd
更多配置参数和配置示例,请参考 官方文档
- 管理页面的外部访问服务 rabbitmq-cluster-external.yaml
---
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-cluster-external
namespace: zdevops
labels:
app: rabbitmq-cluster-external
spec:
ports:
- name: management
protocol: TCP
port: 15672
targetPort: 15672
nodePort: 31672
selector:
app.kubernetes.io/name: rabbitmq-cluster
type: NodePort
GitOps
在运维开发服务器上操作
# 在已有代码仓库创建 rabbitmq/cluster 目录
[root@zdevops-master k8s-yaml]# mkdir -p rabbitmq/cluster
# 编辑资源配置清单
[root@zdevops-master k8s-yaml]# vi rabbitmq/cluster/cluster-operator.yml
[root@zdevops-master k8s-yaml]# vi rabbitmq/cluster/rabbitmq-cluster.yaml
[root@zdevops-master k8s-yaml]# vi rabbitmq/cluster/rabbitmq-cluster-external.yaml
# 提交 Git
[root@zdevops-master k8s-yaml]# git add rabbitmq/cluster
[root@zdevops-master k8s-yaml]# git commit -am '添加 rabbitmq 集群模式部署资源配置清单'
[root@zdevops-master k8s-yaml]# git push
部署资源
在运维管理服务器上操作
- `更新镜像仓库代码
[root@zdevops-master k8s-yaml]# git pull
- 部署 RabbitMQ Cluster Operator
[root@zdevops-master k8s-yaml]# kubectl apply -f rabbitmq/cluster/cluster-operator.yml
- 部署 RabbitMQ Cluster
[root@zdevops-master k8s-yaml]# kubectl apply -f rabbitmq/cluster/rabbitmq-cluster.yaml
- 部署管理页面外部访问服务
[root@zdevops-master k8s-yaml]# kubectl apply -f rabbitmq/cluster/rabbitmq-cluster-external.yaml
验证
- RabbitMQ Cluster Operator Deployment
[root@zdevops-master k8s-yaml]# kubectl get deployments -n rabbitmq-system -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
rabbitmq-cluster-operator 1/1 1 1 107m operator registry.zdevops.com.cn/rabbitmqoperator/cluster-operator:1.14.0 app.kubernetes.io/name=rabbitmq-cluster-operator
- RabbitmqClusters
[root@zdevops-master k8s-yaml]# kubectl get rabbitmqclusters -n zdevops
NAME ALLREPLICASREADY RECONCILESUCCESS AGE
rabbitmq-cluster False Unknown 23s
- StatefulSet
[root@zdevops-master k8s-yaml]# kubectl get sts -o wide -n zdevops
NAME READY AGE CONTAINERS IMAGES
rabbitmq-cluster-server 3/3 74s rabbitmq registry.zdevops.com.cn/library/rabbitmq:3.9.22-management
- Pods
[root@zdevops-master k8s-yaml]# kubectl get pods -o wide -n zdevops
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rabbitmq-cluster-server-0 1/1 Running 0 84s 10.233.116.26 ks-k8s-master-2 <none> <none>
rabbitmq-cluster-server-1 1/1 Running 0 83s 10.233.117.28 ks-k8s-master-0 <none> <none>
rabbitmq-cluster-server-2 1/1 Running 0 82s 10.233.87.31 ks-k8s-master-1 <none> <none>
- Services
[root@zdevops-master k8s-yaml]# kubectl get svc -n zdevops -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
rabbitmq-cluster ClusterIP 10.233.56.153 <none> 15692/TCP,5672/TCP,15672/TCP 107s app.kubernetes.io/name=rabbitmq-cluster
rabbitmq-cluster-external NodePort 10.233.63.84 <none> 15672:31672/TCP 74m app.kubernetes.io/name=rabbitmq-cluster
rabbitmq-cluster-nodes ClusterIP None <none> 4369/TCP,25672/TCP 107s app.kubernetes.io/name=rabbitmq-cluster
- 图形化管理界面
从管理界面中可以看到一个三节点的集群
清理资源
- 清理 RabbitmqClusters
[root@zdevops-master k8s-yaml]# kubectl delete rabbitmqclusters rabbitmq-cluster -n zdevops
- 清理管理页面外部服务
[root@zdevops-master k8s-yaml]# kubectl delete svc rabbitmq-cluster-external -n zdevops
结束语
本系列文档是我在云原生技术领域的学习和运维实践的手记,用输出倒逼输入是一种高效的学习方法,能够快速积累经验和提高技术,只有把学到的知识写出来并能够让其他人理解,才能说明真正掌握了这项知识。
本系列文档内容涵盖 (但不限于) 以下技术领域:
- KubeSphere
- Kubernetes
- Ansible
- 自动化运维
- CNCF 技术栈
如果你喜欢本文,请分享给你的小伙伴!
Get 文档
- Github:https://github.com/devops/z-notes
- Gitee:https://gitee.com/zdevops/z-notes
- 知乎:https://www.zhihu.com/people/zdevops/
Get 代码
Get 视频 B 站
本文由博客一文多发平台 OpenWrite 发布!
在 K8s 集群上部署 RabbitMQ 实战的更多相关文章
- Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务
前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...
- 使用Kubeadm创建k8s集群之部署规划(三十)
前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...
- K8S集群安装部署
K8S集群安装部署 参考地址:https://www.cnblogs.com/xkops/p/6169034.html 1. 确保系统已经安装epel-release源 # yum -y inst ...
- k8s集群中部署prometheus server
1.概述 本文档主要介绍如何在k8s集群中部署prometheus server用来作为监控的数据采集服务器,这样做可以很方便的对k8s集群中的指标.pod的.节点的指标进行采集和监控. 2.下载镜像 ...
- 在 Kubernetes 集群上部署 VSCode
在 Kubernetes 集群上部署 VSCode Visual Studio Code Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,适用于 Win ...
- Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14
目录 一.模块概览 二.系统环境 三.安装istio 3.1 使用 Istioctl 安装 3.2 使用 Istio Operator 安装 3.3 生产部署情况如何? 3.4 平台安装指南 四.Ge ...
- 终于解决 k8s 集群中部署 nodelocaldns 的问题
自从开始在 kubernetes 集群中部署 nodelocaldns 以提高 dns 解析性能以来,一直被一个问题困扰,只要一部署 nodelocaldns ,在 coredns 中添加的 rewr ...
- 基于GPU 显卡在k8s 集群上实现hpa 功能
前言 Kubernetes 支持HPA模块进行容器伸缩,默认支持CPU和内存等指标.原生的HPA基于Heapster,不支持GPU指标的伸缩,但是支持通过CustomMetrics的方式进行HPA指标 ...
- 超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
在2018年年初,Jenkins X首次发布,它由Apache Groovy语言的创建者Jame Strachan创建.Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins ...
- 从认证到调度,K8s 集群上运行的小程序到底经历了什么?
导读:不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了. 前言 现在我们上微博.或者网购,操作的其实不是眼前这台设备,而是一个又一个集群.通常 ...
随机推荐
- python语言下的迷宫游戏的实现猜想
由于本人是研究AI的,尤其是AI的强化学习方向,有时候就会对一些小游戏环境的实现有几分兴趣,因为刚看了有关reinforcement learning解决maze游戏的论文,于是就突发奇想的对这个ma ...
- 网络文件系统nfs服务端配置客户端权限时的demo例子
参考: https://www.cnblogs.com/devilmaycry812839668/p/15127755.html 由上面的参考资料我们可以知道在nfs服务端进行配置时对于客户端的权限设 ...
- SMU 2024 spring 天梯赛1
SMU 2024 spring 天梯赛1 7-1 种钻石 - SMU 2024 spring 天梯赛1 (pintia.cn) #include <bits/stdc++.h> #defi ...
- springcloud集成grpc(二)
码云地址:https://gitee.com/lpxs/lp-springcloud.git 有问题可以多沟通:136358344@qq.com. 上一章内容介绍了springboot2集成net.d ...
- [nRF24L01+] 5. 数据和控制接口
5. 数据和控制接口 5.1. 特点 管脚: IRQ(该信号为低电平有效信号,由三个可屏蔽中断源控制) CE(此信号为高电平,用于在RX或TX模式下激活芯片) CSN(SPI信号) SCK(SPI信号 ...
- 【CMake系列】05-静态库与动态库编译
在各种项目类型中,可能我们的项目就是一个 库 项目,向其他人提供 我们开发好的 库 (windows下的 dll /lib : linux下的 .a / .so):有时候在一个项目中,我们对部分功能 ...
- Kubernetes-14:持久化存储PV、PVC和StatefulSet介绍及使用
PV.PVC简介 PersistentVolume(PV) 是由管理员设置的存储,它是集群的一部分,就像节点是集群中的资源一样,PV也是集群中的资源.PV是Volume之类的卷插件,但具有独立于使用P ...
- SQL Server使用脚本实现自动备份
因服务器安装的SQL Server版本不支持自动定时备份,需自行实现,大概思路为: 创建备份数据库的脚本 创建批处理脚本执行步骤一中的脚本 创建Windows定时任务执行步骤二中的脚本 1. 创建SQ ...
- DB\redis\zookeeper分布式锁设计
redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...
- Angular 18+ 高级教程 – Memory leak, unsubscribe, onDestroy
何谓 Memory Leak? Angular 是 SPA (Single-page application) 框架,用来开发 SPA. SPA 最大的特点就是它不刷新页面,不刷新就容易造成 memo ...