Как добавить сертификат в кластер

В развернутом кластере платформы “Штурвал” вы можете:

  • вручную или через ClusterConfig заменить сертификат, установленный в процессе инсталляции кластера, на промежуточный, корпоративный;
  • установить сертификат ACME (Automatic Certificate Management Environment).

ClusterConfig кластера вы можете получить:

  • в GUI: кластер управления → Администрирование → страница Кастомные ресурсы → API-группа cluster.shturval.techClusterConfig.
  • в CLI: кластер управления → команда kubectl -n ВВЕДИТЕ-ИМЯ-КЛАСТЕРА get clusterconfig ВВЕДИТЕ-ИМЯ-КЛАСТЕРА

Ниже сценарии замены по типам сертификатов.

Промежуточный сертификат

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

Подготовить резервную копию

В кластере перейдите в раздел “Резервное копирование и восстановление”. Убедитесь, что у вас подключено S3 хранилище или подключите его.

В резервную копию включите ресурсы, связанные с выпуском сертификатов и системными сервисами, которые используют сертификат.

Ненеймспейсные ресурсы:

  • shturvalserviceconfigs.

Неймспейсы:

Для любого типа кластера:

  • shturval-cd, если используется ArgoCD;
  • cert-manager.

Для кластера управления:

  • shturval-backend;
  • shturval-dashboards, если используется Grafana.

Неймспейсные ресурсы:

  • secrets;
  • clusterissuers.

Шаг 1. Подготовить сертификат

Чтобы сгенерировать промежуточный сертификат к существующей инфраструктуре, предлагается воспользоваться Step. Step представляет центр сертификации (CA) для автоматизированного управления сертификатами X.509.

  1. Сформируйте запрос на подпись сертификата (CSR) и сгенерируйте ключ промежуточного сертификата:
step certificate create "Intermediate CA Name" intermediate-ca.csr intermediate-ca.key --csr
  1. Отправьте intermediate-ca.csr на подпись администратору удостоверяющего корпоративного центра сертификации (Certificate Authority, CA).
  2. Получите подписанный промежуточный сертификат intermediate-ca.crt в формате PEM.
  3. Создайте цепочку сертификатов в формате PEM, например intermediate-ca-chain.crt:
cat intermediate-ca.crt root-ca.crt >intermediate-ca-chain.crt

Где intermediate-ca.crt - промежуточный сертификат, root-ca.crt - корпоративный корневой сертификат CA.

Для добавления в кластер потребуются:

  • цепочка intermediate-ca-chain.crt;
  • закрытый ключ intermediate-ca.key;
  • корпоративный корневой сертификат CA.

Шаг 2. Добавить в кластер

Сертификат можно обновить вручную в целевом кластере или через конфигурацию параметров ClusterConfig, если у вас есть доступ к кластеру управления и права на редактирование ресурса.

Заменить сертификат вручную

  1. В кластере перейдите в неймспейс cert-manager, откройте страницу Secrets раздела Хранилище и создайте секрет:
  • имя: corp-intermediate-ca;
  • тип: kubernetes.io/tls.
Скриншоты создания Secret corp-intermediate-ca

Переход к Secrets в cert-manager

Создание Secret corp-intermediate-ca

  1. Добавьте в Secret corp-intermediate-ca ключи с данными intermediate-ca-chain.crt и intermediate-ca.key.
Скриншоты добавления сертификата и ключа в Secret corp-intermediate-ca

Добавление ключа в Secret

Ключи Secret corp-intermediate-ca

Данные TLS в Secret corp-intermediate-ca

  1. В разделе Администрирование откройте страницу ClusterIssuers и создайте объект, указав корпоративный тип сертификата и имя секрета corp-intermediate-ca.
Скриншот ClusterIssuer для промежуточного сертификата

ClusterIssuer для промежуточного сертификата

  1. В неймспейсе cert-manager откройте ConfigMaps и найдите root-ca:
  • если ConfigMap root-ca есть, откройте его и замените значение ключа ca.crt данными корневого сертификата CA;
  • если ConfigMap root-ca нет, создайте его, добавьте ключ ca.crt и укажите в значении данные корневого сертификата CA.
Скриншот ConfigMap root-ca

ConfigMap root-ca

Шаг 3. Настроить системные сервисы

Если в кластере работают системные сервисы Grafana или ArgoCD, настройте их через ShturvalServicePatch (shturvalserviceconfigs). Это обеспечит корректную работу авторизации при переходе в сервисы из кластера.

Для кластера управления

Для кластера управления обновите:

  • Модуль программного управления Платформой (shturval-backend);
  • Модуль графического управления Платформой (shturval-frontend);
  • Модуль управления аутентификацией (shturval-auth).
Backend, Frontend, Auth

Подготовьте манифесты ресурсов ShturvalServicePatch для применения к спецификациям shturval-backend, shturval-frontend и shturval-auth. В блок customvalues добавьте параметры, как в примерах ниже.

Пример ShturvalServicePatch для backend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-backend
  customvalues:
    global:
      tls:
        enabled: true
        backend_tls_secretname: <ваше значение параметра>
        cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-backend-cert
