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

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

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

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

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

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

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

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

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

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

В кластере перейдите в раздел “Резервное копирование и восстановление”. Убедитесь, что у вас подключено 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 обновит связанные ресурсы сертификата. Дополнительно обновлять системные сервисы не требуется.

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

Корпоративный сертификат — готовый конечный сертификат (wildcard или на конкретные домены), который удостоверяющий центр компании уже выписал.

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

Способ добавления в кластер на шаге 2 зависит от сертификата:

  • Wildcard (например, *.clustername.corp.domain) можно добавить в кластер вручную или через ClusterConfig.
  • Список конкретных имён (без *) можно добавить только вручную. Через ClusterConfig cluster-manager записывает сертификат wildcard.

Корпоративный сертификат задаётся как сертификат по умолчанию в Ingress-контроллере и не прописывается в каждой записи Ingress. Чтобы контроллер его подставил, в записях не должно быть ни ClusterIssuer, ни своих сертификатов.

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

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

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

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

  • shturvalserviceconfigs.

Неймспейсы:

  • shturval-cd (при использовании ArgoCD);
  • ingress;
  • cert-manager.

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

  • shturval-backend
  • shturval-frontend
  • shturval-auth
  • shturval-dashboards (при использовании Grafana)

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

  • 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, с которым работает платформа. Пример выше — wildcard: его можно добавить и вручную, и через ClusterConfig.

Если сертификат нужен на список имён, в alt_names перечислите их явно, без *.

[ alt_names ]
DNS.1 = ingress.clustername.corp.domain
DNS.2 = dashboards.clustername.corp.domain
  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. Эти данные указываются в Secret;
  • закрытый ключ корпоративного сертификата Ingress;
  • корневой сертификат вашего удостоверяющего центра или цепочка до него. Его выдаёт администратор этого центра вместе с подписанным сертификатом. Сохраните полученный PEM под именем, например, root-ca.crt.

Проверьте файлы сертификатов до загрузки в кластер: Проверить файлы до загрузки в кластер.

Проверка уже работающего Ingress — в разделе Проверить сертификат.

Проверить файлы до загрузки в кластер

До загрузки в кластер проверьте:

  1. Сертификат для Ingress подписан вашим удостоверяющим центром: от сертификата в tls.crt через промежуточные до корневого сертификата.
openssl verify -show_chain -CAfile root-ca.crt -untrusted tls.crt tls.crt
Параметр Описание
tls.crt в конце команды Сертификат, который проверяют. OpenSSL читает из файла только первый блок. В tls.crt первым записан сертификат для Ingress, его команда и проверяет.
untrusted tls.crt Промежуточные сертификаты CA.
root-ca.crt Корневой сертификат CA. Проверка успешна, когда цепочка доходит до корневого сертификата вашего удостоверяющего центра в этом файле.

Если корневой сертификат положили последним блоком в tls.crt и отдельного root-ca.crt нет, скопируйте этот последний блок в root-ca.crt и оставьте его в -CAfile. Без -CAfile команда не подтвердит сертификат. Промежуточные в tls.crt OpenSSL использует только как ступени и их доверенными не считает.

В ответе должна быть строка tls.crt: OK. OpenSSL выводит цепочку сверху вниз: сертификат для Ingress, затем промежуточные, в конце корневой сертификат из root-ca.crt. Если вместо OK написано error: корневой сертификат другой или в tls.crt нет того промежуточного сертификата, которым подписан сертификат Ingress.

  1. Какие сертификаты лежат в файле, кто выдал (подписал) сертификат и кому он выдан.
openssl crl2pkcs7 -nocrl -certfile tls.crt \
  | openssl pkcs7 -print_certs -noout

В ответе у каждого сертификата две строки: subject — чьё это имя, issuer — кто его подписал.

У сертификата Ingress в issuer стоит имя промежуточного. У этого промежуточного в subject то же имя. Так каждая пара: issuer текущего сертификата совпадает с subject следующего. У последнего в списке issuer совпадает с subject корневого сертификата из root-ca.crt. Если корневой сертификат тоже записан в конце tls.crt, у этой последней записи subject и issuer одинаковые: удостоверяющий центр подписал сертификат сам.

  1. Сроки действия сертификатов:
openssl x509 -in root-ca.crt -noout -subject -issuer -dates

В ответе notBefore — с какой даты сертификат действует, notAfter — по какую. Сегодняшняя дата должна быть внутри этого промежутка.

openssl x509 -in tls.crt -noout -subject -issuer -dates

Только первый сертификат в tls.crt. notAfter должен быть позже сегодняшнего дня. Если эта дата уже прошла, до загрузки в кластер нужен новый сертификат от удостоверяющего центра.

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

Wildcard-сертификат можно обновить вручную в целевом кластере или через 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.

Шаг 3. Настроить 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

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

При смене на Корпоративный сертификат (wildcard или список конкретных имён) cert-manager для Ingress не выписывает сертификаты. ClusterIssuer создавать не нужно. Если оставить ClusterIssuer без изменения в ssc сервисов, cert-manager продолжит выпускать shturval-selfsigned-ca. В ShturvalServicePatch потребуется указать пустое значение "" для cluster_issuer_name (или аннотации cert-manager.io/cluster-issuer) и имя созданного Secret с данными корпоративного сертификата.

Создайте Secret с сертификатом

