主要内容:探究 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 上的介绍 看,
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 对应的域名值。