当前位置 博文首页 > 山间漫步人生路的博客:k8s部署rabbitmq集群并启用mqtt,并设置a

    山间漫步人生路的博客:k8s部署rabbitmq集群并启用mqtt,并设置a

    作者:[db:作者] 时间:2021-07-15 12:35

    项目用到rabbitmq以及mqtt,所以整理记录一下

    rabbitmq-configmap.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rmq-cluster-config
      namespace: default
      labels:
        addonmanager.kubernetes.io/mode: Reconcile
    data:
        enabled_plugins: |
          
    #有需要启用的插件在这里设置      [rabbitmq_management,rabbitmq_peer_discovery_k8s,rabbitmq_mqtt,rabbitmq_web_mqtt].
        rabbitmq.conf: |
          loopback_users.guest = false
    
          ## Clustering
          cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
          cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
          cluster_formation.k8s.address_type = hostname
          #################################################
          # default is rabbitmq-cluster's namespace#
          #################################################
          cluster_formation.k8s.hostname_suffix = .rmq-cluster.default.svc.cluster.local
          cluster_formation.node_cleanup.interval = 10
          cluster_formation.node_cleanup.only_log_warning = true
          cluster_partition_handling = autoheal
          ## queue master locator
          queue_master_locator=min-masters
    
    

    rabbitmq-rbac.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: rmq-cluster
      namespace: default
      
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: Role
    metadata:
      name: rmq-cluster
      namespace: default
    rules:
      - apiGroups:
          - ""
        resources:
          - endpoints
        verbs:
          - get
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: RoleBinding
    metadata:
      name: rmq-cluster
      namespace: default
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: rmq-cluster
    subjects:
    - kind: ServiceAccount
      name: rmq-cluster
      namespace: default
    
    
    

    rabbitmq-secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: rmq-cluster-secret
      namespace: default
    stringData:
      cookie: ERLANG_COOKIE
      username: admin
      password: admin123
    type: Opaque
    
    
    

    rabbitmq-svc.yaml(采用了nodeport,方便访问也可以设置为ClusterIP然后ingress作域名访问)我这里修改了nodeport的范围,未修改的需要修改一下端口号

    apiVersion: v1
    kind: Service
    metadata:
      name: rmq-cluster
      namespace: default
      labels:
        app: rmq-cluster
    spec:
      selector:
        app: rmq-cluster
      ports:
      - name: http
        port: 15672
        protocol: TCP
        nodePort: 30672
      - name: amqp
        port: 5672
        protocol: TCP
        nodePort: 25672
      - name: mqtt
        port: 1883
        protocol: TCP
        nodePort: 21883
      type: NodePort
    
    

    rabbitmq-sts.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: rmq-cluster
      namespace: default
      labels:
        app: rmq-cluster
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: rmq-cluster
      serviceName: rmq-cluster
      template:
        metadata:
          labels:
            app: rmq-cluster
        spec:
          serviceAccountName: rmq-cluster
          terminationGracePeriodSeconds: 30
          containers:
          - name: rabbitmq
            image: rabbitmq:3.7-management
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 15672
              name: http
              protocol: TCP
            - containerPort: 5672
              name: amqp
              protocol: TCP
            command:
            - sh
            args:
            - -c
            - cp -v /etc/rabbitmq/rabbitmq.conf ${RABBITMQ_CONFIG_FILE}; exec docker-entrypoint.sh
              rabbitmq-server
            env:
            - name: RABBITMQ_DEFAULT_USER
              valueFrom:
                secretKeyRef:
                  key: username
                  name: rmq-cluster-secret
            - name: RABBITMQ_DEFAULT_PASS
              valueFrom:
                secretKeyRef:
                  key: password
                  name: rmq-cluster-secret
            - name: RABBITMQ_ERLANG_COOKIE
              valueFrom:
                secretKeyRef:
                  key: cookie
                  name: rmq-cluster-secret
            - name: K8S_SERVICE_NAME
              value: rmq-cluster
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: RABBITMQ_USE_LONGNAME
              value: "true"
            - name: RABBITMQ_NODENAME
              value: rabbit@$(POD_NAME).rmq-cluster.$(POD_NAMESPACE).svc.cluster.local
            - name: RABBITMQ_CONFIG_FILE
              value: /var/lib/rabbitmq/rabbitmq.conf
            livenessProbe:
              exec:
                command:
                - rabbitmqctl
                - status
              initialDelaySeconds: 30
              timeoutSeconds: 10
            readinessProbe:
              exec:
                command:
                - rabbitmqctl
                - status
              initialDelaySeconds: 10
              timeoutSeconds: 10
            volumeMounts:
            - name: config-volume
              mountPath: /etc/rabbitmq
              readOnly: false
            - name: rabbitmq-storage
              mountPath: /var/lib/rabbitmq
              readOnly: false
          volumes:
          - name: config-volume
            configMap:
              items:
              - key: rabbitmq.conf
                path: rabbitmq.conf
              - key: enabled_plugins
                path: enabled_plugins
              name: rmq-cluster-config
          - name: rabbitmq-storage
            persistentVolumeClaim:
              claimName: rabbitmq-cluster-storage
    
    

    这里用nfs持久化存储
    rabbit-pv.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: rabbitmq-pv
      labels:
        app: rmq-cluster
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      nfs:
        server: 192.168.111.21
        path: /root/nfs_root/rabbitmq
    
    

    rabbitmq-pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: rabbitmq-cluster-storage
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          app: rmq-cluster
    
    

    部署

    kubectl apply -f .
    # 这里default 命名空间,就使用 sed 命令将yaml文件中 default 全局替换为 rabbitmq(其他命名空间):
    sed -i 's/default/rabbitmq/g' ./*
    kubectl apply -f .
    
    [root@master60 ~]# kubectl get pod |grep rm
    rmq-cluster-0                                             1/1     Running   5          
    rmq-cluster-1                                             1/1     Running   7         
    rmq-cluster-2                                             1/1     Running   6      
    [root@master60 ~]# kubectl get svc |grep rm
    rmq-cluster      NodePort    10.0.0.181   <none>        15672:30672/TCP,5672:25672/TCP,1883:21883/TCP  
    
    

    ip:30672访问即可,使用初始账号密码guest/guest登录即可。
    在这里插入图片描述

    点击“Admin”,标签,添加admin账号,并设置为管理员,密码为admin。见下图:
    在这里插入图片描述
    如果添加的用户显示 no access。点击用户名 admin 设置权限。点击 set permission即可。
    在这里插入图片描述

    cs