k8s摆设rabbitmq集群

[复制链接]
发表于 2024-11-23 03:48:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1 摆设集群

1.1 安装

  1. # 创建一个中间件的命名空间
  2. kubectl create namespace middleware
  3. # 创建ConfigMap,包含RabbitMQ的配置文件内容
  4. kubectl apply -f rabbitmq-configmap.yaml
  5. # 配置用于存储RabbitMQ数据的PersistentVolume(PV)和PersistentVolumeClaim(PVC)。这可以确保RabbitMQ集群的数据在节点故障时不会丢失。
  6. kubectl apply -f rabbitmq-persistentvolume.yaml  
  7. kubectl apply -f rabbitmq-persistentvolumeclaim.yaml
  8. # StatefulSet可以确保每个实例都有唯一的标识和稳定的网络标识符
  9. kubectl apply -f rabbitmq-statefulset.yaml
  10. # 创建service
  11. kubectl apply -f rabbitmq-service.yaml
复制代码
1.2 rabbitmq-configmap

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: rabbitmq-config
  5.   namespace: middleware
  6. data:
  7.   enabled_plugins: |
  8.     [rabbitmq_management,rabbitmq_peer_discovery_k8s,rabbitmq_delayed_message_exchange].
  9.   rabbitmq.conf: |
  10.     cluster_formation.peer_discovery_backend  = rabbit_peer_discovery_k8s
  11.     cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
  12.     cluster_formation.k8s.address_type = hostname
  13.     cluster_formation.node_cleanup.interval = 10
  14.     cluster_formation.node_cleanup.only_log_warning = true
  15.     cluster_partition_handling = autoheal
  16.     queue_master_locator=min-masters
  17.     loopback_users.guest = false
  18.     cluster_formation.randomized_startup_delay_range.min = 0
  19.     cluster_formation.randomized_startup_delay_range.max = 2
  20.     # 必须设置service_name,否则Pod无法正常启动,这里设置后可以不设置statefulset下env中的K8S_SERVICE_NAME变量
  21.     cluster_formation.k8s.service_name = rabbitmq-headless
  22.     # 必须设置hostname_suffix,否则节点不能成为集群
  23.     cluster_formation.k8s.hostname_suffix = .rabbitmq-headless.middleware.svc.cluster.local
  24.     # 内存上限
  25.     vm_memory_high_watermark.absolute = 1.6GB
  26.     # 硬盘上限
  27.     disk_free_limit.absolute = 2G
复制代码
1.3 rabbitmq-headless

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: rabbitmq-headless
  5.   namespace: middleware
  6. spec:
  7.   clusterIP: None
  8.   ports:
  9.   - name: amqp
  10.     port: 5672
  11.   - name: management
  12.     port: 15672
  13.   - name: cluster
  14.     port: 25672
  15.   selector:
  16.     app: rabbitmq
复制代码
1.4 rabbitmq-log-pvc

这里的managed-nfs-storage沿用了nacos集群的摆设。
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: rabbitmq-log-pvc
  5.   namespace: middleware
  6. spec:
  7.   accessModes:
  8.     - ReadWriteMany
  9.   resources:
  10.     requests:
  11.       storage: 5Gi
  12.   storageClassName: managed-nfs-storage
复制代码
1.5 rabbitmq-persistentvolume

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: rabbitmq-pv
  5.   annotations:
  6.     pv.kubernetes.io/provisioned-by: fuseim.pri/ifs
  7. spec:
  8.   capacity:
  9.     storage: 10Gi
  10.   accessModes:
  11.     - ReadWriteMany
  12.   nfs:
  13.     server: 10.101.12.95
  14.     path: /data/k8s_storage/rabbitmq
  15.   persistentVolumeReclaimPolicy: Retain
  16.   storageClassName: managed-nfs-storage
复制代码
1.6 rabbitmq-persistentvolumeclaim

  1. # PersistentVolumeClaim示例  
  2. apiVersion: v1  
  3. kind: PersistentVolumeClaim  
  4. metadata:  
  5.   name: rabbitmq-pvc  
  6.   namespace: middleware  
  7. spec:  
  8.   accessModes:  
  9.     - ReadWriteMany  
  10.   resources:  
  11.     requests:  
  12.       storage: 10Gi  
  13.   storageClassName: managed-nfs-storage
复制代码
1.7 rabbitmq-service

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: rabbitmq-web-service
  5.   namespace: middleware
  6. spec:
  7.   type: NodePort
  8.   ports:
  9.   - name: http
  10.     port: 15672
  11.     targetPort: 15672
  12.     nodePort: 31567
  13.   selector:
  14.     app: rabbitmq
复制代码
1.8 rabbitmq-statefulset

  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4.   name: rabbitmq
  5.   namespace: middleware
  6. spec:
  7.   replicas: 3
  8.   serviceName: rabbitmq-headless
  9.   selector:
  10.     matchLabels:
  11.       app: rabbitmq
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: rabbitmq
  16.     spec:
  17.       containers:
  18.       - name: rabbitmq
  19.         image: rabbitmq:3.8.17-management
  20.         ports:
  21.         - containerPort: 5672
  22.         - containerPort: 15672
  23.         volumeMounts:
  24.         - name: data
  25.           mountPath: /var/lib/rabbitmq
  26.         - name: conf
  27.           mountPath: /etc/rabbitmq
  28.         - name: log
  29.           mountPath: /var/log/rabbitmq
  30.         env:
  31.         - name: RABBITMQ_NODENAME
  32.           valueFrom:
  33.             fieldRef:
  34.               fieldPath: metadata.name
  35.         - name: RABBITMQ_ERLANG_COOKIE
  36.           value: "nrB35tmJx5sfE3EaaYTMW7S8DxpajMrP"
  37.         - name: RABBITMQ_LOG_BASE
  38.           value: "/var/log/rabbitmq"
  39.       volumes:
  40.       - name: data
  41.         persistentVolumeClaim:
  42.           claimName: rabbitmq-pvc
  43.       - name: conf
  44.         configMap:
  45.           name: rabbitmq-config
  46.       - name: log
  47.         persistentVolumeClaim:
  48.           claimName: rabbitmq-log-pvc
