Подготовка окружения#

Подготовка элементов развертывания#

Перед началом установки продукта Platform V SynAI необходимо подготовить следующие элементы развертывания:

  1. Helm-чарты компонентов AUSC, PREM, WLDT

  2. Docker-образы компонентов AUSC, PREM, WLDT

  3. Файлы конфигурации (values.yaml)

  4. Сертификаты

Настройка окружения#

Для корректной установки продукта SAI в среде Kubernetes должны быть выполнены следующие условия:

  1. Развернут и настроен Kubernetes-кластер

    • Минимальная версия: 1.21 или выше

    • Состояние кластера: полностью рабочий, с настроенной сетью и доступом к registry-сервисам

    • Проверить состояние можно командой:

      kubectl cluster-info
      
  2. Создан проект (namespace)

    • Пример конфигурации:

      apiVersion: v1
      kind: Namespace
      metadata:
        name: synapse-synai
        labels:
          istio.io/rev=<namespace контрольной панели istio>
          vault-sidecar-injector: enabled
      
    • Пример команды для создания:

      kubectl create namespace synapse-synai
      kubectl label namespace synapse-synai istio.io/rev=synapse-control-panel
      kubectl label namespace synapse-synai vault-sidecar-injector=enabled
      

Выпуск и подготовка сертификатов#

Для корректной работы продукта SAI в Kubernetes требуется настроить выпуск и распространение SSL/TLS-сертификатов. Создание серверных сертификатов для autoscaler-adapter необходимо по причине того, что KubeAPI взаимодействует как клиент с autoscaler-adapter. В зависимости от используемой инфраструктуры, можно выбрать один из следующих вариантов:

  • Создание сертификата c помощью cert-manager.

  • Создание сертификата вручную через скрипт (если нет cert-manager).

  • Указать параметр Vault Hashicorp, чтобы он сам подавал секрет.

Создание сертификата c помощью cert-manager#

Чтобы создать сертификат c помощью cert-manager выполните следующие шаги:

  1. Необходимо создать Secret autoscaler-apiservice-tls.

Для обеспечения TLS 1.2 соединения необходимо создать следующие секреты:

kind: Secret
apiVersion: v1
metadata:
  name: autoscaler-apiservice-tls
  namespace: # {{.Release.Namespace }}
data:
  tls.key: # {{ $your key }}
  tls.crt: # {{ $your cert }}
type: Opaque
  1. В случае создания секрета через «cert-manager» необходимо чтобы компонент «cert-manager» был предварительно установлен на кластере. После чего необходимо изменить значение в conf/helm/application/ausc/values.yaml.

    apiserviceCa: # Не обязательно. Настройки секретов для Apiserviсe 
      type: cert-manager  # Обязательно. Используется cert-manager для реализации сертификатов по взаимодействию
      certManagerIssuerName: kubernetes-selfsigning-issuer # Обязательно если используется type:cert-manager
    

    Секрет autoscaler-apiserver-tls

    Ключ

    Значение

    tls.cert

    Серверный сертификат для SynAI Autoscaler

    tls.key

    Приватный ключ для SynAI Autoscaler

Создание сертификата вручную через скрипт#

Запустите следующий скрипт, чтобы создать TLS-сертификат для Kubernetes-сервиса:

#!/bin/bash

# Функция для вывода справки по использованию скрипта
print_help() {
 echo "Использование: $0 [опции]"
 echo "Опции:"
 echo "  -n, --namespace <namespace>   Указать namespace для сертификата"
 echo "  -s, --service <serviceName>   Указать имя сервиса для сертификата"
 echo "      --customDNS <customDNS>   Указать кастомное DNS имя для сертификата"
 echo "  -h, --help                    Показать эту справку"
 echo ""
 echo "Примеры:"
 echo "  $0 -n mynamespace -s myservice"
 echo "  $0 --customDNS mycustom.dns.name"
}

