GitHub地址:https://github.com/Idiomroot/k8s-rabbitmq.git
一、下载温柔的萝莉
#mkdir plugins && cd plugins
#wget https://github.com/rabbitmq/rabbitmq-autocluster/releases/download/0.10.0/autocluster-0.10.0.ez
#wget https://github.com/rabbitmq/rabbitmq-autocluster/releases/download/0.10.0/rabbitmq_aws-0.10.0.ez
二、创建欣慰的天空/p>
#cd ../
#vi DockerfileFROM rabbitmq:3.6.8MAINTAINER IdiomENV RABBITMQ_USE_LONGNAME=true AUTOCLUSTER_LOG_LEVEL=debug AUTOCLUSTER_CLEANUP=true CLEANUP_INTERVAL=60 CLEANUP_WARN_ONLY=false AUTOCLUSTER_TYPE=k8s LANG=en_US.UTF-8ADD plugins/*.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.8/plugins/RUN rabbitmq-plugins enable --offline autoclusterRUN rabbitmq-plugins enable --offline rabbitmq_management#docker build -t 172.16.0.14:5000/pointsmart/rabbitmq3.7:v4 .
#docker push 172.16.0.14:5000/pointsmart/rabbitmq3.7:v4 (没有私有harbor可以省略此步骤)
三、生成cookie文件
# vi erlang-cookie.sh
#! /bin/bash
echo $(openssl rand -base64 32) > erlang.cookie
kubectl create secret generic erlang.cookie --from-file=erlang.cookie
#sh erlang-cookie.sh
四、配置rbac
# vi rabbitmq-rbac.yamlapiVersion: v1kind: ServiceAccountmetadata: name: rabbitmq---kind: RoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: endpoint-readerrules:- apiGroups: [""] resources: ["endpoints"] verbs: ["get"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: endpoint-readersubjects:- kind: ServiceAccount name: rabbitmqroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: endpoint-reader五、编写service
#vi serveice-rabbitmq.yamlkind: ServiceapiVersion: v1metadata: name: rabbitmq-servicespec: type: NodePort ports: - name: mangement protocol: TCP port: 15672 nodePort: 32001 - name: smp protocol: TCP port: 5672 nodePort: 32002 selector: app: rabbitmq---apiVersion: v1kind: Servicemetadata: name: rabbitmq labels: app: rabbitmqspec: clusterIP: None ports: - port: 5672 name: amqp selector: app: rabbitmq六、编写StatefulSet
# vi StatefulSet.yamlapiVersion: apps/v1beta1kind: StatefulSetmetadata: name: rabbitmqspec: serviceName: rabbitmq replicas: 3 template: metadata: labels: app: rabbitmq spec: serviceAccountName: rabbitmq imagePullSecrets: - name: regsecret containers: - name: rabbitmq image: 172.16.0.14:5000/pointsmart/rabbitmq3.7:v4 imagePullPolicy: IfNotPresent resources: requests: memory: "256Mi" cpu: "150m" limits: memory: "512Mi" cpu: "250m" volumeMounts: - name: rabbitmq-data mountPath: /var/lib/rabbitmq/mnesia ports: - containerPort: 5672 name: amqp env: - name: RABBITMQ_DEFAULT_USER value: comma - name: RABBITMQ_DEFAULT_PASS value: commaai2017 - name: RABBITMQ_ERLANG_COOKIE valueFrom: secretKeyRef: name: erlang.cookie key: erlang.cookie - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: K8S_SERVICE_NAME value: "rabbitmq" - name: RABBITMQ_USE_LONGNAME value: "true" - name: RABBITMQ_NODENAME value: "rabbit@$(MY_POD_NAME).$(K8S_SERVICE_NAME)" - name: RABBITMQ_NODE_TYPE value: disc - name: AUTOCLUSTER_TYPE value: "k8s" - name: AUTOCLUSTER_DELAY value: "10" - name: AUTOCLUSTER_CLEANUP value: "true" - name: CLEANUP_WARN_ONLY value: "false" - name: K8S_ADDRESS_TYPE value: "hostname" - name: K8S_HOSTNAME_SUFFIX value: ".$(K8S_SERVICE_NAME)" volumes: - name: rabbitmq-data persistentVolumeClaim: claimName: rabbitmq-data-claim#vi pvc-data.yamlkind: PersistentVolumeClaimapiVersion: v1metadata: name: rabbitmq-data-claim annotations: volume.beta.kubernetes.io/storage-class: "pointsmart-nfs-storage"spec: accessModes: - ReadWriteMany resources: requests: storage: 30Gi如果没有存储类,则可以直接创建PV和PVCvi nfs-data.yamlapiVersion: v1kind: PersistentVolumemetadata: name: rabbitmq-data labels: release: rabbitmq-dataspec: capacity: storage: 60Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Delete nfs: path: /rabbit #这个文件夹要提前在nfs下面创建好 server: nfs地址---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: rabbitmq-data-claimspec: accessModes: - ReadWriteMany resources: requests: storage: 60Gi selector: matchLabels: release: rabbitmq-data#kubectl create -f .
## kubectl get pod -o wide| grep rabbitmq
rabbitmq-0 1/1 Running 0 126m 172.30.28.2 172.16.0.9 <none> <none>
rabbitmq-1 1/1 Running 0 126m 172.30.3.2 172.16.0.8 <none> <none>
rabbitmq-2 1/1 Running 0 86m 172.30.28.7 172.16.0.9 <none> <none>
Name: rabbitmq
Namespace: default
Labels: app=rabbitmq
Annotations: <none>
Selector: app=rabbitmq
Type: dddmn/p>
Port: amqp 5672/TCP
TargetPort: 5672/TCP
Endpoints: 172.30.28.2:5672,172.30.28.7:5672,172.30.3.2:5672
Session Affinity: None
Events: <none>
Name: rabbitmq-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=rabbitmq
Type: 机灵的大树/p>
Port: mangement 15672/TCP
TargetPort: 15672/TCP
NodePort: mangement 32001/TCP
Endpoints: 172.30.28.2:15672,172.30.28.7:15672,172.30.3.2:15672
Port: smp 5672/TCP
TargetPort: 5672/TCP
NodePort: smp 32002/TCP
Endpoints: 172.30.28.2:5672,172.30.28.7:5672,172.30.3.2:5672
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
注意:如果启动后出现报错: =INFO REPORT==== 8-Aug-2019::08:09:41 === autocluster: (cleanup) No partitioned nodes found. 解决办法:需要将其他两个节点加入到第一个节点中 #kubectl exec -it rabbitmq-xxxxx /bin/bash root@rabbitmq-xxxxx:/#rabbitmqctl stop_app root@rabbitmq-xxxxx:/#rabbitmqctl join_cluster rabbit@rabbitmq-0 root@rabbitmq-xxxxx:/#rabbitmqctl start_app 若出现节点无法加入集群的问题 root@rabbitmq-xxxxx:/#rabbitmqctl reset root@rabbitmq-xxxxx:/#rabbitmqctl join_cluster rabbit@rabbitmq-0 root@rabbitmq-xxxxx:/#rabbitmqctl start_app