美文网首页
Rocketmq的k8s配置(1nameservice + 1b

Rocketmq的k8s配置(1nameservice + 1b

作者: Charles_linzc | 来源:发表于2021-04-23 15:34 被阅读0次

    RockerMQ在k8s的部署有两种方式, 一种是使用operator 在k8s集群中部署,可参考operation项目; 一种是编写简单的k8s配置文件,在rocketmq的docker项目中有提供模板。
    这里我们希望使用单机版k8s部署一套低配置rockerMQ, 仅启动一个nameservice和1个broker,我们将使用rocketmq-docker项目提供的模板来完成。

    1. deployment文件
      我们使用在一个pod来完成microk8s的部署,这个pod中将包含1个name server的dockercontainer 和1个name service的docker container。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: rocketmq
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: rocketmq
    template:
    metadata:
    labels:
    app: rocketmq
    spec:
    containers:
    - name: broker
    image: apacherocketmq/rocketmq:4.6.0
    command: ["sh","mqbroker", "-n","localhost:9876"]
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 10909
    - containerPort: 10911
    env:
    - name: JAVA_OPT
    value: -server -XX:ParallelGCThreads=1
    volumeMounts:
    - mountPath: /home/rocketmq/logs
    name: brokeroptlogs
    - mountPath: /home/rocketmq/store
    name: brokeroptstore
    - name: namesrv
    image: apacherocketmq/rocketmq:4.6.0
    command: ["sh","mqnamesrv"]
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 9876
    volumeMounts:
    - mountPath: /home/rocketmq/logs
    name: namesrvoptlogs
    volumes:
    - name: brokeroptlogs
    emptyDir: {}
    - name: brokeroptstore
    emptyDir: {}
    - name: namesrvoptlogs
    emptyDir: {}
    - name: namesrvoptstore
    emptyDir: {}

    1. service
      新建一个rocketmqservice service, 可以通过本地32000端口访问

    apiVersion: v1
    kind: Service
    metadata:
    name: rocketmqservice
    spec:
    type: NodePort
    ports:
    - name: namesrv
    port: 9876
    targetPort: 9876
    nodePort: 32000
    selector:
    app: rocketmq

    1. Topic 与 comsumer group的创建
      使用 kubectl exec -it rabbitmq-66c9dffff7-g75s4 sh 登录默认第一个brocker container.
      image.png
      我们将使用mqadmin 工具创建所需要的资源:
      3.1 首先使用updateTopic 来创建新的Topic
      该命令常用参数如下:
      image.png
      输入 ./mqadmin updateTopic --help 可以查看命令说明。
      我们使用broker的IP(-b), topic名称(-t), nameserver地址(-n), 可读队列数(-r),可写队列数(-4)
      ./mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t Topic_Lifeccp_Common -r 2 -w 2
      image.png

    notes: 签名异常问题
    Caused by: org.apache.rocketmq.acl.common.AclException: [10015:signature-failed] unable to calculate a request signature. error=Algorithm HmacSHA1 not available
    手动方案I,在tool.sh 中${JAVA_HOME}/jre/lib/ext后加上ext文件夹的绝对路径(jdk路径)

    image.png

    最终方案: 手动的方式,很不方便,经过检查,实际问题是由于路径上的${JAVA_HOME}变量为空,导致无法找到etx路径。所以,我们通过k8s的方式传入JAVA_HOME环境便令就可以了。如下图:

    image.png

    3.2 添加订阅组
    订阅组 可以用来实现消费的loadbalance,同一订阅组的消费者分享所有的读队列。
    创建订阅组使用updateSubGroup 命令,所需参数如下:


    image.png

    执行命令新建一个授权服务的消费组
    ./mqadmin updateSubGroup -b localhost:10911 -n localhost:9876 -g GID_authorize
    执行结果:


    image.png
    1. ACL 权限访问控制 (命令行暂未跑通)
      ACL是access control list的简称,俗称访问控制列表。访问控制,基本上会涉及到用户、资源、权限、角色等概念:
      用户
      用户是访问控制的基础要素,也不难理解,RocketMQ ACL必然也会引入用户的概念,即支持用户名、密码。
      资源
      资源,需要保护的对象,在RocketMQ中,消息发送涉及的Topic、消息消费涉及的消费组,应该进行保护,故可以抽象成资源。
      权限
      针对资源,能进行的操作.
      角色
      RocketMQ中,只定义两种角色:是否是管理员。
      3.1 添加一个用户
      对于用户信息,在ACL中可以配置 accesskey, secretKey, witeRemoteAddress, topicPrerms, grouPerms的要素。
      我们将使用updateAclConfig 命令来更新权限信息。命令参数如下:


      image.png

    相关文章

      网友评论

          本文标题:Rocketmq的k8s配置(1nameservice + 1b

          本文链接:https://www.haomeiwen.com/subject/ahkqrltx.html