backend_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
cluster_issuer_name Имя созданного ClusterIssuer string corp-acme
Пример ShturvalServicePatch для frontend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-frontend
  customvalues:
    tls:
      enabled: true
      front_tls_secretname: <ваше значение параметра>
      docs_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-frontend-cert
front_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
docs_tls_secretname Имя секрета для docs string docs-tls
cluster_issuer_name Имя созданного ClusterIssuer string corp-acme
Пример ShturvalServicePatch для auth
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-auth
  customvalues:
    tls:
      enabled: true
      auth_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-auth-cert
auth_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
cluster_issuer_name Имя созданного ClusterIssuer string corp-acme

Загрузите подготовленные ShturvalServicePatch через импорт манифестов. Нажмите на иконку импорта манифестов слева от имени пользователя, загрузите файлы или перетащите манифесты в открывшееся окно. Выполните проверку и нажмите Загрузить.

Скриншоты импорта манифестов для backend, frontend и auth

Импорт манифестов

Импорт ShturvalServicePatch для backend, frontend и auth

Чтобы проверить применение манифестов, перейдите в раздел Сервисы и репозитории, откройте страницу Установленные сервисы и перейдите к управлению нужным сервисом:

  • Модуль программного управления Платформой (shturval-backend);
  • Модуль графического управления Платформой (shturval-frontend);
  • Модуль управления аутентификацией (shturval-auth).

На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншоты примененных ShturvalServicePatch для backend, frontend и auth

Примененный ShturvalServicePatch для backend

Примененный ShturvalServicePatch для frontend

Примененный ShturvalServicePatch для auth

Grafana

Если используется Grafana, подготовьте манифест ShturvalServicePatch для применения к спецификации Модуля графического отображения метрик (Grafana) (shturval-dashboards). В блок customvalues добавьте параметры, как в примере ниже.

Пример ShturvalServicePatch для shturval-dashboards
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-dashboards
  customvalues:
    grafana.ini:
      security:
        cookie_secure: true
      auth.generic_oauth:
        tls_skip_verify_insecure: true
    ingress:
      annotations:
        cert-manager.io/cluster-issuer: <ваше значение параметра>
      enabled: true
      tls:
      - hosts:
        - <ваше значение параметра>
        secretName: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-dashboards-cert
grafana.ini.security.cookie_secure Настройка передачи файлов аутентификации Grafana по соединению HTTPS boolean true
grafana.ini.auth.generic_oauth.tls_skip_verify_insecure Настройка отключения проверки SSL/TLS-сертификата на сервисе аутентификации boolean true
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string corp-acme
tls.hosts Список хостов, для которых устанавливается TLS-соединение array dashboards.clustername.ip-10-11-11-13.shturval.link
tls.secretName Имя секрета для установления TLS-соединения, в котором будет сохранен сертификат для Grafana string dashboards-ingress-tls

Загрузите подготовленный ShturvalServicePatch через импорт манифестов.

Скриншоты импорта манифеста для Grafana

Импорт манифестов

Импорт ShturvalServicePatch для Grafana

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль графического отображения метрик (Grafana) (shturval-dashboards) и перейдите к управлению. На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншот примененного ShturvalServicePatch для Grafana

Примененный ShturvalServicePatch для Grafana

Для любого типа кластера
ArgoCD

Если используется ArgoCD, подготовьте манифест ShturvalServicePatch для применения к спецификации Модуля непрерывной доставки приложений (ArgoCD) (shturval-cd). В блок customvalues добавьте параметры, как в примере ниже.

Пример ShturvalServicePatch для shturval-cd
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName:  shturval-cd
  customvalues:
    server:
      ingress:
        annotations:
          cert-manager.io/cluster-issuer: <ваше значение параметра>
        enabled: true
        hostname: <ваше значение параметра>
        path: /
        pathType: Prefix
        tls: true
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-cd-cert
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string corp-acme
ingress.hostname Имя хоста сервера Argo CD string argocd.clustername.ip-10-11-11-13.shturval.link

Загрузите подготовленный ShturvalServicePatch через импорт манифестов.

Скриншоты импорта манифеста для ArgoCD

Импорт манифестов

Импорт ShturvalServicePatch для ArgoCD

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль непрерывной доставки приложений (ArgoCD) (shturval-cd) и перейдите к управлению. На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншот примененного ShturvalServicePatch для ArgoCD

Примененный ShturvalServicePatch для ArgoCD

Заменить сертификат через ClusterConfig

Шаг 1. Подготовить значения

Для обновления через ClusterConfig подготовьте значения в формате base64:

  • цепочка сертификатов intermediate-ca-chain.crt;
  • закрытый ключ промежуточного сертификата intermediate-ca.key;
  • корневой сертификат CA, если его нужно указать явно.
base64 -w0 intermediate-ca-chain.crt
base64 -w0 intermediate-ca.key
base64 -w0 root-ca.crt

Шаг 2. Обновить ClusterConfig

  1. Сохраните исходную конфигурацию, чтобы при ошибке можно было откатить изменения:
export CLUSTER_NAMESPACE=<неймспейс_кластера>
export CLUSTER_NAME=<имя_кластера>
kubectl -n "$CLUSTER_NAMESPACE" get clusterconfig "$CLUSTER_NAME" -o yaml > "clusterconfig-$CLUSTER_NAME-backup.yaml"
  1. Откройте ClusterConfig на редактирование:
