目录
一、ArtemisCloud Operator 介绍
ArtemisCloud Operator 是一个用于管理和部署云端基础设施的工具。它基于 Kubernetes 平台,旨在简化和自动化云环境的管理任务。ArtemisCloud Operator 提供了一种通过自定义资源定义 (Custom Resource Definitions, CRDs) 来描述和操作云资源的方式,使得用户能够以更高层次的抽象来管理复杂的云架构和服务。通过 ArtemisCloud Operator,用户可以更高效地管理应用程序和服务的生命周期,提升了云计算环境中的自动化水平和管理效率。
ArtemisCloud Operator 项目地址:
https://github.com/artemiscloud/activemq-artemis-operator
二、部署ArtemisCloud Operator
下载
git clone https://github.com/artemiscloud/activemq-artemis-operator.git
创建命名空间 activemq-artemis-operator 并保存以供所有后续 kubectl 命令使用
$ kubectl create namespace activemq-artemis-operator
$ kubectl config set-context --current --namespace activemq-artemis-operator
要在当前命名空间 activemq-artemis-operator 中部署操作员,只需运行:
$ ./deploy/install_opr.sh
或者如果您已经构建了自己的镜像,请在部署Operator之前更改 deploy/operator.yaml 中定义的镜像。
操作员将被部署到当前命名空间并监视同一个命名空间。
要监视特定命名空间或所有命名空间,请运行以下命令,它会询问您要监视哪些命名空间。(与上个./deploy/install_opr.sh 脚本二选一)
$ ./deploy/cluster_wide_install_opr.sh
此时,你应该看到 activemq-artemis-operator 正在启动,如果你检查 pod,你会看到类似
$ kubectl get pod -n activemq-artemis-operator
NAME READY STATUS RESTARTS AGE
activemq-artemis-controller-manager-5ff459cd95-kn22m 1/1 Running 0 70m
三、使用 ArtemisCloud Operator 部署 artemis
现在,Operator 正在运行并监听与我们的 crd 相关的更改,我们可以部署我们的artemis 单一示例 ,如下所示
apiVersion: broker.amq.io/v1beta1
kind: ActiveMQArtemis
metadata:
name: artemis-broker
示例yaml(不需要执行)
apiVersion: broker.amq.io/v1beta1
kind: ActiveMQArtemis
metadata:
name: artemis-broker-template
spec:
resourceTemplates:
- selector:
kind: "StatefulSet"
annotations:
someKey: "someValue"
patch:
kind: "StatefulSet"
spec:
template:
spec:
containers:
- name: "artemis-broker-template-container"
securityContext:
runAsNonRoot: true
特别注意spec.image,它标识用于启动 AMQ Broker 的容器映像。如果它为空、为“占位符”或未定义,它将从 deploy/operator.yaml 获取最新的默认映像 URL,其中受支持的代理映像列表被定义为环境变量。
要部署代理,只需执行
$ kubectl create -f examples/artemis/artemis_single.yaml -n activemq-artemis-operator
activemqartemis.broker.amq.io/artemis-broker created
稍后您将看到一个代理容器与操作员容器一起创建:
$ kubectl get pod -n activemq-artemis-operator
NAME READY STATUS RESTARTS AGE
activemq-artemis-controller-manager-5ff459cd95-kn22m 1/1 Running 0 128m
artemis-broker-ss-0 1/1 Running 0 23m
扩展
spec.deploymentPlan.size 控制您要部署到集群的代理 Pod 数量。您可以更改此值并将其应用于正在运行的部署,以扩大和缩小代理 Pod 的数量。
例如,如果您想将上述部署扩展到 2 个 pod,请将大小修改为 2:
示例/artemis/artemis_single.yaml
apiVersion: broker.amq.io/v1beta1
kind: ActiveMQArtemis
metadata:
name: artemis-broker
spec:
deploymentPlan:
size: 2
并应用它:
$ kubectl apply -f examples/artemis/artemis_single.yaml -n activemq-artemis-operator
activemqartemis.broker.amq.io/artemis-broker configured
集群中将出现 2 个 Broker Pod
$ kubectl get pod -n activemq-artemis-operator
NAME READY STATUS RESTARTS AGE
activemq-artemis-controller-manager-5ff459cd95-kn22m 1/1 Running 0 140m
artemis-broker-ss-0 1/1 Running 0 35m
artemis-broker-ss-1 1/1 Running 0 69s
您可以以类似的方式缩小部署规模,即减小尺寸并再次应用它。
聚类
默认情况下,如果代理容器扩展到多个,则代理容器将形成一个代理 集群,这意味着彼此连接并使用默认的“ON_DEMAND”策略重新分发消息。
代理
要取消部署代理,我们只需执行
$ kubectl delete -f examples/artemis/artemis_single.yaml -n activemq-artemis-operator
activemqartemis.broker.amq.io "artemis-broker" deleted
四、管理队列
概述
用户可以使用 activemqartemisaddress CRD 在正在运行的代理 pod 上创建和删除队列/地址。
要应用本节中的命令,必须拥有已部署的代理 pod 。
假设您已经有一个正在运行的资源,那么您可以从示例目录部署一个activemqartemisaddress资源:
地址队列.yaml:
apiVersion: broker.amq.io/v1beta1
kind: ActiveMQArtemisAddress
metadata:
name: artemis-address-queue
spec:
addressName: myAddress0
queueName: myQueue0
routingType: anycast
removeFromBrokerOnDelete: true
和部署命令:
$ kubectl create -f examples/address/address_queue.yaml -n activemq-artemis-operator
activemqartemisaddress.broker.amq.io/artemis-address-queue created
部署时,它将在地址myAddress0上创建一个名为myQueue0的队列,具有任播路由类型,例如:
$kubectl exec artemis-broker-ss-0 -nactivemq-artemis-operator --container artemis-broker-container -- amq-broker/bin/artemis queue stat
Connection brokerURL = tcp://artemis-broker-ss-0.artemis-broker-hdls-svc.activemq-artemis-operator.svc.cluster.local:61616
|NAME |ADDRESS |CONSUMER_COUNT|MESSAGE_COUNT|MESSAGES_ADDED|DELIVERING_COUNT|MESSAGES_ACKED|SCHEDULED_COUNT|ROUTING_TYPE|
|DLQ |DLQ |0 |0 |0 |0 |0 |0 |ANYCAST |
|ExpiryQueue |ExpiryQueue |0 |0 |0 |0 |0 |0 |ANYCAST |
|activemq.management.27...|activemq.management.27...|1 |0 |0 |0 |0 |0 |MULTICAST |
|myQueue0 |myAddress0 |0 |0 |0 |0 |0 |0 |ANYCAST |
spec.removeFromBrokerOnDelete控制当您删除上述自定义资源时如何处理创建的队列/地址资源:
$ kubectl delete -f examples/address/address_queue.yaml -n activemq-artemis-operator
activemqartemisaddress.broker.amq.io “artemis-address-queue” deleted
如果spec.removeFromBrokerOnDelete为 true,队列/地址资源将从 broker 中删除。如果为 false,即使自定义资源被删除,此自定义资源创建的队列/地址仍将保留在 broker 中。
您可以使用以下命令检查队列是否已被删除:
$ kubectl exec artemis-broker-ss-0 --container artemis-broker-container -- amq-broker/bin/artemis queue stat
Connection brokerURL = tcp://artemis-broker-ss-0.artemis-broker-hdls-svc.activemq-artemis-operator.svc.cluster.local:61616
|NAME |ADDRESS |CONSUMER_COUNT|MESSAGE_COUNT|MESSAGES_ADDED|DELIVERING_COUNT|MESSAGES_ACKED|SCHEDULED_COUNT|ROUTING_TYPE|
|DLQ |DLQ |0 |0 |0 |0 |0 |0 |ANYCAST |
|ExpiryQueue |ExpiryQueue |0 |0 |0 |0 |0 |0 |ANYCAST |
|activemq.management.d9...|activemq.management.d9...|1 |0 |0 |0 |0 |0 |MULTICAST |
五、缩减规模时消息迁移
当代理 pod 正在缩小规模时,可以自动部署缩小规模控制器来处理从缩小规模的代理 pod 到活跃代理的消息迁移。
当缩减控制器检测到事件时,它会启动一个排空器 pod。排空器 pod 将联系集群中的一个活动 pod,并将消息排空到它。排空完成后,它会自动关闭。
仅当您在代理自定义资源上启用了持久性和消息迁移时,消息排空才有效。例如,您可以从我们的代理集群持久性示例中部署集群
注:这里会使用默认的存储类创建pvc
apiVersion: broker.amq.io/v1beta1
kind: ActiveMQArtemis
metadata:
name: artemis-broker
spec:
deploymentPlan:
size: 2
persistenceEnabled: true
messageMigration: true
为了演示消息消耗,首先部署上述自定义资源(假设操作员正在运行):
$ kubectl create -f ./examples/artemis/artemis_cluster_persistence.yaml -n activemq-artemis-operator
activemqartemis.broker.amq.io/artemis-broker created
您将看到创建了 2 个代理容器。
$ kubectl get pod -n activemq-artemis-operator
NAME READY STATUS RESTARTS AGE
activemq-artemis-controller-manager-5ff459cd95-kn22m 1/1 Running 0 3h19m
artemis-broker-ss-0 1/1 Running 0 89s
artemis-broker-ss-1 1/1 Running 0 53s
也可以看到持久化存储
现在我们将使用 broker 的 cli 工具向每个 broker pod 发送一些消息。
首先向代理artemis-broker-ss-0发送 100 条消息:
$ kubectl exec artemis-broker-ss-0 -- amq-broker/bin/artemis producer --url tcp://artemis-broker-ss-0:61616 --message-count=100
Defaulted container "artemis-broker-container" out of: artemis-broker-container, artemis-broker-container-init (init)
Connection brokerURL = tcp://artemis-broker-ss-0:61616
Producer ActiveMQQueue[TEST], thread=0 Started to calculate elapsed time ...
Producer ActiveMQQueue[TEST], thread=0 Produced: 100 messages
Producer ActiveMQQueue[TEST], thread=0 Elapsed time in second : 0 s
Producer ActiveMQQueue[TEST], thread=0 Elapsed time in milli second : 409 milli seconds
然后再向代理artemis-broker-ss-1发送 100 条消息
$ kubectl exec artemis-broker-ss-1 -- amq-broker/bin/artemis producer --user x --password y --url tcp://artemis-broker-ss-1:61616 --message-count=100
Defaulted container "artemis-broker-container" out of: artemis-broker-container, artemis-broker-container-init (init)
Connection brokerURL = tcp://artemis-broker-ss-1:61616
Producer ActiveMQQueue[TEST], thread=0 Started to calculate elapsed time ...
Producer ActiveMQQueue[TEST], thread=0 Produced: 100 messages
Producer ActiveMQQueue[TEST], thread=0 Elapsed time in second : 0 s
Producer ActiveMQQueue[TEST], thread=0 Elapsed time in milli second : 466 milli seconds
现在两个代理各有 100 条消息。
$ kubectl exec artemis-broker-ss-0 --container artemis-broker-container -- amq-broker/bin/artemis queue stat
Connection brokerURL = tcp://artemis-broker-ss-0.artemis-broker-hdls-svc.activemq-artemis-operator.svc.cluster.local:61616
|NAME |ADDRESS |CONSUMER_COUNT|MESSAGE_COUNT|MESSAGES_ADDED|DELIVERING_COUNT|MESSAGES_ACKED|SCHEDULED_COUNT|ROUTING_TYPE|
|DLQ |DLQ |0 |0 |0 |0 |0 |0 |ANYCAST |
|ExpiryQueue |ExpiryQueue |0 |0 |0 |0 |0 |0 |ANYCAST |
|TEST |TEST |0 |100 |100 |0 |0 |0 |ANYCAST |
|activemq.management.14...|activemq.management.14...|1 |0 |0 |0 |0 |0 |MULTICAST |
$ kubectl exec artemis-broker-ss-1 --container artemis-broker-container -- amq-broker/bin/artemis queue stat
Connection brokerURL = tcp://artemis-broker-ss-1.artemis-broker-hdls-svc.activemq-artemis-operator.svc.cluster.local:61616
|NAME |ADDRESS |CONSUMER_COUNT|MESSAGE_COUNT|MESSAGES_ADDED|DELIVERING_COUNT|MESSAGES_ACKED|SCHEDULED_COUNT|ROUTING_TYPE|
|DLQ |DLQ |0 |0 |0 |0 |0 |0 |ANYCAST |
|ExpiryQueue |ExpiryQueue |0 |0 |0 |0 |0 |0 |ANYCAST |
|TEST |TEST |0 |100 |100 |0 |0 |0 |ANYCAST |
|activemq.management.2a...|activemq.management.2a...|1 |0 |0 |0 |0 |0 |MULTICAST |
修改 ./examples/artemis/artemis_cluster_persistence.yaml 以缩减为一个代理
apiVersion: broker.amq.io/v1beta1
kind: ActiveMQArtemis
metadata:
name: artemis-broker
spec:
deploymentPlan:
size: 1
persistenceEnabled: true
messageMigration: true
并重新应用它:
$ kubectl apply -f ./examples/artemis/artemis_cluster_persistence.yaml -n activemq-artemis-operator
activemqartemis.broker.amq.io/artemis-broker configured
代理容器将减少到只有一个
$ kubectl get pod -n activemq-artemis-operator
NAME READY STATUS RESTARTS AGE
activemq-artemis-controller-manager-5ff459cd95-kn22m 1/1 Running 0 3h57m
artemis-broker-ss-0 1/1 Running 0 39m
现在 broker pod artemis-broker-ss-1上的消息应该已经全部迁移到 pod artemis-broker-ss-0 了。再次使用 broker cli 工具检查:
$ kubectl exec artemis-broker-ss-0 -- amq-broker/bin/artemis queue stat --url tcp://artemis-broker-ss-0:61616
您可以看到队列 TEST 现在有 200 条消息。
以上部分操作设置了默认操作的名称空间,自己可以改;
kubectl config set-context --current --namespace activemq-artemis-operator
持续更新中,关注不迷糊…