Kubernetes Artemis系列 | 使用 ArtemisCloud Operator 部署 artemis

一、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

持续更新中,关注不迷糊…

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值