kubectl -n "$CLUSTER_NAMESPACE" edit clusterconfig "$CLUSTER_NAME"
  1. В spec.systemServicesConfig.ingress укажите блок intermediateCA:
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterConfig
metadata:
  name: <имя_кластера>
  namespace: <неймспейс_кластера>
spec:
  clusterName: <имя_кластера>
  systemServicesConfig:
    ingress:
      intermediateCA:
        cert: <цепочка_сертификатов>
        key: <закрытый_ключ_промежуточного_сертификата>
        rootca: <корневой_сертификат>
Параметр Обязательность Описание
cert Да Цепочка сертификатов (промежуточный сертификат CA -> корневой CA) в формате PEM, закодированная в base64
key Да Ключ промежуточного сертификата, закодированный в base64
rootca Нет Корневой сертификат CA, закодированный в base64

После сохранения ClusterConfig cluster-manager обновит связанные ресурсы сертификата. Дополнительно обновлять системные сервисы не требуется.

ACME

Сертификат ACME автоматизирует получение SSL-сертификатов через ACME-сервер. Чтобы настроить автоматическую выдачу сертификатов через ACME-сервер, нужно получить корневой CA сертификат, который использует ACME-сервер, закодировать его данные и добавить сертификат в кластер вручную или через ClusterConfig.

Если в кластер добавлен сертификат ACME, необходимо мониторить работу ACME-сервера. В случае сбоя на сервере, кластеры с сертификатами ACME будут недоступны.

Подготовить резервную копию

В резервную копию включите ресурсы, связанные с ACME-сервером, cert-manager и системными сервисами, для которых будут выпускаться сертификаты.

Ненеймспейсные ресурсы:

  • shturvalserviceconfigs.

Неймспейсы:

Для любого типа кластера:

  • shturval-cd, если используется ArgoCD;
  • cert-manager.

Для кластера управления:

  • shturval-backend;
  • shturval-dashboards, если используется Grafana.

Неймспейсные ресурсы:

  • secrets;
  • clusterissuers.

Шаг 1. Подготовить ACME

Если в организации уже есть ACME-сервер, запросите у администратора корневой CA сертификат этого сервера.

Если ACME-сервера нет, можно установить step-ca и получить корневой CA сертификат. Использование в платформе корневого CA сертификата от step-ca обеспечит доверие ко всем сертификатам, которые будут выписаны сертификатом от step-ca.

step-ca можно установить несколькими способами. Ниже приведен пример установки через Docker-контейнер. При необходимости выберите другой способ установки в официальной документации step-ca.

  1. Создайте директорию для конфигурации и сертификатов:
mkdir data
chown 1000:1000 data
  1. Создайте файл docker-compose.yaml:
services:
  step-ca:
    container_name: step-ca
    image: smallstep/step-ca:0.27.2
    restart: always
    ports:
        - "9443:9000"
    environment:
       DOCKER_STEPCA_INIT_DNS_NAMES: issuer.ip-XX-XX-XXX-XX.shturval.link # the hostname(s) or IPs that the CA will accept requests on
       DOCKER_STEPCA_INIT_NAME: shturval # the name of your CA - this will be the issuer of your CA certificates
       DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT: true # enable remote provisioner management
       DOCKER_STEPCA_INIT_ACME: true # also create an initial ACME provisioner for the CA
       # DOCKER_STEPCA_INIT_PROVISIONER_NAME: admin # a label for the initial admin (JWK) provisioner.
       # DOCKER_STEPCA_INIT_SSH: "" # set this to a non-empty value to enable SSH certificate support
       # DOCKER_STEPCA_INIT_PASSWORD_FILE: "" # the location of a password file to be used for both private keys and the default CA provisioner.
       # DOCKER_STEPCA_INIT_PASSWORD: shturval # Normally, CA passwords will be generated for you. With this option, you can specify a password for the encrypted CA keys and the default CA provisioner.
    volumes:
        - ./data:/home/step # 1000:1000
    logging:
      driver: "json-file"
      options:
        max-size: "200m"

В параметре DOCKER_STEPCA_INIT_DNS_NAMES укажите DNS-имя, по которому отвечает сервер.

  1. Запустите step-ca:
# Запуск step-ca сервера
docker compose up -d
# Проверка запуска
docker compose ps

Если контейнер находится в состоянии UP, сервер готов выписывать сертификаты.

  1. Получите корневой CA сертификат сервера step-ca:
cat data/certs/root_ca.crt

Пример ответа:

-----BEGIN CERTIFICATE-----
MIIBoDCCAUagAwIBAgIRAJV9+1S0q+d9+V/UmBXhR+4wCgYIKoZIzj0EAwIwLjER
MA8GA1UEChMIc2h0dXJ2YWwxGTAXBgNVBAMTEHNodHVydmFsIFJvb3QgQ0EwHhcN
MjQxMTIyMTUyMzQ5WhcNMzQxMTIwMTUyMzQ5WjAuMREwDwYDVQQKEwhzaHR1cnZh
bDEZMBcGA1UEAxMQc2h0dXJ2YWwgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABNhNCtkBTfs+HXA6h1Ty8Qlg+zKQNu
-----END CERTIFICATE-----

