Подготовка окружения#
Подготовка элементов развертывания#
Перед началом установки продукта Platform V SynAI необходимо подготовить следующие элементы развертывания:
Helm-чарты компонентов AUSC, PREM, WLDT
Docker-образы компонентов AUSC, PREM, WLDT
Файлы конфигурации (values.yaml)
Сертификаты
Настройка окружения#
Для корректной установки продукта SAI в среде Kubernetes должны быть выполнены следующие условия:
Развернут и настроен Kubernetes-кластер
Минимальная версия: 1.21 или выше
Состояние кластера: полностью рабочий, с настроенной сетью и доступом к registry-сервисам
Проверить состояние можно командой:
kubectl cluster-info
Создан проект (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 выполните следующие шаги:
Необходимо создать
Secretautoscaler-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
В случае создания секрета через «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