前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 集群部署 RabbitMQ + exporter (单节点)

Kubernetes 集群部署 RabbitMQ + exporter (单节点)

作者头像
高楼Zee
发布2021-10-27 11:15:12
1.6K0
发布2021-10-27 11:15:12
举报
文章被收录于专栏:7DGroup7DGroup
「系统环境:」
  • RabbitMQ 版本:3.7.15-management
  • Kubernetes 版本:1.19.5
  • 操作系统版本:CentOS 7.8

一、简介

RabbitMQ 是我们常用的消息的中间件,在项目开发、测试、部署到生成环境时,经常需要部署一套 RabbitMQ 来对数据进应用解耦、异步、流量削锋、数据分发、错峰流控、日志收集等等。这里介绍下如何在 Kubernetes 环境中部署用于开发、测试的环境的 RabbitMQ 消息中间件,当然,部署的是单节点模式,并非用于生产环境的集群模式。单节点的 RabbitMQ 部署简单,且配置存活探针,能保证快速检测 RabbitMQ 是否可用,当不可用时快速进行重启。

二、数据存储

Kubernetes 部署的应用一般都是无状态应用,部署后下次重启很可能会漂移到不同节点上,所以不能使用节点上的本地存储,而是网络存储对应用数据持久化,PV 和 PVC 是 Kubernetes 用于与存储关联的资源,可与不同的存储驱动建立连接,存储应用数据,所以接下来我们要创建 Kubernetes PV、PVC 资源。

1、创建 PV

PV 支持多种存储驱动,不同存储驱动的 PV 配置方式是不同的,需要根据你的存储系统来配置 PV 参数。这里用的是 NFS 存储(共享网络文件存储系统),直接使用前面创建的 StorageClass 即可

具体参考:

  • Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件

2、创建 PVC 绑定存储空间

「rabbitmq-storage.yaml:」

代码语言:javascript
复制
## PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: rabbitmq
spec:
  storageClassName: nfs-storage  #指定StorageClass
  resources:
    requests:
      storage: 5Gi #设置 pvc 存储资源大小
  accessModes:
    - ReadWriteOnce

3、通过 Kubectl 工具部署 PV、PVC

通过 kubectl 工具部署 Kubernetes PV、PVC 资源,命令如下:

代码语言:javascript
复制
$ kubectl create -f rabbitmq-storage.yaml

三、Kubernetes 部署 RabbitMQ

1、rabbitmq_exporter

rabbitmq 没有自带 /metrics 接口供 Prometheus 使用,在这种情况下,我们就需要利用 exporter 服务来为 Prometheus 提供指标数据了。Prometheus 官方为许多应用就提供了对应的 exporter 应用,也有许多第三方的实现,我们可以前往官方网站进行查看:

  • https://prometheus.io/docs/instrumenting/exporters/。

这里我们选择官方的 rabbitmq_exporter:

  • https://github.com/kbudde/rabbitmq_exporter

2、构建 sidecar

这里通过 rabbitmq_exporter 的服务来监控 rabbitmq 服务,我们以 sidecar 的形式和主应用部署在同一个 Pod 中,比如我们这里来部署一个 rabbitmq,并用 rabbitmq_exporter 的方式来采集监控数据供 Prometheus 使用。

创建用于 Kubernetes Deployment 来配置部署 RabbitMQ 的参数:

  • 配置 RabbitMQ 的镜像地址、名称、版本号;
  • 配置其 CPU 与 Memory 资源的占用;
  • 配置探针监测应用可用性;
  • 配置 Volume 挂载之前创建的 PV、PVC资源等等;
  • 构建 sidecar 挂载 rabbitmq_exporter 。

「redis-deploy.yaml:」

代码语言:javascript
复制
## Service
apiVersion: v1
kind: Service
metadata:
  name: cloud-rabbitmq
  labels:
    app: rabbitmq
spec:
  selector:
    app: rabbitmq
spec:
  type: NodePort
  ports:
    - name: rabbitmq
      port: 5672
      targetPort: 5672
    - name: rabbitmq-management
      port: 15672
      targetPort: 15672
      nodePort: 30340
    - name: prom
      port: 9419
      targetPort: 9419
