Развертывание ActiveMQ Artemis в Deckhouse Kubernetes

Процесс подготовки и развертывания ActiveMQ Artemis в Kubernetes включает несколько шагов, обеспечивающих правильную работу и доступность брокера сообщений.

Шаг 1. Предварительные работы в общем сегменте.

На установочном компьютере (УК) в данном примере используется ip адрес 10.20.0.100 и имя registry2.demo.stand.

  1. Создание каталогов и запись в hosts.

    В этом шаге мы создаем каталоги для установки Docker Registry и добавляем запись в файл /etc/hosts/, чтобы обеспечить разрешение DNS имени registry2.demo.stand на IP адрес 10.20.0.100.

    • Создаем каталоги для установки registry:

      sudo mkdir /etc/docker-registry
      sudo mkdir /etc/docker-registry/certs
    • Добавляем запись в hosts:

      echo “10.20.0.100 registry2.demo.stand“ >> /etc/hosts
  2. Создание сертификатов

    В этом шаге мы создаем самоподписанные сертификаты для обеспечения безопасного соединения через HTTPS.

    • Переходим в домашний каталог

      cd ~
    • Создаем необходимые сертификаты:

      openssl genrsa -out ca.key 2048
      openssl req -new -x509 -days 3654 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt
      openssl req -newkey rsa:2048 -nodes -keyout registry2.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=*.demo.stand" -out registry2.csr
      openssl x509 -req -extfile <(printf "subjectAltName=DNS:demo.stand,DNS:registry2.demo.stand") -days 3654 -in registry2.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out registry2.crt
    • Копируем сертификаты в папку сертификатов с помощью команды sudo:

      sudo cp *.key /etc/docker-registry/certs/
      sudo cp *.crt /etc/docker-registry/certs/
      sudo cp ca.crt /usr/local/share/ca-certificates/
      sudo update-ca-certificates

      Перезагрузите машину для обеспечения корректной работы новых сертификатов.

  3. Запуск Registry.

    Для запуска Docker Registry мы используем команду docker run, указывая необходимые параметры, такие как порт, монтирование сертификатов и переменные окружения для TLS настройки.

    • Запустить Registry:

      docker run \
       --rm \
      -p 443:5000 \
      --name registry2 \
      -v /etc/docker-registry/certs:/certs/ \
      -v /var/lib/docker-registry:/var/lib/registry \
      -e REGISTRY_HTTP_HOST=https://registry2.demo.stand \
      -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry2.crt \
      -e REGISTRY_HTTP_TLS_KEY=/certs/registry2.key \
      registry:2
  4. Загрузка образов брокера и оператора.

    В этом шаге мы загружаем образы оператора и брокера в наш Docker Registry, тегируем их соответствующим образом и отправляем в Registry.

    • Загрузить образы брокера и оператора:

      docker pull quay.io/artemiscloud/activemq-artemis-operator:1.0.17
      docker tag quay.io/artemiscloud/activemq-artemis-operator:1.0.17 registry2.demo.stand:443/activemq-artemis-operator:1.0.17
      docker push registry2.demo.stand:443/activemq-artemis-operator:1.0.17
      docker pull quay.io/artemiscloud/activemq-artemis-broker-kubernetes@sha256:42230ce9d11a1949a5bb73b6ee218b1581f585bcd553485ee438e1c5b50fcf8b
      docker tag quay.io/artemiscloud/activemq-artemis-broker-kubernetes@sha256:42230ce9d11a1949a5bb73b6ee218b1581f585bcd553485ee438e1c5b50fcf8b registry2.demo.stand:443/activemq-artemis-broker-kubernetes:latest
      docker push registry2.demo.stand:443/activemq-artemis-broker-kubernetes:latest
      docker pull quay.io/artemiscloud/activemq-artemis-broker-init@sha256:264b33a9aad90d32a41258904f35092a141d76dcef0c115d414475444100aace
      docker tag quay.io/artemiscloud/activemq-artemis-broker-init@sha256:264b33a9aad90d32a41258904f35092a141d76dcef0c115d414475444100aace registry2.demo.stand:443/activemq-artemis-broker-init:latest
      docker push registry2.demo.stand:443/activemq-artemis-broker-init:latest

      В примере загружаются только последние версии образов.

  5. Подготовка git-репозитория оператора:

    В этом шаге мы клонируем git-репозиторий оператора ActiveMQ Artemis, создаем копию оригинального манифеста и заменяем источник образов на адрес локального Registry.

    • Создать каталог и клонировать в него git-репозиторий оператора:

      mkdir ~/artemis
      cd ~/artemis
      git clone https://github.com/artemiscloud/activemq-artemis-operator.git
    • Сделать копию оригинального манифеста, заменить источник образов на локальный registry:

      cd activemq-artemis-operator/deploy/
      cp operator.yaml operator_orig.yaml
      sed -i 's/quay.io\/artemiscloud/registry2.demo.stand:443/g' operator.yaml
      sed '/registry2.demo.stand/s/\(@sha256\S*\)/:latest/'  operator.yaml > operator_mod.yaml

Шаг 2. Действия в изолированном сегменте.

