RockerMQ在k8s的部署有两种方式, 一种是使用operator 在k8s集群中部署,可参考operation项目; 一种是编写简单的k8s配置文件,在rocketmq的docker项目中有提供模板。
这里我们希望使用单机版k8s部署一套低配置rockerMQ, 仅启动一个nameservice和1个broker,我们将使用rocketmq-docker项目提供的模板来完成。
- 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: {}
- 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
- 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路径)
最终方案: 手动的方式,很不方便,经过检查,实际问题是由于路径上的${JAVA_HOME}变量为空,导致无法找到etx路径。所以,我们通过k8s的方式传入JAVA_HOME环境便令就可以了。如下图:
image.png3.2 添加订阅组
订阅组 可以用来实现消费的loadbalance,同一订阅组的消费者分享所有的读队列。
创建订阅组使用updateSubGroup 命令,所需参数如下:
image.png
执行命令新建一个授权服务的消费组
./mqadmin updateSubGroup -b localhost:10911 -n localhost:9876 -g GID_authorize
执行结果:
image.png
-
ACL 权限访问控制 (命令行暂未跑通)
ACL是access control list的简称,俗称访问控制列表。访问控制,基本上会涉及到用户、资源、权限、角色等概念:
用户
用户是访问控制的基础要素,也不难理解,RocketMQ ACL必然也会引入用户的概念,即支持用户名、密码。
资源
资源,需要保护的对象,在RocketMQ中,消息发送涉及的Topic、消息消费涉及的消费组,应该进行保护,故可以抽象成资源。
权限
针对资源,能进行的操作.
角色
RocketMQ中,只定义两种角色:是否是管理员。
3.1 添加一个用户
对于用户信息,在ACL中可以配置 accesskey, secretKey, witeRemoteAddress, topicPrerms, grouPerms的要素。
我们将使用updateAclConfig 命令来更新权限信息。命令参数如下:
image.png
网友评论