Skip to content
赞赏-微信扫码

主要内容:探究 rabbitmq 的部署,学习 StatefulSet、Headless Service 等知识点

kubernetes 知识点:StatefulSet 工作负载、存储卷声明模板、Headless 类型的 Service

选择部署方式

rabbitmq 官方有 kubernetes operator。就像我们用 yaml 创建 命令空间 时,资源清单里有个类型字段叫 kind: namespace。rabbitmq 的 kubernetes operator 会提供一种新的资源类型 kind: RabbitmqCluster。用这种资源类型,我们就不用关心部署的细节,用哪种类型的工作负载、怎么建 Service、等等。(删除部署的时候,记得是到 自定义资源 那边删除)

但我们先不用它的 kubernetes operator,我们试一下“知道 docker 里怎么部署,翻译成 kuboard 界面上的操作,就能在 k8s 里部署”手动用最原始的方式。

rabbitmq 在 docker hub 上的介绍 看,

sh
docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3-management

它启动时需要指定一个 --hostname 参数。在持久化存储数据的时候,数据会存储在 /var/lib/rabbitmq/mnesia/rabbit@主机名称 目录下,其中 主机名称 对应 --hostname 参数。

也就是说,我们启动一个 pod,需要固定住主机名称。不然重启后就找不到原来持久化的数据了。最常用的 Deployment 类型的工作负载,它是无状态的,每次启动的主机名称后缀也是随机的。StatefulSet 就有固定主机名称的效果,它可以按顺序启停 pod,给 pod 分配 -0-1-2 的后缀。

单节点部署

docker hub 上介绍的示例,是单节点的部署。除了工作负载类型选 StatefulSet 之外,其他配置可以与 Deployment 类型的工作负载无异。

单节点不用考虑节点之间的通信,Service 可以配置成 ClusterIP 或 NodePort,只考虑 5672、15672 对外提供服务。如果是集群部署,Service 应该怎么配呢?(等用官方 kubernetes operator 启一个集群看看)

挂载存储,即使只有单节点,也最好了解一下 存储卷声明模板,这是 StatefulSet 类型下特有的选项。它会给每个 pod 分别创建 存储卷声明。按 pod 的 -0-1-2 名称后缀,分别分配一个 存储卷声明。(这个知识点简单,先学会,后面要集中精力学习 Service 要怎么配)

集群部署

Service 应该怎么配

用官方 kubernetes operator 启一个集群,看看它部署出来的是什么样的。

kubectl apply -f "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"
kubectl apply -f https://raw.githubusercontent.com/rabbitmq/cluster-operator/main/docs/examples/hello-world/rabbitmq.yaml
NAME                       READY   STATUS    RESTARTS   AGE
pod/hello-world-server-0   1/1     Running   0          2m

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
service/hello-world         ClusterIP   10.75.242.149   <none>  5672/TCP,15672/TCP   2m
service/hello-world-nodes   ClusterIP   None            <none>  4369/TCP,25672/TCP   2m

NAME                                  READY   AGE
statefulset.apps/hello-world-server   1/1     2m

它建了两个 Service,

hello-world 是对外提供服务的,开发人员应该很熟悉的 5672、15672 端口。可以通过 服务名.命名空间.svc.cluster.local 使用这个 mq 集群,访问时可能被负载均衡到任意一个节点上。

hello-world-nodes 对应的 ip 是 None,这是一个 Headless 类型的 Service,可以通过 pod名.服务名.命名空间.svc.cluster.local(hello-world-server-0.hello-world-nodes.default.svc.cluster.local) 访问集群里的某个具体节点,用于集群内部节点之间的通信。

程序配置上,它还配套通过一系列环境变量,最终把 RABBITMQ_NODENAME 这个环境变量,设置成 headless service 对应的域名值。