В этом шаге мы добавляем IP-адрес УК в локальную сеть изолированного сегмента и настраиваем DNS для записи registry2.demo.stand.

  1. Добавление на УК IP адреса и настройка DNS

    • Для прямого доступа к кластеру с УК на одном из мастер-узлов запустить прокси:

      kubectl proxy --address='10.20.0.12'

      где 10.20.0.12 – IP-адрес узла, порт по умолчанию - 8001.

    • Копируем на УК конфигурационный файл с того же узла:

      scp kuber@10.20.0.12:/home/kuber/.kube/config  ~/.kube/config
  2. Настройка доступа к кластеру с УК.

    В этом шаге мы настраиваем параметры доступа к кластеру Kubernetes, используя актуальный URL прокси, чтобы УК мог взаимодействовать с кластером.

    • Изменяем параметры кластера (kubernetes):

      - cluster:
          <…>
          proxy-url: http://10.20.0.12:8001
          server: ""
          name: kubernetes
    • После этого проверяем доступ к кластеру с помощью следующей команды:

      kubectl get nodes
  3. Обновление сертификатов на worker-узлах.

    Этот шаг включает обновление сертификатов на каждом worker-узле кластера, чтобы они могли доверять самоподписанным сертификатам, используемым в нашем Docker Registry.

    • Выполняем обновление сертификатов на каждом worker-узле кластера. Для этого скопируем созданный ранее корневой сертификат ca.crt в директорию /usr/local/share/ca-certificates/

    sudo scp username @10.20.0.100:/etc/docker-registry/certs/ca.crt  /usr/local/share/ca-certificates/
    • Затем обновляем сертификаты

      sudo update-ca-certificates
    • И перезапускаем containerd-deckhouse

      sudo systemctl restart containerd-deckhouse

Шаг 3. Запуск Registry и установка оператора и брокера сообщений.

В этом шаге мы подготавливаемся к установке, создавая namespace для оператора и настраивая контекст Kubernetes для установки. Затем мы устанавливаем оператор и создаем брокер ActiveMQ Artemis.

  1. Подготовка к установке

    Перед установкой необходимо подготовить среду. Сначала создаем namespace ` activemq-artemis-operator`, который будет использоваться для развертывания оператора.

    kubectl create namespace activemq-artemis-operator

    Затем устанавливаем context activemq и переключаемся на него с помощью следующих команд:

    kubectl config set-context activemq --namespace activemq-artemis-operator --cluster kubernetes --user kubernetes-admin
    kubectl config use-context activemq
  2. Установка оператора

    • Переходим в директорию с файлами оператора:

      cd ~/artemis/activemq-artemis-operator
    • И создаем файл install.sh со следующим содержимым:

      #!/bin/bash
      kubectl apply -f ./deploy/crdsbash
      kubectl apply -f ./deploy/service_account.yaml
      kubectl apply -f ./deploy/role.yaml
      kubectl apply -f ./deploy/role_binding.yaml
      kubectl apply -f ./deploy/election_role.yaml
      kubectl apply -f ./deploy/election_role_binding.yaml
      kubectl apply -f ./deploy/operator_mod.yaml
    • Затем запускаем скрипт для установки оператора:

      bash install.sh
      
      customresourcedefinition.apiextensions.k8s.io/activemqartemises.broker.amq.io created
      customresourcedefinition.apiextensions.k8s.io/activemqartemisaddresses.broker.amq.io created
      customresourcedefinition.apiextensions.k8s.io/activemqartemisscaledowns.broker.amq.io created
      customresourcedefinition.apiextensions.k8s.io/activemqartemissecurities.broker.amq.io created
      serviceaccount/activemq-artemis-controller-manager created
      role.rbac.authorization.k8s.io/activemq-artemis-operator-role created
      rolebinding.rbac.authorization.k8s.io/activemq-artemis-operator-rolebinding created
      role.rbac.authorization.k8s.io/activemq-artemis-leader-election-role created
      rolebinding.rbac.authorization.k8s.io/activemq-artemis-leader-election-rolebinding created
      deployment.apps/activemq-artemis-controller-manager created
    • Для проверки успешности запуска пода можно выполнить команду:

      kubectl get pod

      результат выполнения:

      NAME                                                 READY        STATUS     RESTARTS      AGE
      activemq-artemis-controller-manager-64745579b4-dhz7l   1/1        Running        0        5m58s
  3. Создание брокера

    • Для создания брокера подготовим файл artemis-broker.yaml c указанным содержимым:

      apiVersion: broker.amq.io/v1beta1
      kind: ActiveMQArtemis
      metadata:
        name: artemis-broker
        namespace: activemq-artemis-operator
      spec:
        deploymentPlan:
          size: 2
          persistenceEnabled: true
          messageMigration: true
          storage:
            storageClassName: localpath-deckhouse
        console:
          expose: true
          ingressHost: artemis.demo.stand

      В данном примере для создания StorageClass используется модуль LocalPathProvisioner в следующей конфигурации (default):

      apiVersion: deckhouse.io/v1alpha1
      kind: LocalPathProvisioner
      metadata:
        name: localpath-deckhouse
      spec:
        nodeGroups:
        - worker
        path: "/opt/local-path-provisioner"
        reclaimPolicy: "Delete"
    • Применить данный манифест:

      kubectl apply -f artemis-broker.yaml
      activemqartemis.broker.amq.io/artemis-broker created
    • Необходимо дождаться развертывания всех брокеров, это может занять несколько минут. Проверить статус можно, используя команду:

      kubectl get pod

      результат выполнения:

      NAME                                                   READY   STATUS    RESTARTS      AGE
      activemq-artemis-controller-manager-6d7b8c9dc8-86g6j   1/1     Running   1 (29s ago)   3m21s
      artemis-broker-ss-0                                    1/1     Running   0             3m21s
      artemis-broker-ss-1
    • Вэб-консоль будет доступна по адресу, указанному в параметре «ingressHost» манифеста (в данном примере это artemis.demo.stand)

      artemis login

