Развертывание в кластере Kubernetes#

На этой стадии происходит развертывание платформы в кластере Kubernetes.

../../../_images/day1-lb-green.svg ../../../_images/day1-deploy-blue.svg ../../../_images/day1-subscription-white.svg ../../../_images/day1-test-white.svg ../../../_images/day1-lb-green.svg ../../../_images/day1-deploy-blue.svg ../../../_images/day1-subscription-dark.svg ../../../_images/day1-test-dark.svg

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

Установка контроллера Ingress#

Если отсутствует контроллер Ingress, установите его с помощью менеджер пакетов Helm:

  1. Добавьте пакет Ingress в индексную базу Helm:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    

    Информационное сообщение от команды:

    "ingress-nginx" has been added to your repositories
    
  2. Обновите репозиторий Helm:

    helm repo update
    

    Информационное сообщение от команды:

    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈Happy Helming!⎈
    

    Примечание

    Обе предыдущие команды выполняют настройку на вашей рабочей станции, где вы используете утилиту helm. Поэтому, если по какой-либо причине вам надо повторить развертывание, можно эти шаги пропустить.

  3. Установите сервис Ingress в Kubernetes:

    helm install ingress-nginx ingress-nginx/ingress-nginx
    

    Информационное сообщение от команды:

    Installation output
    NAME: ingress-nginx
    LAST DEPLOYED: Tue Oct 14 11:33:56 2025
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the load balancer IP to be available.
    You can watch the status by running 'kubectl get service --namespace default ingress-nginx-controller --output wide --watch'
    
    An example Ingress that makes use of the controller:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: example
        namespace: foo
      spec:
        ingressClassName: nginx
        rules:
          - host: www.example.com
            http:
              paths:
                - pathType: Prefix
                  backend:
                    service:
                      name: exampleService
                      port:
                        number: 80
                  path: /
        # This section is only required if TLS is to be enabled for the Ingress
        tls:
          - hosts:
            - www.example.com
            secretName: example-tls
    
    If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
    
      apiVersion: v1
      kind: Secret
      metadata:
        name: example-tls
        namespace: foo
      data:
        tls.crt: <base64 encoded cert>
        tls.key: <base64 encoded key>
      type: kubernetes.io/tls
    
  4. Настройте сервис Ingress на возможность установления соединения через WebSocket между сервисами receptor на внешних исполняющих узлах (execution nodes) и внутреннем переходном узле (hop node), не терминируя соединения, использующие TLS/SSL:

    helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.extraArgs.enable-ssl-passthrough=true
    

Установка операторов#

Установите все операторы Astra Automation:

kubectl apply -f operators/

Информационное сообщение от команды:

Installation output
namespace/astra-automation created
customresourcedefinition.apiextensions.k8s.io/aabackups.aa.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/aarestores.aa.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/aas.aa.astra-automation.ru created
serviceaccount/aa-operator-aa-manager created
role.rbac.authorization.k8s.io/aa-operator-leader-election-role created
role.rbac.authorization.k8s.io/aa-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/aa-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/aa-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/aa-operator-leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/aa-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/aa-operator-proxy-rolebinding created
service/aa-operator-aa-manager-metrics-service created
deployment.apps/aa-operator-aa-manager created
namespace/astra-automation configured
customresourcedefinition.apiextensions.k8s.io/acbackups.ac.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/acmeshingresses.ac.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/acrestores.ac.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/acs.ac.astra-automation.ru created
serviceaccount/ac-operator-ac-manager created
role.rbac.authorization.k8s.io/ac-operator-ac-manager-role created
role.rbac.authorization.k8s.io/ac-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/ac-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/ac-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/ac-operator-ac-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/ac-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/ac-operator-proxy-rolebinding created
configmap/ac-operator-ac-manager-config created
service/ac-operator-automationcontroller-manager-metrics-service created
deployment.apps/ac-operator-ac-manager created
namespace/astra-automation configured
customresourcedefinition.apiextensions.k8s.io/pahbackups.pah.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/pahrestores.pah.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/pahs.pah.astra-automation.ru created
serviceaccount/pah-operator-sa created
role.rbac.authorization.k8s.io/pah-operator-leader-election-role created
role.rbac.authorization.k8s.io/pah-operator-pah-operator-role created
role.rbac.authorization.k8s.io/pah-operator-proxy-role created
clusterrole.rbac.authorization.k8s.io/pah-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/pah-operator-pah-operator-cluster-role created
rolebinding.rbac.authorization.k8s.io/pah-operator-leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/pah-operator-pah-operator-rolebinding created
rolebinding.rbac.authorization.k8s.io/pah-operator-proxy-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/pah-operator-pah-operator-cluster-rolebinding created
configmap/pah-operator-pah-operator-config created
service/pah-operator-pah-manager-metrics-service created
deployment.apps/pah-operator-pah-manager created
namespace/astra-automation configured
customresourcedefinition.apiextensions.k8s.io/edabackups.eda.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/edarestores.eda.astra-automation.ru created
customresourcedefinition.apiextensions.k8s.io/edas.eda.astra-automation.ru created
serviceaccount/eda-operator-eda-manager created
role.rbac.authorization.k8s.io/eda-operator-eda-manager-role created
role.rbac.authorization.k8s.io/eda-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/eda-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/eda-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/eda-operator-eda-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/eda-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/eda-operator-proxy-rolebinding created
service/eda-operator-eda-manager-metrics-service created
deployment.apps/eda-operator-eda-manager created

