Развертывание ActiveMQ Artemis в Deckhouse Kubernetes
Процесс подготовки и развертывания ActiveMQ Artemis в Kubernetes включает несколько шагов, обеспечивающих правильную работу и доступность брокера сообщений.
Шаг 1. Предварительные работы в общем сегменте.
На установочном компьютере (УК) в данном примере используется ip адрес 10.20.0.100 и имя registry2.demo.stand.
-
Создание каталогов и запись в 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
-
-
Создание сертификатов
В этом шаге мы создаем самоподписанные сертификаты для обеспечения безопасного соединения через 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
Перезагрузите машину для обеспечения корректной работы новых сертификатов.
-
-
Запуск 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
-
-
Загрузка образов брокера и оператора.
В этом шаге мы загружаем образы оператора и брокера в наш 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
В примере загружаются только последние версии образов.
-
-
Подготовка 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.
-
Добавление на УК 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
-
-
Настройка доступа к кластеру с УК.
В этом шаге мы настраиваем параметры доступа к кластеру Kubernetes, используя актуальный URL прокси, чтобы УК мог взаимодействовать с кластером.
-
Изменяем параметры кластера (kubernetes):
- cluster: <…> proxy-url: http://10.20.0.12:8001 server: "" name: kubernetes
-
После этого проверяем доступ к кластеру с помощью следующей команды:
kubectl get nodes
-
-
Обновление сертификатов на 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.
-
Подготовка к установке
Перед установкой необходимо подготовить среду. Сначала создаем 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
-
Установка оператора
-
Переходим в директорию с файлами оператора:
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
-
-
Создание брокера
-
Для создания брокера подготовим файл
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)
-
Шаг 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)
Вид консоли после входа в систему:
Шаг 5. Обеспечение внешнего доступа к брокеру
В этом шаге мы проверяем наличие необходимых Nodegroup и labels, включаем модуль MetalLB для обеспечения балансировки нагрузки, создаем Ingress controller для обработки внешнего трафика и создаем сервис для доступа к брокеру.
-
Проверка наличия 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
-
-
Включение модуля 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
-
-
Создание 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
-
-
Создание сервиса для доступа к брокеру
-
Для создания сервиса для доступа к брокеру с нестандартным селектором используется следующая команда:
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
-