Шаг 4. Вход в ActiveMQ

Для входа в консоль ActiveMQ используйте следующие учетные данные, которые хранятся в секрете и закодированы в формате Base64.

kubectl get secret   artemis-broker-credentials-secret  -o custom-columns=':data.AMQ_USER'| base64 -d ; echo " (Username)" && kubectl get secret   artemis-broker-credentials-secret  -o custom-columns=':data.AMQ_PASSWORD'| base64 -d ; echo " (Password)"

... (Username)
... (Password)

Вид консоли после входа в систему:

artemis interface

Шаг 5. Обеспечение внешнего доступа к брокеру

В этом шаге мы проверяем наличие необходимых Nodegroup и labels, включаем модуль MetalLB для обеспечения балансировки нагрузки, создаем Ingress controller для обработки внешнего трафика и создаем сервис для доступа к брокеру.

  1. Проверка наличия Nodegroup и labels

    • Проверьте наличие необходимых Nodegroup и labels на узлах них для запуска и доступа к брокеру. В случае их отсутствия - создайте согласно следующему манифесту:

      ---
      apiVersion: deckhouse.io/v1
      kind: NodeGroup
      metadata:
        name: worker
      spec:
        disruptions:
          approvalMode: Manual
        nodeTemplate:
          labels:
            node-role/metallb: ""
        nodeType: Static
      
      ---
      apiVersion: deckhouse.io/v1
      kind: NodeGroup
      metadata:
        name: master
      spec:
        disruptions:
          approvalMode: Manual
        nodeTemplate:
          labels:
            node-role.kubernetes.io/control-plane: ""
            node-role.kubernetes.io/master: ""
            node-role/metallb: ""
          taints:
          - effect: NoSchedule
            key: node-role.kubernetes.io/control-plane
        nodeType: Static
    • Проверьте установку нужного лейбла:

      kubectl get nodes -l node-role/metallb

      результат выполнения:

      NAME      STATUS   ROLES                  AGE   VERSION
      master1   Ready    control-plane,master   46h   v1.25.16
      master2   Ready    control-plane,master   46h   v1.25.16
      master3   Ready    control-plane,master   46h   v1.25.16
      worker1   Ready    worker                 46h   v1.25.16
      worker2   Ready    worker                 46h   v1.25.16
  2. Включение модуля metalLB

    • Включите (по умолчанию он выключен) модуль metalLB.
      Пример конфигурации:

      apiVersion: deckhouse.io/v1alpha1
      kind: ModuleConfig
      metadata:
        name: metallb
      spec:
        version: 1
        enabled: true
        settings:
          addressPools:
          - addresses:
            - 10.20.0.200-10.20.0.204
            name: master-pool
            protocol: layer2
          speaker:
            nodeSelector:
              node-role/metallb: ""
            tolerations:
            - effect: NoExecute
              key: dedicated.deckhouse.io
              operator: Equal
              value: master
  3. Создание Ingress controller

    • Для создания Ingress controller используется следующий манифест:

      apiVersion: deckhouse.io/v1
      kind: IngressNginxController
      metadata:
        name: main
      spec:
        ingressClass: nginx
        inlet: LoadBalancer
        nodeSelector:
          node-role.deckhouse.io/master: ""
        tolerations:
        - effect: NoExecute
          key: dedicated.deckhouse.io
          value: master
    • После создания проверьте, что сервис с типом LoadBalancer создан в namespace d8-ingress-nginx:

      kubectl -n d8-ingress-nginx get svc main-load-balancer

      результат выполнения:

      NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)               AGE
      main-load-balancer  LoadBalancer   10.222.102.101   10.20.0.200   80:30604/TCP,443:30232/TCP  30s
  4. Создание сервиса для доступа к брокеру

    • Для создания сервиса для доступа к брокеру с нестандартным селектором используется следующая команда:

    kubectl expose pod artemis-broker-ss-0 --type=LoadBalancer --selector='application=artemis-broker-app' --protocol=TCP --port=61616 --target-port=61616
    • После создания сервиса проверьте его наличие:

      kubectl get svc

      результат выполнения:

      NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                AGE
      artemis-broker-ss-0    LoadBalancer   10.222.121.191   10.20.0.201    61616:30381/TCP          9s