configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: rabbitmq-config namespace: default data: enabled_plugins: | [rabbitmq_management,rabbitmq_mqtt,rabbitmq_peer_discovery_k8s]. rabbitmq.conf: | ## Cluster formation. See https://www.rabbitmq.com/cluster-formation.html to learn more. cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s cluster_formation.k8s.host = kubernetes.default.svc.cluster.local ## Should RabbitMQ node name be computed from the pod's hostname or IP address? ## IP addresses are not stable, so using [stable] hostnames is recommended when possible. ## Set to "hostname" to use pod hostnames. ## When this value is changed, so should the variable used to set the RABBITMQ_NODENAME ## environment variable. cluster_formation.k8s.address_type = hostname ## How often should node cleanup checks run? cluster_formation.node_cleanup.interval = 30 ## Set to false if automatic removal of unknown/absent nodes ## is desired. This can be dangerous, see ## * https://www.rabbitmq.com/cluster-formation.html#node-health-checks-and-cleanup ## * https://groups.google.com/forum/#!msg/rabbitmq-users/wuOfzEywHXo/k8z_HWIkBgAJ cluster_formation.node_cleanup.only_log_warning = true cluster_partition_handling = autoheal ## See https://www.rabbitmq.com/ha.html#master-migration-data-locality queue_master_locator=min-masters ## This is just an example. ## This enables remote access for the default user with well known credentials. ## Consider deleting the default user and creating a separate user with a set of generated ## credentials instead. ## Learn more at https://www.rabbitmq.com/access-control.html#loopback-users loopback_users.guest = falseRBAC
rbac.yaml
--- apiVersion: v1 kind: ServiceAccount metadata: name: rabbitmq namespace: default --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: rabbitmq-peer-discovery-rbac namespace: default rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get"] - apiGroups: [""] resources: ["events"] verbs: ["create"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: rabbitmq-peer-discovery-rbac namespace: default subjects: - kind: ServiceAccount name: rabbitmq roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: rabbitmq-peer-discovery-rbacService
service.yaml
apiVersion: v1 kind: Service metadata: labels: app: rabbitmq name: rabbitmq namespace: default spec: ports: - name: http port: 15672 protocol: TCP targetPort: 15672 - name: amqp port: 5672 protocol: TCP targetPort: 5672 - name: mqtt port: 1883 protocol: TCP targetPort: 1883 selector: app: rabbitmq type: ClusterIPStatefulSet
statefulset.yaml
apiVersion: apps/v1 # See the Prerequisites section of https://www.rabbitmq.com/cluster-formation.html#peer-discovery-k8s. kind: StatefulSet metadata: name: rabbitmq namespace: default spec: serviceName: rabbitmq # Three nodes is the recommended minimum. Some features may require a majority of nodes # to be available. replicas: 3 selector: matchLabels: app: rabbitmq template: metadata: labels: app: rabbitmq spec: serviceAccountName: rabbitmq terminationGracePeriodSeconds: 10 nodeSelector: # Use Linux nodes in a mixed OS kubernetes cluster. # Learn more at https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-os kubernetes.io/os: linux containers: - name: rabbitmq-k8s image: rabbitmq:3.8.2-management volumeMounts: - name: config-volume mountPath: /etc/rabbitmq # Learn more about what ports various protocols use # at https://www.rabbitmq.com/networking.html#ports ports: - name: http protocol: TCP containerPort: 15672 - name: amqp protocol: TCP containerPort: 5672 - name: mqtt protocol: TCP containerPort: 1883 livenessProbe: exec: # This is just an example. There is no "one true health check" but rather # several rabbitmq-diagnostics commands that can be combined to form increasingly comprehensive # and intrusive health checks. # Learn more at https://www.rabbitmq.com/monitoring.html#health-checks. # # Stage 2 check: command: ["rabbitmq-diagnostics", "status"] initialDelaySeconds: 60 # See https://www.rabbitmq.com/monitoring.html for monitoring frequency recommendations. periodSeconds: 60 timeoutSeconds: 15 readinessProbe: exec: # This is just an example. There is no "one true health check" but rather # several rabbitmq-diagnostics commands that can be combined to form increasingly comprehensive # and intrusive health checks. # Learn more at https://www.rabbitmq.com/monitoring.html#health-checks. # # Stage 1 check: command: ["rabbitmq-diagnostics", "ping"] initialDelaySeconds: 20 periodSeconds: 60 timeoutSeconds: 10 imagePullPolicy: IfNotPresent 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" # See a note on cluster_formation.k8s.address_type in the config file section - name: K8S_SERVICE_NAME value: rabbitmq - 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 - name: RABBITMQ_ERLANG_cookie value: "your_cookie" volumes: - name: config-volume configMap: name: rabbitmq-config items: - key: rabbitmq.conf path: rabbitmq.conf - key: enabled_plugins path: enabled_plugins
注意:RABBITMQ_ERLANG_cookie
# 生成RABBITMQ_ERLANG_cookie echo $(openssl rand -base64 32)
参考文档:GitHub - rabbitmq/rabbitmq-peer-discovery-k8s: Kubernetes-based peer discovery mechanism for RabbitMQ
二、镜像模式设置全部为镜像模式
# 列出策略
rabbitmqctl list_policies
# 设置镜像模式
rabbitmqctl set_policy H "^" '{"ha-mode":"all" , "ha-sync-mode":"automatic"}'
# 再次列出策略
rabbitmqctl list_policies
参考文档:Classic Queue Mirroring — RabbitMQ
三、压测结果压测工具:GitHub - rabbitmq/rabbitmq-perf-test: A load testing tool
./runjava com.rabbitmq.perf.PerfTest -h amqp://guest:guest@192.168.1.112:5672 -x 1 -y 2 -u "throughput-test-1" -a --id "test 1"1. 单节点方案压测
| 压力模型 | 发送速率(msg/s) | 接收速率(msg/s) |
|---|---|---|
| 1生产者、2消费者 | 5266 | 3673 |
| 2生产者、4消费者 | 2972 | 2372 |
| 2生产者、8消费者 | 2794 | 1445 |
| 压力模型 | 发送速率(msg/s) | 接收速率(msg/s) |
|---|---|---|
| 1生产者、2消费者 | 15740 | 14041 |
| 2生产者、4消费者 | 29676 | 26524 |
| 2生产者、8消费者 | 23039 | 22822 |
| 压力模型 | 发送速率(msg/s) | 接收速率(msg/s) |
|---|---|---|
| 1生产者、2消费者 | 10756 | 9314 |
| 2生产者、4消费者 | 14760 | 11592 |
| 2生产者、8消费者 | 17934 | 13135 |