Шаг 2. Добавить в кластер

Сертификат можно обновить вручную в целевом кластере или через конфигурацию параметров ClusterConfig, если у вас есть доступ к кластеру управления и права на редактирование ресурса.

Заменить сертификат вручную

  1. В кластере откройте страницу ClusterIssuers раздела Администрирование и создайте ClusterIssuer, например corp-acme.
Скриншоты создания ClusterIssuer

Переход к ClusterIssuers

Создание ClusterIssuer

  1. В блоке Спецификация объекта:
  • выберите тип ACME;
  • заполните адрес сервера ACME;
  • в CA Bundle загрузите корневой CA сертификат ACME-сервера;
  • в блоке Ключ учетной записи укажите имя секрета, в котором будет сохранен автоматически созданный ключ;
  • добавьте solver с типом http01 и значением nginx в ClassIngress.

Пример ClusterIssuer:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: corp-acme
spec:
  acme:
    caBundle: <корневой_CA_сертификат_ACME_сервера_base64>
    email: cluster@shturval.tech
    privateKeySecretRef:
      name: corp-acme
    server: https://issuer.ip-XX-XX-XX-XX.shturval.link:9443/acme/acme/directory
    solvers:
    - http01:
        ingress:
          class: nginx
Скриншот ClusterIssuer corp-acme

ClusterIssuer corp-acme

  1. В неймспейсе cert-manager откройте ConfigMaps и найдите root-ca:
  • если ConfigMap root-ca есть, откройте его и замените значение ключа ca.crt данными корневого сертификата CA от ACME;
  • если ConfigMap root-ca нет, создайте его, добавьте ключ ca.crt и укажите в значении данные корневого сертификата CA от ACME.
Скриншот ConfigMap root-ca

ConfigMap root-ca

Шаг 3. Настроить системные сервисы

Если в кластере работают системные сервисы Grafana или ArgoCD, настройте их через ShturvalServicePatch (shturvalserviceconfigs). Это обеспечит корректную работу авторизации при переходе в сервисы из кластера.

Для кластера управления

Для кластера управления обновите:

  • Модуль программного управления Платформой (shturval-backend);
  • Модуль графического управления Платформой (shturval-frontend);
  • Модуль управления аутентификацией (shturval-auth).
Backend, Frontend, Auth

Подготовьте манифесты ресурсов ShturvalServicePatch для применения к спецификациям shturval-backend, shturval-frontend и shturval-auth. В блок customvalues добавьте параметры, как в примерах ниже.

Пример ShturvalServicePatch для backend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-backend
  customvalues:
    global:
      tls:
        enabled: true
        backend_tls_secretname: <ваше значение параметра>
        cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-backend-cert
backend_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
cluster_issuer_name Имя созданного ClusterIssuer string corp-acme
Пример ShturvalServicePatch для frontend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-frontend
  customvalues:
    tls:
      enabled: true
      front_tls_secretname: <ваше значение параметра>
      docs_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-frontend-cert
front_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
docs_tls_secretname Имя секрета для docs string docs-tls
cluster_issuer_name Имя созданного ClusterIssuer string corp-acme
Пример ShturvalServicePatch для auth
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-auth
  customvalues:
    tls:
      enabled: true
      auth_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-auth-cert
auth_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
cluster_issuer_name Имя созданного ClusterIssuer string corp-acme

Загрузите подготовленные ShturvalServicePatch через импорт манифестов. Нажмите на иконку импорта манифестов слева от имени пользователя, загрузите файлы или перетащите манифесты в открывшееся окно. Выполните проверку и нажмите Загрузить.

Скриншоты импорта манифестов для backend, frontend и auth

Импорт манифестов

Импорт ShturvalServicePatch для backend, frontend и auth

Чтобы проверить применение манифестов, перейдите в раздел Сервисы и репозитории, откройте страницу Установленные сервисы и перейдите к управлению нужным сервисом:

  • Модуль программного управления Платформой (shturval-backend);
  • Модуль графического управления Платформой (shturval-frontend);
  • Модуль управления аутентификацией (shturval-auth).

На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншоты примененных ShturvalServicePatch для backend, frontend и auth

Примененный ShturvalServicePatch для backend

Примененный ShturvalServicePatch для frontend

Примененный ShturvalServicePatch для auth

Grafana

Если используется Grafana, подготовьте манифест ShturvalServicePatch для применения к спецификации Модуля графического отображения метрик (Grafana) (shturval-dashboards). В блок customvalues добавьте параметры, как в примере ниже.

Пример ShturvalServicePatch для shturval-dashboards
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-dashboards
  customvalues:
    grafana.ini:
      security:
        cookie_secure: true
      auth.generic_oauth:
        tls_skip_verify_insecure: true
    ingress:
      annotations:
        cert-manager.io/cluster-issuer: <ваше значение параметра>
      enabled: true
      tls:
      - hosts:
        - <ваше значение параметра>
        secretName: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-dashboards-cert