Перед применением ShturvalServicePatch для корпоративного сертификата создайте в неймспейсе каждого сервиса Secret, например, с именем corp-tls типа kubernetes.io/tls с корпоративным сертификатом и его ключом. Secret должен быть в том же неймспейсе, где находится Ingress сервиса.

Сервис Неймспейс Secret
shturval-backend, shturval-frontend, shturval-auth shturval-backend
shturval-dashboards (Grafana) monitoring
shturval-cd (Argo CD) shturval-cd

Если в кластере работают системные сервисы 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:
    tls:
      enabled: true
      backend_tls_secretname: corp-tls
      cluster_issuer_name: ""
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого PatchSSC string shturval-backend-cert
backend_tls_secretname Имя секрета kubernetes.io/tls в неймспейсе shturval-backend string corp-tls
cluster_issuer_name Для корпоративного сертификата укажите пустое значение, так ClusterIssuer самоподписных сертификатов будет удален из Ingress string ""
Пример ShturvalServicePatch для frontend
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-frontend
  customvalues:
    tls:
      enabled: true
      front_tls_secretname: corp-tls
      docs_tls_secretname: corp-tls
      cluster_issuer_name: ""
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого PatchSSC string shturval-frontend-cert
front_tls_secretname Имя секрета kubernetes.io/tls в неймспейсе shturval-backend string corp-tls
docs_tls_secretname Имя секрета kubernetes.io/tls для Ingress офлайн-документации string corp-tls
cluster_issuer_name Для корпоративного сертификата укажите пустое значение, так ClusterIssuer самоподписных сертификатов будет удален из Ingress string ""
Пример ShturvalServicePatch для auth
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-auth
  customvalues:
    tls:
      enabled: true
      auth_tls_secretname: corp-tls
      cluster_issuer_name: ""
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого PatchSSC string shturval-auth-cert
auth_tls_secretname Имя секрета kubernetes.io/tls в неймспейсе shturval-backend string corp-tls
cluster_issuer_name Для корпоративного сертификата укажите пустое значение, так ClusterIssuer самоподписных сертификатов будет удален из Ingress string ""

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

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

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

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

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

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

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

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

Проверить сертификат модуля аутентификации

После замены сертификата для shturval-auth проверьте, что клиент аутентификации получил тот же сертификат. Синхронизация может занять несколько минут.

kubectl get authoidcclients.auth.shturval.tech -n shturval-backend backend -o jsonpath='{.status.clientInfo.caFileBase64}' | base64 -d

Вывод должен совпадать с данными tls.crt. Если он другой, подождите несколько минут и повторите команду.

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: corp-tls
Параметр Описание Тип данных Пример
metadata.name Имя создаваемого PatchSSC 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 самоподписных сертификатов будет удален из Ingress string ""
tls.hosts Список хостов, для которых устанавливается TLS-соединение array dashboards.clustername.ip-10-11-11-13.shturval.link
tls.secretName Имя секрета kubernetes.io/tls в неймспейсе monitoring string corp-tls

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

После загрузки манифеста из раздела Сервисы и репозитории откройте страницу Установленные сервисы, найдите Модуль графического отображения метрик (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 Имя создаваемого PatchSSC string shturval-cd-cert
annotations.cert-manager.io/cluster-issuer Для корпоративного сертификата укажите пустое значение, так ClusterIssuer самоподписных сертификатов будет удален из Ingress string ""
ingress.hostname Имя хоста сервера Argo CD string argocd.clustername.ip-10-11-11-13.shturval.link

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

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

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

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

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

Этот способ только для wildcard-сертификата. Если у вас сертификат на список имён вручную замените сертификат.

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

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

  • корпоративный сертификат Ingress (tls.crt);
  • закрытый ключ корпоративного сертификата Ingress (tls.key);
  • корневой сертификат для 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.

Проверить сертификат

Проверка сертификата может быть запущена после шага 2, когда уже используется сертификат из Secret corp-tls.

Запустите команду на машине, с которой доступен Ingress. Она открывает сайт и проверяет, что его сертификат подтверждается файлом root-ca.crt. В файле — сертификат или цепочка из ConfigMap root-ca, если сертификат добавляли вручную, или из параметра rootingresscert, если его задавали через ClusterConfig.

openssl s_client -connect <хост-ingress>:443 \
  -servername <хост-ingress> \
  -CAfile root-ca.crt \
  -no-CApath \
  -no-CAstore \
  -verify_return_error \
  -brief </dev/null
Параметр Описание
<хост-ingress> Конкретное имя из сертификата. Имя должно резолвиться в адрес Ingress. Шаблон с * в команду не подставляйте.
Wildcard *.clustername.corp.domain Имя одного уровня, например ingress.clustername.corp.domain.
Сертификат на список имён Одно из имён этого списка.
Сервис со своим Secret Проверьте имя этого сервиса. В -CAfile оставьте тот же файл root-ca.crt.
Ответ команды Ожидается строка Verification: OK. Если её нет, root-ca.crt не подтверждает сертификат, который отдаёт Ingress. В файле должен быть корневой CA. Если сервер не присылает промежуточные сертификаты, добавьте их в этот файл.

Для кластера управления после замены сертификата для shturval-auth сверьте сертификат клиента с файлом tls.crt: Проверить сертификат модуля аутентификации.