内容简介:之前文章讲述了如何通过docker命令来手动创建一个rabbitmq集群;可以通过其了解rabbitmq构建的步骤和基本原理;随着Kubernetes的逐渐流行,如何通过Kubernetes的方式来部署一个rabbitmq集群呢?下面讲述其步骤。这里我们使用的docker image有一个:
之前文章讲述了如何通过 docker 命令来手动创建一个rabbitmq集群;可以通过其了解rabbitmq构建的步骤和基本原理;
随着Kubernetes的逐渐流行,如何通过Kubernetes的方式来部署一个rabbitmq集群呢?下面讲述其步骤。
创建rabbitmq集群
这里我们使用的docker image有一个:
- rabbitmq:3.7-rc-management
创建rabbitmq集群的yaml文件
下面yaml中涉及的Kubernetes组件有:
-
Service
- 提供http服务的service
- 提供StatfulSet的headless service
-
StatefulSet
有状态pods的集合,真正提供rabbitmq的服务
root@kmaster:~/yangguanjun# cat rabbitmq.yaml
---
apiVersion: v1
kind: Service
metadata:
# Expose the management HTTP port on each node
name: rabbitmq-management
labels:
app: rabbitmq
spec:
ports:
- port: 15672
name: http
selector:
app: rabbitmq
type: NodePort # Or LoadBalancer in production w/ proper security
---
apiVersion: v1
kind: Service
metadata:
# The required headless service for StatefulSets
name: rabbitmq
labels:
app: rabbitmq
spec:
ports:
- port: 5672
name: amqp
- port: 4369
name: epmd
- port: 25672
name: rabbitmq-dist
clusterIP: None
selector:
app: rabbitmq
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: rabbitmq
spec:
serviceName: "rabbitmq"
replicas: 3
template:
metadata:
labels:
app: rabbitmq
spec:
containers:
- name: rabbitmq
image: rabbitmq:3.7-rc-management
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- >
if [ -z "$(grep rabbitmq /etc/resolv.conf)" ]; then
sed "s/^search \([^ ]\+\)/search rabbitmq.\1 \1/" /etc/resolv.conf > /etc/resolv.conf.new;
cat /etc/resolv.conf.new > /etc/resolv.conf;
rm /etc/resolv.conf.new;
fi;
until rabbitmqctl node_health_check; do sleep 1; done;
if [ -z "$(rabbitmqctl cluster_status | grep rabbitmq-0)" ]; then
touch /gotit
rabbitmqctl stop_app;
rabbitmqctl reset;
rabbitmqctl join_cluster rabbit@rabbitmq-0;
rabbitmqctl start_app;
else
touch /notget
fi;
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: RABBITMQ_ERLANG_COOKIE
value: "YZSDHWMFSMKEMBDHSGGZ"
- name: RABBITMQ_NODENAME
value: "rabbit@$(MY_POD_NAME)"
ports:
- containerPort: 5672
name: amqp
通过Pod的 postStart
来执行命令,把后面的两个Pod加入rabbitmq集群。
Pod的生命周期里有两个个hook部分:PostStart,PreStop
创建不同的rabbitmq集群,需要把yaml文件的很多处rabbitmq关键字替换掉。。。
也可以通过参数来生成yaml文件
创建 rabbitmq 集群
通过 kubectl
命令,依据上章节的 rabbitmq.yaml
文件创建rabbitmq集群;
root@kmaster:~/yangguanjun# kubectl create -f rabbitmq.yaml service "rabbitmq-management" created service "rabbitmq" created statefulset "rabbitmq" created
检查rabbitmq 集群
检查刚才创建的rabbitmq集群是否正常?出于什么状态?可以使用如下命令:
root@kmaster:~/yangguanjun# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.96.0.1 <none> 443/TCP 9d
rabbitmq None <none> 5672/TCP,4369/TCP,25672/TCP 21m
rabbitmq-management 10.96.158.11 <nodes> 15672:32219/TCP 21m
root@kmaster:~/yangguanjun# kubectl get pods
NAME READY STATUS RESTARTS AGE
rabbitmq-0 1/1 Running 0 21m
rabbitmq-1 1/1 Running 0 21m
rabbitmq-2 1/1 Running 0 21m
root@kmaster:~/yangguanjun# kubectl exec -it rabbitmq-0 bash
root@rabbitmq-0:/# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq-0 ...
[{nodes,[{disc,['rabbit@rabbitmq-0','rabbit@rabbitmq-1',
'rabbit@rabbitmq-2']}]},
{running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-1','rabbit@rabbitmq-0']},
{cluster_name,<<"rabbit@rabbitmq-0.rabbitmq.default.svc.cluster.local">>},
{partitions,[]},
{alarms,[{'rabbit@rabbitmq-2',[]},
{'rabbit@rabbitmq-1',[]},
{'rabbit@rabbitmq-0',[]}]}]
rabbitmq集群的域名
上面我们通过 Statefulset
来创建的rabbitmq集群,但是我们并没有在镜像中指定几个Pods之间如何访问,它们之间的解析是通过 Headless service
提供的,可以通过下面命令获取Pod里的域名解析:
root@rabbitmq-0:/# cat /etc/resolv.conf nameserver 10.96.0.10 search rabbitmq.default.svc.cluster.local default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 root@rabbitmq-0:/# dig rabbitmq.default.svc.cluster.local ; <<>> DiG 9.10.3-P4-Debian <<>> rabbitmq.default.svc.cluster.local ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55697 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;rabbitmq.default.svc.cluster.local. IN A ;; ANSWER SECTION: rabbitmq.default.svc.cluster.local. 30 IN A 192.168.239.175 rabbitmq.default.svc.cluster.local. 30 IN A 192.168.150.235 rabbitmq.default.svc.cluster.local. 30 IN A 192.168.152.171 ;; Query time: 0 msec ;; SERVER: 10.96.0.10#53(10.96.0.10) ;; WHEN: Fri May 04 08:56:40 UTC 2018 ;; MSG SIZE rcvd: 100 root@rabbitmq-0:/# nslookup rabbitmq-1 Server: 10.96.0.10 Address: 10.96.0.10#53 Name: rabbitmq-1.rabbitmq.default.svc.cluster.local Address: 192.168.239.175 root@rabbitmq-0:/# nslookup rabbitmq.default.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10#53 Name: rabbitmq.default.svc.cluster.local Address: 192.168.150.235 Name: rabbitmq.default.svc.cluster.local Address: 192.168.152.171 Name: rabbitmq.default.svc.cluster.local Address: 192.168.239.175 root@rabbitmq-0:/# nslookup rabbitmq-management.default.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10#53 Name: rabbitmq-management.default.svc.cluster.local Address: 10.96.158.11
访问rabbitmq集群
创建好rabbitmq集群后,如何访问它呢?
如之前我们介绍使用的image为: rabbitmq:3.7-rc-management
,它包含了rabbitmq的management组件,另外我们也创建了rabbitmq集群对应的service服务,提供了基于http端口的访问,通过下面命令获取其信息:
root@kmaster:~/yangguanjun# kubectl describe service/rabbitmq-management Name: rabbitmq-management Namespace: default Labels: app=rabbitmq Annotations: <none> Selector: app=rabbitmq Type: NodePort IP: 10.96.158.11 Port: http 15672/TCP NodePort: http 32219/TCP Endpoints: 192.168.150.235:15672,192.168.152.171:15672,192.168.239.175:15672 Session Affinity: None Events: <none>
则可以通过http指定IP和Port直接访问: http://10.96.158.11:1 5672
当然这里的IP是内网IP,若公司内外不能访问的话,可以绑定外网IP后再通过公网+port访问。
参考文档
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- docker部署rabbitmq集群
- 部署Ceph集群--jluocc
- 部署高可用Kubernetes集群
- Eureka使用及集群部署
- 使用Docker部署RabbitMQ集群
- GreenPlum 5.10.0 集群部署
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP for the World Wide Web, Second Edition (Visual QuickStart Gu
Larry Ullman / Peachpit Press / 2004-02-02 / USD 29.99
So you know HTML, even JavaScript, but the idea of learning an actual programming language like PHP terrifies you? Well, stop quaking and get going with this easy task-based guide! Aimed at beginning ......一起来看看 《PHP for the World Wide Web, Second Edition (Visual QuickStart Gu》 这本书的介绍吧!
SHA 加密
SHA 加密工具
RGB HSV 转换
RGB HSV 互转工具