grafana.ini.security.cookie_secure Настройка передачи файлов аутентификации Grafana по соединению HTTPS boolean true
grafana.ini.auth.generic_oauth.tls_skip_verify_insecure Настройка отключения проверки SSL/TLS-сертификата на сервисе аутентификации boolean true
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string corp-acme
tls.hosts Список хостов, для которых устанавливается TLS-соединение array dashboards.clustername.ip-10-11-11-13.shturval.link
tls.secretName Имя секрета для установления TLS-соединения, в котором будет сохранен сертификат для Grafana string dashboards-ingress-tls

Загрузите подготовленный ShturvalServicePatch через импорт манифестов.

Скриншоты импорта манифеста для Grafana

Импорт манифестов

Импорт ShturvalServicePatch для Grafana

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль графического отображения метрик (Grafana) (shturval-dashboards) и перейдите к управлению. На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншот примененного ShturvalServicePatch для Grafana

Примененный ShturvalServicePatch для Grafana

Для любого типа кластера
ArgoCD

Если используется ArgoCD, подготовьте манифест ShturvalServicePatch для применения к спецификации Модуля непрерывной доставки приложений (ArgoCD) (shturval-cd). В блок customvalues добавьте параметры, как в примере ниже.

Пример ShturvalServicePatch для shturval-cd
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName:  shturval-cd
  customvalues:
    server:
      ingress:
        annotations:
          cert-manager.io/cluster-issuer: <ваше значение параметра>
        enabled: true
        hostname: <ваше значение параметра>
        path: /
        pathType: Prefix
        tls: true
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-cd-cert
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string corp-acme
ingress.hostname Имя хоста сервера Argo CD string argocd.clustername.ip-10-11-11-13.shturval.link

Загрузите подготовленный ShturvalServicePatch через импорт манифестов.

Скриншоты импорта манифеста для ArgoCD

Импорт манифестов

Импорт ShturvalServicePatch для ArgoCD

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль непрерывной доставки приложений (ArgoCD) (shturval-cd) и перейдите к управлению. На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншот примененного ShturvalServicePatch для ArgoCD

Примененный ShturvalServicePatch для ArgoCD