---
## Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud-rabbitmq
  labels:
    app: rabbitmq
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9419"
      labels:
        app: rabbitmq
    spec:
      containers:
        - name: rabbitmq
          image: rabbitmq:3.7.15-management
          ports:
            - containerPort: 5672
            - containerPort: 15672
          resources:
            limits:
              cpu: 500m
              memory: 512Mi
            requests:
              cpu: 500m
              memory: 512Mi
          livenessProbe:
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3
            tcpSocket:
              port: 5672
          readinessProbe:
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3
            tcpSocket:
              port: 5672
          volumeMounts:
            - name: data
              mountPath: /var/lib/rabbitmq/
            - name: localtime
              readOnly: true
              mountPath: /etc/localtime
        - name: rabbitmq-exporter
          image: kbudde/rabbitmq-exporter:latest
          env:
            - name: RABBIT_URL
              value: "http://cloud-rabbitmq:15672" 
            - name: RABBIT_USER
              value: "guest"  
            - name: RABBIT_PASSWORD
              value: "guest"  
            - name: PUBLISH_PORT
              value: "9419"         
          resources:
            requests:
              cpu: 100m
              memory: 100Mi
          ports:
            - containerPort: 9419
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: rabbitmq
        - name: localtime
          hostPath:
            type: File
            path: /etc/localtime

「参数简介:」

  • ports:配置镜像映射端口。
  • resources:配置 CPU、Memory 资源限制,可以通过配置该值来配置 Pod 的 QoS 级别。
  • livenessProbe:配置存活探针,定时检测 RabbitMQ 应用运行状态,如果检测到 RabbitMQ 挂掉将进行重启操作。
  • readinessProbe:配置就绪探针,定时检测 RabbitMQ 应用启动状态,如果启动成功将允许流量涌入,启动失败将进行重启操作。
  • command:探针执行探测时执行的探测命令。
  • volumeMounts:存储卷挂载配置,用于镜像内存储的挂载配置,与 volumes 中对于的 name 进行绑定。
  • volumes:存储卷配置,可配置使用 pvc、hostPath、emptyDir、nfs 等存储,需要配置 name 值与 -VolumeMounts 进行绑定。

3、通过 Kubectl 工具部署

通过 kubectl 工具部署 Deployment 来创建 RabbitMQ ,命令如下:

代码语言:javascript
复制
$ kubectl create -f rabbitmq-deploy.yaml

四、测试是否能够正常使用

在浏览器打开:http://nodeip:30340/

输入默认的密码 guest/guest,进入控制台首页:

在这里插入图片描述

可以看到,已经成功连接并进入 RabbitMQ 控制台 ,说明 RabbitMQ 能正常使用。

五、测试获取采集数据是否正常

创建完成后,我们可以看到 rabbitmq 的 Pod 里面包含有两个容器:

代码语言:javascript
复制
$ kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
cloud-rabbitmq-559c99cffd-22m67         2/2     Running   2          42h

$ kubectl get svc
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
cloud-rabbitmq         ClusterIP   10.96.67.143    <none>        5672/TCP,15672/TCP,9419/TCP           3d7h

我们可以通过 9121 端口来校验是否能够采集到数据:

代码语言:javascript
复制
$ curl 10.96.67.143:9419/metrics
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.938e-05
go_gc_duration_seconds{quantile="0.25"} 3.0385e-05
go_gc_duration_seconds{quantile="0.5"} 5.2105e-05
go_gc_duration_seconds{quantile="0.75"} 8.8354e-05
go_gc_duration_seconds{quantile="1"} 0.00257348
go_gc_duration_seconds_sum 0.139414322
go_gc_duration_seconds_count 1358
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 14
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version="go1.14.3"} 1

......

源码地址:

  • https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-rabbitmq-exporter
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 7DGroup 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、数据存储
    • 1、创建 PV
      • 2、创建 PVC 绑定存储空间
        • 3、通过 Kubectl 工具部署 PV、PVC
        • 三、Kubernetes 部署 RabbitMQ
          • 1、rabbitmq_exporter
            • 2、构建 sidecar
              • 3、通过 Kubectl 工具部署
              • 四、测试是否能够正常使用
              • 五、测试获取采集数据是否正常
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档