# Обработка аргументов командной строки
while [ -n "$1" ]
do
case "$1" in
 -n|--namespace) namespace="$2"
     shift ;;
 -s|--service) serviceName="$2"
     shift ;;
 --customDNS) customDNS="$2"
     shift ;;
 -h|--help) print_help
     exit 0 ;;
 *) echo "$1 is not an option"
     if [[ "$2" != '-'* ]]; then
         shift
     fi
     ;;
esac
shift
done

# Если не указаны обязательные параметры, запросить их
if [[ $customDNS == '' ]]; then
 if [[ $serviceName == '' ]]; then
     echo 'Введите имя сервиса:'
     read serviceName
 fi
 if [[ $namespace == '' ]]; then
     echo 'Введите имя namespace:'
     read namespace
 fi
 dnsName=$serviceName'.'$namespace'.svc'
 dir=$serviceName'-'$namespace
else
 dnsName=$customDNS
 dir=$customDNS
fi


dir="${dir//\*/__WC__}"
dnsName_orig=$dnsName
dnsName="${dnsName//\*/__WC__}"

mkdir -p certs
cd certs
mkdir -p util
cd util
mkdir -p $dir
cd $dir

rm -rf log
rm -rf errlog

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN='$dnsName_orig -keyout $dnsName'-ca.key' -out $dnsName'-ca.crt' 2>>log 1>>errlog

echo "subjectAltName = DNS:$dnsName_orig" > san.ext

openssl req -out $dnsName.csr -newkey rsa:2048 -nodes -keyout $dnsName.key -subj "/CN=$dnsName_orig/O=httpbin organization" 2>>log 1>>errlog
openssl x509 -req -sha256 -days 365 -CA $dnsName'-ca.crt' -CAkey $dnsName'-ca.key' -set_serial 0 -in $dnsName.csr -out $dnsName.crt -extfile san.ext 2>>log 1>>errlog


openssl genpkey -algorithm RSA -out $dnsName'-client.key' 2>>log 1>>errlog
openssl req -new -key $dnsName'-client.key' -out $dnsName'-client.csr' -subj "/CN=$dnsName_orig" 2>>log 1>>errlog
openssl x509 -req -in $dnsName'-client.csr' -CA $dnsName'-ca.crt' -CAkey $dnsName'-ca.key' -CAcreateserial -out $dnsName'-client.crt' -days 365 -sha256 2>>log 1>>errlog


pwd=`pwd`
echo 'Логи генерации сертификатов находятся в '$pwd'/log'
echo 'Ошибки генерации сертификатов находятся в '$pwd'/errlog'
cd ..
cd ..
pwd=`pwd`
key=$(base64 -i util/$dir/$dnsName.key)
ca=$(base64 -i util/$dir/$dnsName'-ca.crt')
cert=$(base64 -i util/$dir/$dnsName.crt)
clientKey=$(base64 -i util/$dir/$dnsName-client.key)
clientCert=$(base64 -i util/$dir/$dnsName-client.crt)

echo $key > 'base64/'$dir'-key.txt'
echo $ca > 'base64/'$dir'-ca.txt'
echo $cert > 'base64/'$dir'-cert.txt'
echo $clientKey > 'base64/'$dir'-clientKey.txt'
echo $clientCert > 'base64/'$dir'-clientCert.txt'
echo 'Серверный ключ (base64) находится в '$pwd'/base64/'$dir'-key.txt'
echo 'Серверный сертификат (base64) находится в '$pwd'/base64/'$dir'-cert.txt'
echo 'Корневой сертификат (base64) находится в '$pwd'/base64/'$dir'-ca.txt'
echo 'Клиентский ключ (base64) находится в '$pwd'/base64/'$dir'-clientKey.txt'
echo 'Клиентский сертификат (base64) находится в '$pwd'/base64/'$dir'-clientCert.txt'


echo 'Сгенерированный секрет находится в '$pwd'/secrets/'$dir'.yaml'
cat << EOF > 'secrets/'$dir'.yaml'
apiVersion: v1
kind: Secret
metadata:
name: webhook-cert
namespace: $namespace
data:
ca.crt: $ca
tls.crt: $cert
tls.key: $key
type: kubernetes.io/tls
EOF