Команда создает новое пространство имен – astra-automation – с операторами внутри нее. В этом пространстве будут создаваться все объекты центральной части платформы. Проверьте готовность подов:

kubectl -n astra-automation get pods

Они должны быть в состоянии Running:

NAME                                        READY   STATUS    RESTARTS   AGE
aa-operator-aa-manager-76d84985d9-bpll6     2/2     Running   0          2m19s
ac-operator-ac-manager-748f66f8b8-jnf4x     2/2     Running   0          2m16s
eda-operator-eda-manager-644b75748d-7dlzr   2/2     Running   0          2m11s
pah-operator-pah-manager-68c859659b-6jsv4   2/2     Running   0          2m14s

Создание секретов#

Для каждой группы секретов или одиночных секретов у вас есть файл с манифестом. Создайте необходимые секреты с помощью этих файлов, используя команду вида:

kubectl apply -f <path/to/file.yml>

Здесь <path/to/file.yml> – путь к файлу с манифестом.

Развертывание базовой топологии Astra Automation#

Развертывание полной платформы состоит из следующих этапов.

Развертывание центральных компонентов#

Для развертывания центральной части необходимо применить ранее подготовленный манифест:

kubectl apply -f <path/to/manifest.yml>

Процесс может занять около 20 минут. Окончание развертывания проверяйте по журналу:

kubectl logs -n astra-automation aa-operator-aa-manager-76d84985d9-bpll6 -c manager

Завершение обозначено заключительной секцией как при обычном выполнении набора сценариев Ansible.

Первичная настройка#

Проверьте с помощью браузера, что вы можете подключиться к шлюзу, используя URL https://<ip or domain.name>, по его IP-адресу или доменному имени и пройти аутентификацию с учетной записью администратора.

После этого активируйте подписку, чтобы перейти в панель управления Astra Automation.

Добавление исполняющего узла#

Согласно схеме необходимо добавить внешний исполняющий узел, связанный с управляющим узлом через рецепторы:

  1. На панели навигации выберите Automation Execution > Infrastructure > Instances и начните добавлять узел, нажав на кнопку Create instance.

  2. В окне Create instance настройте следующие поля:

    • Host name: <IP address>;

    • Listener port: 27199;

    • Instance type: Execution;

    • Options: выберите все опции: Enable instance, Managed by policy и Peers from control panel.

  3. После применения этих настроек открывается окно с кнопкой Download bundle для выгрузки установочного пакета. Выгрузите этот пакет на вашу станцию и распакуйте этот пакет. Для использования загруженного пакета на станции должен быть установлен пакет Ansible Core. Перейдите в распакованный каталог.

  4. Убедитесь, что в файле описания инвентаря inventory.yml правильно настроены следующие параметров (согласно настройкам в добавляемом узле):

    • ansible_user – название учетной записи с административными привилегиями, например admin;

    • ansible_ssh_private_key_file – путь к приватному ключу SSH для этой учетной записи, например ~/.ssh/id_ed25519.

  5. Выполните сценарий настройки узла:

    ansible-navigator run --eei hub.astra-automation.ru/aa-2.0/aa-full-ee:latest \
    install_receptor.yml -i inventory.yml -m stdout
    

    По завершении выполнения сценария выводится строка вида:

    PLAY RECAP **********************************************************************************************
    remote-execution  : ok=71   changed=40   unreachable=0    failed=0    skipped=10   rescued=0    ignored=0
    
  6. В графической консоли платформы убедитесь, что состояние добавленного узла стало Ready.

