K8S版本:1.10.1

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

rabbitmq版本:3.6.14

从来没用过这个软件,所以对里面很多术语看不太懂.最后通过https://www.kubernetes.org.cn/2629.html 大牛的文档完成了集群的部署和搭建

3.6.x系列版本通过K8S创建集群需要用到插件,因为没有合并到主分支所以需要自行下载,这里我通过Dockerfile创建好了镜像并上传到了我自己的仓库,如果对这一块感兴趣可以自行百度搜索一下

3.7.x系列增加了对K8S发现的功能,听说很强大,以后再去研究。

 

为什么要使用 StatefulSet 来部署MQ

  • 稳定,唯一的网络标志。
  • 稳定,持久化存储。
  • 有序,优雅地部署和 scale。
  • 有序,优雅地删除和终止。
  • 有序,自动的滚动升级。

通过上述的描述,不难看出,MQ集群是有序的,同时需要用到持久化存储,所以K8S专门为这一类服务提供了专门的部署方式,如果你部署的服务是无状态的可以是任意的那么我们可以使用Deployments和ReplicaSets

 

 使用StatefulSet有哪些限制

  • StatefulSet 是 beta 资源,Kubernetes 1.5 以前版本不支持。
  • 对于所有的 alpha/beta 的资源,您都可以通过在 apiserver 中设置 --runtime-config 选项来禁用。
  • 给定 Pod 的存储必须由 PersistentVolume Provisioner 根据请求的 storage class 进行配置,或由管理员预先配置。
  • 删除或 scale StatefulSet 将不会删除与 StatefulSet 相关联的 volume。 这样做是为了确保数据安全性,这通常比自动清除所有相关 StatefulSet 资源更有价值。
  • StatefulSets 目前要求 Headless Service 负责 Pod 的网络身份。你需要提前部署好此服务。

一.创建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

k8s-rabbitmq-(一)集群部署 Cloud 第1张

 

查看statefulset状态.

k8s-rabbitmq-(一)集群部署 Cloud 第2张

 

 查看MQ集群信息

k8s-rabbitmq-(一)集群部署 Cloud 第3张

 

能够正确获取集群信息,接下来通过Nodeport端口进行外部访问MQ集群

k8s-rabbitmq-(一)集群部署 Cloud 第4张

 

 到此K8S-MQ集群部署完成,此时的集群还有需要地方不完善,后续也会持续完善下去~

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