При переходе с самоподписного сертификата на ACME вход в Argo CD через SSO может завершиться ошибкой получения токена, см. раздел [Ошибка доверия после замены сертификата кластера на ACME](/ru2/cluster-admin/services/platform-services/app-delivery/shturval-cd/#argocd-sso-acme-ca-error).

Заменить сертификат через ClusterConfig

Шаг 1. Подготовить значения

Подготовьте:

  • CA bundle для проверки TLS-соединения с ACME-сервером;
  • адрес ACME-сервера;
  • корневой CA сертификат, если его нужно задать явно;
  • email для регистрации в ACME, если он используется.

Сертификаты укажите в base64:

base64 -w0 acme-ca-bundle.crt
base64 -w0 acme-root-ca.crt

Шаг 2. Обновить ClusterConfig

  1. Сохраните исходную конфигурацию, чтобы при ошибке можно было откатить изменения:
export CLUSTER_NAMESPACE=<неймспейс_кластера>
export CLUSTER_NAME=<имя_кластера>
kubectl -n "$CLUSTER_NAMESPACE" get clusterconfig "$CLUSTER_NAME" -o yaml > "clusterconfig-$CLUSTER_NAME-backup.yaml"
  1. Откройте ClusterConfig на редактирование:
kubectl -n "$CLUSTER_NAMESPACE" edit clusterconfig "$CLUSTER_NAME"
  1. В spec.systemServicesConfig.ingress.acmeConfig укажите параметры ACME-сервера:
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterConfig
metadata:
  name: <имя_кластера>
  namespace: <неймспейс_кластера>
spec:
  clusterName: <имя_кластера>
  systemServicesConfig:
    ingress:
      acmeConfig:
        acmerootcabundle: <CA_bundle_base64>
        acmeserverurl: https://issuer.ip-XX-XX-XX-XX.shturval.link:9443/acme/acme/directory
        acmerootca: <корневой_CA_сертификат_base64>
        email: cluster@shturval.tech
Параметр Обязательность Описание
acmerootcabundle Да CA bundle для проверки TLS-соединения с ACME-сервером, закодированный в base64. Может содержать цепочку публичных CA-сертификатов. Он передается в cert-manager как spec.acme.caBundle и нужен, чтобы cert-manager доверял TLS-сертификату корпоративного ACME-сервера
acmeserverurl Да Адрес ACME-сервера
acmerootca Нет Корневой CA сертификат, закодированный в base64. Если не указывать, корневой CA будет заполнен автоматически. Укажите acmerootca вручную, если нужно явно переопределить ранее заданный корневой CA сертификат
email Нет Email для регистрации в ACME

После сохранения ClusterConfig cluster-manager обновит связанные ресурсы сертификата. Дополнительно обновлять системные сервисы не требуется.

При переходе с самоподписного сертификата на ACME вход в Argo CD через SSO может завершиться ошибкой получения токена, см. раздел [Ошибка доверия после замены сертификата кластера на ACME](/ru2/cluster-admin/services/platform-services/app-delivery/shturval-cd/#argocd-sso-acme-ca-error).

Let’s Encrypt

Для создания сертификатов с помощью Let’s Encrypt необходимо, чтобы ingress-контроллер был доступен из сети Интернет. Должно выполняться хотя бы одно условие:

  • внешний балансировщик имеет белый (публичный) IP-адрес;
  • для IngressVIP указан белый (публичный) IP-адрес.

Подготовить резервную копию

В резервную копию включите ресурсы, связанные с cert-manager и системными сервисами, для которых Let’s Encrypt будет выпускать сертификаты.

Ненеймспейсные ресурсы:

  • shturvalserviceconfigs.

Неймспейсы:

Для любого типа кластера:

  • shturval-cd, если используется ArgoCD;
  • cert-manager.

Для кластера управления:

  • shturval-backend;
  • shturval-dashboards, если используется Grafana.

Неймспейсные ресурсы:

  • secrets;
  • clusterissuers.
Сертификат можно обновить вручную в целевом кластере или через конфигурацию параметров ClusterConfig, если у вас есть доступ к кластеру управления и права на редактирование ресурса.

Заменить сертификат вручную

Шаг 1. Создать ClusterIssuer

Создайте YAML-файл acme-issuer.yaml с манифестом объекта ClusterIssuer:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: <имя ресурса>
  namespace: cert-manager
spec:
  acme:
    server: <URL сервера Let's Encrypt>
    email: <email учетной записи Let's Encrypt>
    privateKeySecretRef:
      name: <имя секрета для ключа учетной записи>
    solvers:
    - http01:
        ingress:
          class: nginx
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ClusterIssuer string letsencrypt
acme.server URL адрес сервера Let’s Encrypt string https://acme-v02.api.letsencrypt.org/directory
acme.email Email учетной записи Let’s Encrypt string name@example.com
acme.privateKeySecretRef.name Имя секрета, в котором будет сохранен автоматически созданный ключ учетной записи string letsencrypt

Шаг 2. Применить манифест

Примените созданный манифест ClusterIssuer:

kubectl apply -f acme-issuer.yaml

Шаг 3. Настроить системные сервисы

Если в кластере работают системные сервисы Grafana или ArgoCD, настройте их через ShturvalServicePatch (shturvalserviceconfigs). Это обеспечит корректную работу авторизации при переходе в сервисы из кластера.

Для кластера управления

Для кластера управления обновите:

  • Модуль программного управления Платформой (shturval-backend);
  • Модуль графического управления Платформой (shturval-frontend);
  • Модуль управления аутентификацией (shturval-auth).
Backend, Frontend, Auth

Подготовьте манифесты ресурсов ShturvalServicePatch для применения к спецификациям shturval-backend, shturval-frontend и shturval-auth. В блок customvalues добавьте параметры, как в примерах ниже.

Пример ShturvalServicePatch для backend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-backend
  customvalues:
    global:
      tls:
        enabled: true
        backend_tls_secretname: <ваше значение параметра>
        cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-backend-cert
backend_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
cluster_issuer_name Имя созданного ClusterIssuer string letsencrypt
Пример ShturvalServicePatch для frontend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-frontend
  customvalues:
    tls:
      enabled: true
      front_tls_secretname: <ваше значение параметра>
      docs_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-frontend-cert
front_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
docs_tls_secretname Имя секрета для docs string docs-tls
cluster_issuer_name Имя созданного ClusterIssuer string letsencrypt
Пример ShturvalServicePatch для auth
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-auth
  customvalues:
    tls:
      enabled: true
      auth_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-auth-cert
auth_tls_secretname Имя секрета для установления TLS-соединения string shturval-tls
cluster_issuer_name Имя созданного ClusterIssuer string letsencrypt

Загрузите подготовленные ShturvalServicePatch через импорт манифестов. Нажмите на иконку импорта манифестов слева от имени пользователя, загрузите файлы или перетащите манифесты в открывшееся окно. Выполните проверку и нажмите Загрузить.

Скриншоты импорта манифестов для backend, frontend и auth

Импорт манифестов

Импорт ShturvalServicePatch для backend, frontend и auth

Чтобы проверить применение манифестов, перейдите в раздел Сервисы и репозитории, откройте страницу Установленные сервисы и перейдите к управлению нужным сервисом:

  • Модуль программного управления Платформой (shturval-backend);
  • Модуль графического управления Платформой (shturval-frontend);
  • Модуль управления аутентификацией (shturval-auth).

На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншоты примененных ShturvalServicePatch для backend, frontend и auth

Примененный ShturvalServicePatch для backend

Примененный ShturvalServicePatch для frontend

Примененный ShturvalServicePatch для auth

Grafana

Если используется Grafana, подготовьте манифест ShturvalServicePatch для применения к спецификации Модуля графического отображения метрик (Grafana) (shturval-dashboards). В блок customvalues добавьте параметры, как в примере ниже.

Пример ShturvalServicePatch для shturval-dashboards
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-dashboards
  customvalues:
    grafana.ini:
      security:
        cookie_secure: true
      auth.generic_oauth:
        tls_skip_verify_insecure: true
    ingress:
      annotations:
        cert-manager.io/cluster-issuer: <ваше значение параметра>
      enabled: true
      tls:
      - hosts:
        - <ваше значение параметра>
        secretName: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-dashboards-cert
grafana.ini.security.cookie_secure Настройка передачи файлов аутентификации Grafana по соединению HTTPS boolean true
grafana.ini.auth.generic_oauth.tls_skip_verify_insecure Настройка отключения проверки SSL/TLS-сертификата на сервисе аутентификации boolean true
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string letsencrypt
tls.hosts Список хостов, для которых устанавливается TLS-соединение array dashboards.clustername.ip-10-11-11-13.shturval.link
tls.secretName Имя секрета для установления TLS-соединения, в котором будет сохранен сертификат для Grafana string dashboards-ingress-tls

Загрузите подготовленный ShturvalServicePatch через импорт манифестов.

Скриншоты импорта манифеста для Grafana

Импорт манифестов

Импорт ShturvalServicePatch для Grafana

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль графического отображения метрик (Grafana) (shturval-dashboards) и перейдите к управлению. На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншот примененного ShturvalServicePatch для Grafana

Примененный ShturvalServicePatch для Grafana

Для любого типа кластера

ArgoCD

Если используется ArgoCD, подготовьте манифест ShturvalServicePatch для применения к спецификации Модуля непрерывной доставки приложений (ArgoCD) (shturval-cd). В блок customvalues добавьте параметры, как в примере ниже.

Пример ShturvalServicePatch для shturval-cd
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName:  shturval-cd
  customvalues:
    server:
      ingress:
        annotations:
          cert-manager.io/cluster-issuer: <ваше значение параметра>
        enabled: true
        hostname: <ваше значение параметра>
        path: /
        pathType: Prefix
        tls: true
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-cd-cert
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string letsencrypt
ingress.hostname Имя хоста сервера Argo CD string argocd.clustername.ip-10-11-11-13.shturval.link

Загрузите подготовленный ShturvalServicePatch через импорт манифестов.

Скриншоты импорта манифеста для ArgoCD

Импорт манифестов

Импорт ShturvalServicePatch для ArgoCD

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль непрерывной доставки приложений (ArgoCD) (shturval-cd) и перейдите к управлению. На вкладке Примененные ShturvalServicePatch отобразится загруженный ShturvalServicePatch.

Скриншот примененного ShturvalServicePatch для ArgoCD

Примененный ShturvalServicePatch для ArgoCD

Заменить сертификат через ClusterConfig

Шаг 1. Подготовить значения

Подготовьте URL сервера Let’s Encrypt и email учетной записи:

https://acme-v02.api.letsencrypt.org/directory

Шаг 2. Обновить ClusterConfig

  1. Сохраните исходную конфигурацию:
export CLUSTER_NAMESPACE=<неймспейс_кластера>
export CLUSTER_NAME=<имя_кластера>
kubectl -n "$CLUSTER_NAMESPACE" get clusterconfig "$CLUSTER_NAME" -o yaml > "clusterconfig-$CLUSTER_NAME-backup.yaml"
  1. Откройте ClusterConfig:
kubectl -n "$CLUSTER_NAMESPACE" edit clusterconfig "$CLUSTER_NAME"
  1. В spec.systemServicesConfig.ingress.acmeConfig укажите параметры Let’s Encrypt:
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterConfig
metadata:
  name: <имя_кластера>
  namespace: <неймспейс_кластера>
spec:
  clusterName: <имя_кластера>
  systemServicesConfig:
    ingress:
      acmeConfig:
        acmerootcabundle: <CA_base64>
        acmeserverurl: https://acme-v02.api.letsencrypt.org/directory
        email: name@example.com
Параметр Обязательность Описание Тип данных
acmeserverurl Да URL адрес сервера Let’s Encrypt string
email Нет Email учетной записи Let’s Encrypt string
acmerootcabundle Да Сертификат для проверки TLS-соединения с сервером, закодированный в base64. Может содержать цепочку публичных CA-сертификатов. Он передается в cert-manager как spec.acme.caBundle и нужен, чтобы cert-manager доверял TLS-сертификату корпоративного ACME-сервера. Для Let’s Encrypt получить СА wget https://letsencrypt.org/certs/isrgrootx1.pem string

После сохранения ClusterConfig cluster-manager обновит связанные ресурсы сертификата. Дополнительно обновлять системные сервисы не требуется.

Корпоративный сертификат

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

Обратите внимание! Для корректной работы команд потребуется OpenSSL версии не ниже 3.0.

Подготовить резервную копию

В резервную копию включите ресурсы, связанные с корпоративным сертификатом Ingress.

Ненеймспейсные ресурсы:

  • shturvalserviceconfigs.

Неймспейсы:

Для любого типа кластера:

  • ingress;
  • cert-manager.

Неймспейсные ресурсы:

  • secrets;
  • configmaps.

Шаг 1. Подготовить сертификат

  1. Создайте конфигурационный файл openssl-san.cnf. В блоке alt_names укажите доменное имя Ingress:
cat > openssl-san.cnf <<EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C=RU
ST=Moscow
L=Moscow
O=My Company
OU=Department
emailAddress=admin@example.com
CN = example.com

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = *.clustername.corp.domain

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
EOF

Где corp.domain - домен Ingress, с которым работает платформа.

  1. Создайте запрос на сертификат (CSR):
openssl req -newkey rsa:2048 -sha256 -days 365 -nodes -keyout tls.key -out tls.csr -extensions req_ext -config openssl-san.cnf
  1. Отправьте tls.csr на подпись в ваш удостоверяющий центр (Certificate Authority, CA).
  2. Получите подписанный сертификат в формате PEM и переименуйте его в tls.crt.

Для добавления корпоративного сертификата в кластер потребуется:

  • корпоративный сертификат в формате PEM, содержащий конечный сертификат, промежуточные сертификаты CA и корневой CA. Сертификат должен быть выпущен центром сертификации или быть самоподписанным для доменного имени Ingress;
  • закрытый ключ корпоративного сертификата Ingress tls.key.

Шаг 2. Добавить в кластер

Сертификат можно обновить вручную в целевом кластере или через конфигурацию параметров ClusterConfig, если у вас есть доступ к кластеру управления и права на редактирование ресурса.

Заменить сертификат вручную

  1. В неймспейсе cert-manager откройте ConfigMaps, найдите root-ca и измените значение ключа ca.crt. В значении должен быть корпоративный корневой сертификат.
Скриншоты изменения ConfigMap root-ca

ConfigMap root-ca

Ключ ca.crt в ConfigMap root-ca

  1. Сохраните изменения в ConfigMap root-ca.
  2. В неймспейсе ingress откройте страницу Secrets раздела Хранилище и создайте секрет:
  • имя: corp-tls;
  • тип: kubernetes.io/tls.
Скриншоты создания Secret corp-tls

Создание Secret corp-tls

Тип Secret corp-tls

  1. Добавьте корпоративный конечный сертификат и его ключ в Secret corp-tls.
Скриншоты добавления сертификата и ключа в Secret corp-tls

Данные сертификата в Secret corp-tls

Данные ключа в Secret corp-tls

  1. Сохраните Secret corp-tls.

Настроить ingress-controller

Чтобы внести изменения в customvalues Модуля управления внешними подключениями (shturval-ingress-controller), подготовьте ShturvalServicePatch:

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-ingress-controller
  customvalues:
    controller:
      extraArgs:
        default-ssl-certificate: "ingress/corp-tls"
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого ShturvalServicePatch string shturval-ingress-controller-cert

Загрузите манифест через импорт манифестов в графическом интерфейсе. Нажмите на иконку импорта манифестов слева от имени пользователя, загрузите файл с подготовленным манифестом ShturvalServicePatch для shturval-ingress-controller или перетащите манифест в открывшееся окно. Выполните проверку и нажмите Загрузить.

Скриншоты импорта ShturvalServicePatch для ingress-controller

Импорт манифестов

Импорт ShturvalServicePatch для ingress-controller

После применения на странице Установленные сервисы откройте Модуль управления внешними подключениями (shturval-ingress-controller) и проверьте:

  • на вкладке Примененные ShturvalServicePatch отображается загруженный ShturvalServicePatch;
  • на вкладке Сервис статус изменился на Patched.
Скриншоты примененного ShturvalServicePatch для ingress-controller

Примененный ShturvalServicePatch для ingress-controller

Статус Patched для ingress-controller

Заменить сертификат через ClusterConfig

Шаг 1. Подготовить значения

Подготовьте значения в формате base64:

  • корпоративный сертификат Ingress;
  • закрытый ключ корпоративного сертификата Ingress;
  • корневой сертификат для Ingress.
base64 -w0 tls.crt
base64 -w0 tls.key
base64 -w0 root-ca.crt

Шаг 2. Обновить ClusterConfig

  1. Сохраните исходную конфигурацию:
export CLUSTER_NAMESPACE=<неймспейс_кластера>
export CLUSTER_NAME=<имя_кластера>
kubectl -n "$CLUSTER_NAMESPACE" get clusterconfig "$CLUSTER_NAME" -o yaml > "clusterconfig-$CLUSTER_NAME-backup.yaml"
  1. Откройте ClusterConfig:
kubectl -n "$CLUSTER_NAMESPACE" edit clusterconfig "$CLUSTER_NAME"
  1. В spec.systemServicesConfig.ingress.wildcardCert укажите корпоративный сертификат:
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterConfig
metadata:
  name: <имя_кластера>
  namespace: <неймспейс_кластера>
spec:
  clusterName: <имя_кластера>
  systemServicesConfig:
    ingress:
      wildcardCert:
        ingresscert: <корпоративный_сертификат_ingress>
        ingresskey: <закрытый_ключ_корпоративного_сертификата_ingress>
        rootingresscert: <корневой_сертификат_ingress>
Параметр Обязательность Описание При ручном способе указывается
ingresscert Нет Корпоративный сертификат Ingress. Значение должно быть закодировано в base64 В неймспейсе ingress в Secret corp-tls, данные сертификата
ingresskey Нет Закрытый ключ корпоративного сертификата Ingress. Значение должно быть закодировано в base64 В неймспейсе ingress в Secret corp-tls, данные ключа
rootingresscert Нет Корневой сертификат для Ingress. Значение должно быть закодировано в base64 В неймспейсе cert-manager в ConfigMap root-ca, ключ ca.crt

После изменения корпоративного сертификата через ClusterConfig cluster-manager обновит:

  • корневой сертификат в неймспейсе cert-manager;
  • секрет в неймспейсе ingress с сертификатом;
  • ShturvalServiceConfig shturval-ingress-controller.