Развертывание топологии уровня предприятия#

Процесс состоит из следующих стадий.

Развертывание центральной части#

Выполните следующие шаги для развертывания отказоустойчивой платформы:

  1. Задайте количество реплик, например 3, для каждого установленного оператора:

    kubectl scale deployment aa-operator-aa-manager --namespace astra-automation --replicas=3
    kubectl scale deployment ac-operator-ac-manager --namespace astra-automation --replicas=3
    kubectl scale deployment eda-operator-eda-manager --namespace astra-automation --replicas=3
    kubectl scale deployment pah-operator-pah-manager --namespace astra-automation --replicas=3
    

    После выполнения команд, каждый объект deployment должен содержать три реплики:

    kubectl -n astra-automation get deployments
    
  2. Убедитесь, что на стадии подготовки вы настроили файлы с манифестами секретов в соответствии с рекомендациями, и примените каждый из них с помощью команды вида:

    kubectl apply -f <path/to/secret.yml>
    

    где <path/to/secret.yaml> – путь к файлу, содержащему манифест соответствующих секретов в формате YAML.

    У вас должны быть файлы с манифестами для следующих секретов:

    • доступ к хранилищу S3 для Private Automation Hub;

    • доступы к базам данных PosgreSQL для всех компонентов платформы;

    • секреты для шифрования чувствительных данных в базах данных;

    • пароль администратора платформы;

    • параметры TLS для защиты данных, передаваемых по сети;

  3. Запустите процесс развертывания платформы:

    kubectl apply -f <path/to/application-manifest.yml>
    

    где <path/to/application-manifest.yml> – путь к файлу, содержащему манифест приложения.

  4. Если необходимо обеспечить возможность установления соединений от исполнительных узлов к Automation Controller, добавьте Mesh Ingress:

    kubectl apply -f <path/to/mesh-ingress.yml>
    

    где <path/to/mesh-ingress.yml> – путь к файлу, содержащему манифест Mesh Ingress.

Контроль процесса развертывания#

После выполнения команды развертывания платформы потребуется некоторое время на запуск и настройку всех подов. Состояние развертывания можно проверить с помощью команды:

watch -n 5 "kubectl get aas aa-demo -n astra-automation -o jsonpath='{.status.conditions}'"

где aa-demo – название приложения, которое вы указали в манифесте приложения.

Выход из команды производится с помощью комбинации клавиш Ctrl+C.

При установленной утилите jq можно получить более удобный формат вывода:

watch -n 5 "kubectl get aas aa-demo -n astra-automation -o jsonpath='{.status.conditions}' | jq "

По завершении развертывания платформы вывод имеет следующий вид:

[
   {
      "lastTransitionTime": "2025-10-27T14:45:52Z",
      "message": "",
      "reason": "",
      "status": "False",
      "type": "Failure"
   },
   {
      "lastTransitionTime": "2025-10-27T14:45:52Z",
      "message": "Last reconciliation succeeded",
      "reason": "Successful",
      "status": "True",
      "type": "Successful"
   },
   {
      "lastTransitionTime": "2025-10-27T14:45:52Z",
      "message": "Awaiting next reconciliation",
      "reason": "Successful",
      "status": "True",
      "type": "Running"
   }
]

Ключевые моменты:

  • В секции, где "type": "Failure", поле message пустое.

  • В секции, где "type": "Successful", поле message содержит сообщение Last reconciliation succeeded.

  • В секции, где "type": "Running", поле message содержит сообщение Awaiting next reconciliation.

Для более подробной информации следует изучить журнал выполнения сценария развертывания, предварительно узнав полное название пода aa-operator-aa-manager.

  1. Узнайте полное название пода aa-operator-aa-manager:

    kubectl get pods -n astra-automation | grep aa-operator
    

    Выходные данные имеют следующий вид:

    aa-operator-aa-manager-76d84985d9-hmswf     2/2     Running   0          6m33s
    
  2. Используйте полное название пода aa-operator-aa-manager для просмотра журнала выполнения сценария развертывания:

    kubectl logs -n astra-automation -f <aa-operator-aa-manager full name> -c manager
    

    Аргумент -f требует постоянного обновления данных, полученных из журнала.