复制代码
2 问题处理

2.1 pvc创建失败

  1. [root@master1 rabbitmq]# kubectl get pvc -n middleware
  2. NAME                       STATUS    VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  3. rabbitmq-data-rabbitmq-0   Pending                                                          15m
  4. rabbitmq-pvc               Bound     rabbitmq-pv   5Gi        RWO            standard       15m
复制代码
查看存储StorageClass的名称,就知道了创建pv和pvc中storageClassName应该为managed-nfs-storage
  1. NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  2. managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  3h7m
复制代码
更改rabbitmq-persistentvolume.yaml和rabbitmq-persistentvolumeclaim.yaml之后
  1. # 查看有没有无效的pvc,与namespace有关
  2. kubectl get pvc -n middleware
  3. # 删除pvc,使得pvc与pv解
  4. kubectl delete pvc rabbitmq-data-rabbitmq-0 -n middleware
  5. kubectl delete pvc rabbitmq-pvc -n middleware
  6. #
  7. kubectl get pv
  8. # 删除无效的pv,pv被绑定,需要先删除pvc,pv与namespace无关
  9. kubectl delete pv rabbitmq-pv
复制代码
  1. cd /appdata/download/rabbitmq
  2. kubectl apply -f rabbitmq-persistentvolume.yaml  
  3. kubectl apply -f rabbitmq-persistentvolumeclaim.yaml
  4. # StatefulSet可以确保每个实例都有唯一的标识和稳定的网络标识符
  5. kubectl apply -f rabbitmq-statefulset.yaml
  6. # 创建service
  7. kubectl apply -f rabbitmq-service.yaml
复制代码
执行完,需要删除之前的pod,就可以自动创建了。
  1. 2024-07-16 06:47:18.299 [info] <0.1754.0> Closing all channels from connection '10.42.7.3:33078 -> 10.42.6.3:5672' because it has been closed
  2. 2024-07-16 06:49:17.462 [info] <0.1783.0> accepting AMQP connection <0.1783.0> (10.42.7.3:33480 -> 10.42.6.3:5672)
  3. 2024-07-16 06:49:17.462 [error] <0.1783.0> closing AMQP connection <0.1783.0> (10.42.7.3:33480 -> 10.42.6.3:5672):
  4. {bad_header,<<"GET / HT">>}
复制代码
ss -tuln 或 netstat -tul无法执行
  1. kubectl run ss-checker --rm -it --image=ubuntu --restart=Never -- sh -c 'apt-get update && apt-get install -y iproute2 && ss -tuln'
  2. kubectl run ss-checker --rm=true -it --image=alpine --restart=Never -- /bin/sh -c 'apk add --no-cache iproute2 && ss -tuln'
复制代码
查看镜像的版本,rabbitmq用的ubuntu,而nacos用的是centos7
  1. [root@master1 rabbitmq]# kubectl exec -it rabbitmq-0 -n middleware  -- cat /etc/os-release
  2. NAME="Ubuntu"
  3. VERSION="20.04.2 LTS (Focal Fossa)"
  4. ID=ubuntu
  5. ID_LIKE=debian
  6. PRETTY_NAME="Ubuntu 20.04.2 LTS"
  7. VERSION_ID="20.04"
  8. HOME_URL="https://www.ubuntu.com/"
  9. SUPPORT_URL="https://help.ubuntu.com/"
  10. BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
  11. PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
  12. VERSION_CODENAME=focal
  13. UBUNTU_CODENAME=focal
复制代码
由于rabbitmq本身不能查看端口,于是需要创建临时的容器,来排查问题。
  1. # 创建一个临时的 Ubuntu Pod
  2. kubectl run ss-checker --rm -it --image=ubuntu --restart=Never -- sh -c 'apt-get update && apt-get install -y iproute2'
  3. # 等待 Pod 准备好
  4. kubectl wait --for=condition=Ready pod/ss-checker
  5. # 进入临时 Pod
  6. kubectl exec -it ss-checker -- /bin/bash
  7. # 在临时 Pod 内部安装 ss
  8. apt-get update && apt-get install -y iproute2
  9. # 使用 ss 命令检查服务 Pod 的端口状态
  10. ss -tuln | grep <service-pod-name-or-ip>:<port>
  11. # 或者,如果需要检查服务 Pod 的具体端口是否可连接
  12. nc -zv <service-pod-name-or-ip> <port>
复制代码
大概进入到容器内里
  1. # ubuntu
  2. apt-get update && apt-get install -y iproute2
  3. # centos
  4. apk add --no-cache iproute2
复制代码

发现15672这个端口没有起来,25672 端口(集群通信端口)和 5672 端口(AMQP 客户端连接端口)可以正常工作,这通常意味着管理界面的设置或袒露方式存在问题
执行下令ss -tuln

问题出在configmap,之前得到的太简单了,完整的设置如上
2.2 如何使用

  1. rabbitmq-headless.middleware.svc.cluster.local:5672
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表