rabbitmq版本:3.6.14
从来没用过这个软件,所以对里面很多术语看不太懂.最后通过https://www.kubernetes.org.cn/2629.html 大牛的文档完成了集群的部署和搭建
3.6.x系列版本通过K8S创建集群需要用到插件,因为没有合并到主分支所以需要自行下载,这里我通过Dockerfile创建好了镜像并上传到了我自己的仓库,如果对这一块感兴趣可以自行百度搜索一下
3.7.x系列增加了对K8S发现的功能,听说很强大,以后再去研究。
一.创建rbca认证
集群需要通过访问K8S获取节点IP地址和主机名称用来访问各个节点的MQ信息,就需要给MQ创建角色权限(Role)最后将该角色绑定给mq(RoleBinding)
vim rabbitmq-rbac.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: rabbitmq namespace: dev --- kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: rabbitmq namespace: dev rules: - apiGroups: - "" resources: - endpoints verbs: - get --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: rabbitmq namespace: dev roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: rabbitmq subjects: - kind: ServiceAccount name: rabbitmq namespace: dev
二.创建 statefulset 环境
vim rabbitmq.statefulset.yaml
--- apiVersion: v1 kind: Service metadata: name: rabbitmq-management namespace: dev labels: app: rabbitmq spec: ports: - port: 15672 name: http nodePort: 32001 - port: 5672 name: amqp nodePort: 32002 selector: app: rabbitmq type: NodePort --- apiVersion: v1 kind: Service metadata: name: rabbitmq namespace: dev labels: app: rabbitmq spec: clusterIP: None ports: - port: 5672 name: amqp selector: app: rabbitmq --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: rabbitmq namespace: dev spec: serviceName: rabbitmq replicas: 3 template: metadata: labels: app: rabbitmq spec: serviceAccountName: rabbitmq imagePullSecrets: - name: regsecret containers: - name: rabbitmq image: registry.cn-shenzhen.aliyuncs.com/di_chen/kubernetes-rabbitmq-k8s:3.6.14 imagePullPolicy: IfNotPresent resources: requests: memory: "256Mi" cpu: "150m" limits: memory: "512Mi" cpu: "250m" ports: - containerPort: 5672 name: amqp env: - name: RABBITMQ_DEFAULT_USER value: rabbituser - name: RABBITMQ_DEFAULT_PASS valueFrom: secretKeyRef: name: erlang.cookie key: erlang.cookie - 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)"
这里我省略了MQ对持续化数据的存储的配置,暂时没研究到哪,附上代码
volumeMounts: - name: rabbitmq-volume mountPath: /var/lib/rabbitmq volumeClaimTemplates: - metadata: name: rabbitmq-volume spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 5Gi
三.环境部署
执行认证文件
kubectl -n dev create -f rabbitmq-rbac.yaml
如果你没有创建dev这个命名空间请先创建
kubectl create namespaces dev
echo $(openssl rand -base64 32) > erlang.cookie
kubectl -n dev create secret generic erlang.cookie --from-file=erlang.cookie
执行 statefulset 文件
kubectl -n dev create -f rabbitmq.statefulset.yaml
如果第一次执行,需要下载镜像,等待POD状态为RUNING
查看statefulset状态.
查看MQ集群信息
能够正确获取集群信息,接下来通过Nodeport端口进行外部访问MQ集群
到此K8S-MQ集群部署完成,此时的集群还有需要地方不完善,后续也会持续完善下去~