zoukankan      html  css  js  c++  java
  • k8s-rabbitmq-(一)集群部署

     

     K8S版本:1.10.1

    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

     

    查看statefulset状态.

     

     查看MQ集群信息

     

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

     

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

  • 相关阅读:
    推荐一系列优秀的Android开发源码
    FlexViewer框架地图控件三问
    dll转移转载
    共享quotedprintable解码(C#)转载
    开源OCR引擎Tesseract
    Qt Features for Hybrid Web/Native Application Development转载
    利用QT进行web与本地混合应用开发转载
    js 中 document.createEvent的用法转载
    用Python多线程抓取并验证代理(转)
    API Hook完全手册
  • 原文地址:https://www.cnblogs.com/heweiblog/p/8931851.html
Copyright © 2011-2022 走看看