Журнал показывает ход выполнения сценария и возникающие ошибки. Итоговый вывод PLAY RECAP сообщает об успешном или неудачном завершении сценария. Продукт полностью развернут при успешном выполнении сценария и PLAY RECAP с полем failed=0 вида:

{"level":"info","ts":"2025-10-21T11:10:20Z","logger":"runner","msg":"Ansible-runner exited successfully","job":"182878699511911518","name":"aa-demo","namespace":"astra-automation"}

----- Ansible Task Status Event StdOut (aa.astra-automation.ru/v1alpha1, Kind=AstraAutomation, aa-demo/astra-automation) -----


PLAY RECAP *********************************************************************
localhost                  : ok=195  changed=2    unreachable=0    failed=0    skipped=103  rescued=0    ignored=0

Активация лицензии#

С помощью браузера обратитесь по URL, настроенному в манифесте приложения, например https://aa.demo.example.com/. Активируйте лицензию подписки.

Добавление плоскости исполнения#

Согласно рекомендуемой топологии необходимо добавить два исполнительных узла, один из которых должен быть связан с плоскостью управления через промежуточный узел. Здесь можно применить один из подходов:

  • Добавить каждый из узлов последовательно, как описано в базовой топологии. Для подключения узла типа execution через узел hop, надо сначала добавить узел hop, а затем execution.

  • Добавить все узлы сразу с помощью утилиты ansible-navigator.

Рассмотрим второй вариант, поскольку предыдущий был уже описан ранее.

  1. Подготовьте приватный ключ SSH, который предоставляет пользователю доступ к добавляемым узлам с привилегиями администратора.

  2. Убедитесь, что у вас подготовлены узлы для плоскости исполнения в соответствии с рекомендациями.

  3. Создайте токен доступа для пользователя admin:

    • В панели навигации веб-интерфейса перейдите к Access Management > Users.

    • В списке пользователей выберите admin.

    • Переключитесь на вкладку Tokens и нажмите кнопку Create token. В поле Scope выберите Write. Нажмите внизу кнопку Create token и сохраните токен в надежном месте, поскольку после закрытия окна он не будет более доступен.

  4. Подготовьте файл описания инвентаря, например inventory.yml, следующего вида:

    ---
    all:
      vars:
        ac_host: "https://aa.demo.example.com"
        ac_token: "6JShbAmkz9k5QyMKGX6ZUGTCjfZzJs"
        ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
    
      children:
        hop_nodes:
          hosts:
            hop-node-01:
              ansible_host: 10.177.93.56
              ansible_user: admin
              ansible_ssh_private_key_file: keys/id_ed25519
        execution_nodes:
          hosts:
            exec-node-01:
              ansible_host: 10.177.93.13
              ansible_user: admin
              ansible_ssh_private_key_file: keys/id_ed25519
              hop_node_related: "hop-node-01"
              peers_from_control_nodes: false
    

    Файл содержит настройки общих переменных и настройки параметров доступа для переходных узлов (группа hop_nodes) и исполняющих узлов (группа execution_nodes). В файле необходимо задать следующие переменные в соответствии с параметрами добавляемых узлов:

    • ac_host: URL к шлюзу платформы;

    • ac_token: подготовленный токен для пользователя admin;

    • ansible_host: IP-адрес соответствующего узла;

    • ansible_user: название учетной записи с привилегиями администратора на соответствующем узле;

    • ansible_ssh_private_key_file: относительный путь к приватному ключу SSH для этой учетной записи;

    • hop_node_related (требуется, если подключение идет через hop node): параметр подключения к узлу hop в виде значения inventory_hostname или receptor_address ID, если узел hop уже существует;

    • peers_from_control_nodes: true, если подключение будет напрямую к плоскости управления (предыдущий параметр игнорируется), или false, если через hop.

  5. Выполните сценарии настройки и подключения узлов:

    ansible-navigator run --eei hub.astra-automation.ru/aa-2.0/aa-full-ee:latest \
    <playbook.yml> -i inventory.yml -m stdout
    

    По завершении выполнения сценария Ansible выводит типовую секция PLAY RECAP.

  6. В графической консоли платформы убедитесь, что появились новые узлы плоскости исполнения и их состояние Ready. Для этого на панели выберите следующие окна:

    • Automation Execution > Infrastructure > Instances для просмотра списка узлов, например:

      ../../../_images/instance-list.png
    • Automation Execution > Infrastructure > Topology View для просмотра топологии, например:

      ../../../_images/topology-view.png