k8s部署rabbitmq高可用集群

基于rabbitmq-peer-discovery-k8s插件集群安装,参考地址:https://github.com/rabbitmq/rabbitmq-peer-discovery-k8s

yaml模板

apiVersion: v1
kind: ServiceAccount
metadata:
  name: rabbitmq
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: rabbitmq-peer-discovery-rbac
rules:
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["create"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: rabbitmq-peer-discovery-rbac
subjects:
- kind: ServiceAccount
  name: rabbitmq
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rabbitmq-peer-discovery-rbac
---
kind: Service
apiVersion: v1
metadata:
  name: rabbitmq-cluster-headless
  labels:
    app: rabbitmq-cluster-headless
spec:
  # 防止readinessProbe在服务没启动时找不到DNS
  publishNotReadyAddresses: true
  ports:
   - name: http
     port: 15672
   - name: amqp
     port: 5672
  selector:
    app: rabbitmq-cluster
---
kind: Service
apiVersion: v1
metadata:
  name: rabbitmq-cluster
  labels:
    app: rabbitmq-cluster
    type: LoadBalancer
spec:
  type: NodePort
  ports:
   - name: http
     protocol: TCP
     port: 15672
     targetPort: 15672
     nodePort: 31672
   - name: amqp
     protocol: TCP
     port: 5672
     targetPort: 5672
     nodePort: 30672
  selector:
    app: rabbitmq-cluster
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-cluster-config
data:
  enabled_plugins: |
      # 配置启用插件
      [rabbitmq_peer_discovery_k8s,rabbitmq_prometheus,rabbitmq_management,rabbitmq_shovel,rabbitmq_shovel_management].  
  rabbitmq.conf: |
      # rabbitmq配置文件
      cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
      cluster_formation.k8s.host = kubernetes.default
      cluster_formation.k8s.address_type = hostname
      cluster_formation.node_cleanup.interval = 30
      cluster_formation.node_cleanup.only_log_warning = true
      cluster_partition_handling = pause_minority
      queue_master_locator = min-masters

      loopback_users.guest = false
      listeners.tcp.default = 5672
      # 定义登录用户名密码
      default_pass = test
      default_user = test
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rabbitmq-cluster
spec:
  serviceName: rabbitmq-cluster-headless
  replicas: 3
  selector:
    matchLabels:
      app: rabbitmq-cluster
  template:
    metadata:
      labels:
        app: rabbitmq-cluster
    spec:
      serviceAccountName: rabbitmq
      terminationGracePeriodSeconds: 10
      containers:
      - name: rabbitmq-cluster
        image: rabbitmq:3.8
        ports:
        - containerPort: 5672
          name: amqp
          protocol: TCP
        - containerPort: 15672
          name: http
          protocol: TCP
        livenessProbe:
          exec:
            command: ["rabbitmq-diagnostics", "status"]
          initialDelaySeconds: 60
          periodSeconds: 60
          timeoutSeconds: 15
        readinessProbe:
          exec:
            command: ["rabbitmq-diagnostics", "ping"]
          initialDelaySeconds: 20
          periodSeconds: 60
          timeoutSeconds: 10
        imagePullPolicy: Always
        env:
          - name: MY_POD_NAME
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.name
          - name: MY_POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: RABBITMQ_USE_LONGNAME
            value: "true"
          - name: K8S_SERVICE_NAME
            value: rabbitmq-cluster-headless
          - name: RABBITMQ_NODENAME
            value: rabbit@$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local
          - name: K8S_HOSTNAME_SUFFIX
            value: .$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local
          # 定义集群cookie
          - name: RABBITMQ_ERLANG_COOKIE
            value: "58G3PhkBlaKXmver4mvuk06BAir78lku"
        volumeMounts:
          - name: config-volume
            mountPath: /etc/rabbitmq          
          - name: persistence
            mountPath: /var/lib/rabbitmq/mnesia/                    
      volumes:
        - name: config-volume
          configMap:
            name: rabbitmq-cluster-config
            items:
            - key: rabbitmq.conf
              path: rabbitmq.conf
            - key: enabled_plugins
              path: enabled_plugins
  # 使用storageClass做数据存储  
  volumeClaimTemplates:
    - metadata:
        name: persistence
      spec:
        accessModes:
        - ReadWriteOnce
        storageClassName: "nfs-storage"
        resources:
          requests:
            storage: 10Gi

创建集群

kubectl apply -f rabbitmq-cluster.yaml

启动后集群默认都为磁盘节点

需要调整ram节点,只需要登录具体的pod更节点状态即可。

#更改节点为磁盘节点命令
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
  
#查看集群节点状态
rabbitmqctl cluster_status

#查看插件启动状态
rabbitmq-plugins list

配置镜像模式

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
posted @ 2020-11-27 14:48  Squidweber  阅读(116)  评论(0)    收藏  举报