最近突然玩起来RabbitMQ,做了个小爬虫,但K8S的node经常会出现不稳定的情况,然后我的K8S的node2挂了,为了快速恢复,我按照我之前文章的方式,快速生成了一个node3,马上给 用上了,紧接着发现原来部署在node2上的RabbitMQ也挂掉了,不得已scale到0,再scale到1,自动重新部署到node3上。

结果就出问题了。。。启动一看,RabbitMQ的队列都没了。。。。

于是一顿查,说要durable参数为true,才能队列持久化,写数据的时候要properties.DeliveryMode = 2;,才能数据持久化,立刻修改程序,一顿操作猛如虎:

categoryChannel.QueueDeclare(queue: "category", true, false, false, null);
var properties = categoryChannel.CreateBasicProperties();
properties.DeliveryMode = 2;

 立刻发布代码看看,结果发现原来还是二百五。。。

重启RabbitMQ,队列还是消失!

没办法,继续百度,这把加上K8S的关键字,结果百度大神给关注点永远放在了RabbitMQ队列消失上,K8S完全被忽略了。

还是没办法,换吧,换必应大神,国内版,搜索,结果跟百度一模一样。再换必应国际版,还是一样。

继续,发挥百折不挠的精神,必应大神国际版上搜索英文:

kubernetes rabbitmq queue disappeared after reboot

这把出结果了,第二篇点进去看,一模一样的问题:

 下面的各个都是大神,马上有一个大神说了,最快的方法:

 两篇的重点都是说RabbitMQ重启后hostname变了,要保持同样的hostname的名字才行,否则就要不得不部署cluster环境了。

于是按照第二个,固定hostname,测试,立马好用,马上成猛虎!

顺便贴出来我的yaml文件,超级简单,全家桶

##创建PV
# 注意更换存储方式
---
apiVersion: v1
kind: PersistentVolume
metadata:
 name: rabbitmq-project-pv
 labels:
   pv: rabbitmq-project-pv
spec:
 capacity:
   storage: 10Gi
 accessModes:
   - ReadWriteMany
 persistentVolumeReclaimPolicy: Retain
 nfs:
   path: /nfs/data/rabbitmq/pv
   server: 192.168.137.201

##创建pvc
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: rabbitmq-project-pvc
spec:
 accessModes:
   - ReadWriteMany
 resources:
   requests:
     storage: 10Gi
 selector:
   matchLabels:
     pv: rabbitmq-project-pv



## 部署rabbitmq
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: rabbitmq-project
 labels:
   name: rabbitmq-project
spec:
 replicas: 1
 selector:
    matchLabels:
        name: rabbitmq-project
 template:
   metadata:
     labels: 
      name: rabbitmq-project
   spec:
     containers:
     - name: rabbitmq-project
       image: rabbitmq:3.8-management
       volumeMounts:
       - mountPath: /var/lib/rabbitmq
         name: rabbitmq-project
       ports:
       - containerPort: 4369
       - containerPort: 5671
       - containerPort: 5672
       - containerPort: 15672
       - containerPort: 25672     
     volumes:
     - name: rabbitmq-project
       persistentVolumeClaim:
         claimName: rabbitmq-project-pvc
     hostname: rabbitmq
     

##创建Service
---
apiVersion: v1
kind: Service
metadata:
 name: rabbitmq-project
 labels: 
  name: rabbitmq-project
spec:
 type: NodePort
 ports:
 - port: 5672
   protocol: TCP
   targetPort: 5672
   name: rabbitmq-project-5672
   nodePort: 30010
 - port: 15672
   protocol: TCP
   targetPort: 15672
   name: rabbitmq-project-15672
   nodePort: 30009
 selector:
   name: rabbitmq-project

参考:

Make RabbitMQ durable/persistent queues survive Kubernetes pod restart - Stack Overflowicon-default.png?t=L892https://stackoverflow.com/questions/56709621/make-rabbitmq-durable-persistent-queues-survive-kubernetes-pod-restart

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