Изменить доменное имя в кластере
В инсталлированном кластере (управления, клиентском кластере) при необходимости вы можете изменить доменное имя. Это может быть необходимо в случае, когда требуется использовать внутренний балансировщик нагрузки для Ingress-контроллера и корпоративный домен вместо shturval.link.
В инструкции далее описано два варианта изменения доменного имени: с помощью скрипта или последовательным выполнением команд вручную.
Автоматизация с помощью скрипта
Вместо последовательного выполнения команд вы можете использовать скрипт change-domain-name.sh. Скрипт подходит для кластера управления и клиентского кластера: режим запуска выбирается аргументом mgmt или client. Скрипт:
- проверяет наличие обязательных утилит:
kubectl,jq,sleep; - проверяет обязательные переменные окружения и доступ к кластеру через
KUBECONFIG; - перед изменениями создает резервные копии ресурсов;
- выполняет все необходимые
patch-операции для кластера; - пропускает отсутствующие ресурсы и значения, в которых не найден старый домен;
- обновляет аннотации неймспейсов для доступа в ArgoCD;
- ожидает применение изменений и перезапускает необходимые нагрузки;
- перед внесением изменений запрашивает подтверждение.
Запускайте скрипт из Bash-совместимой оболочки с локальной машины, где есть доступ к необходимому кластеру. Скачайте скрипт по ссылке change-domain-name.sh.
Перед запуском сделайте файл исполняемым.
Команда
chmod +x ./change-domain-name.sh
Домен кластера управления
Обратите внимание!
- Изменение доменного имени кластера управления заблокирует доступ к его клиентским кластерам с помощью kubeconfig. Для восстановления доступа потребуется изменить доменные имена или повторно создать кластеры.
- Все действия по смене доменного имени выполняются в интерфейсе командной строки.
- Для выполнения скриптов понадобится утилита
jq.
Чтобы изменить доменное имя:
- Подключитесь к кластеру управления со статическим kubeconfig. В графическом интерфейсе вы можете найти его в неймспейсе кластера управления, в Secret с именем
clustername-kubeconfigили получить его с любого Control Plane узла кластера по пути/etc/kubernetes/admin.conf.
После подключения выберите один из способов изменения доменного имени: выполните скрипт или запустите команды вручную.
Вариант 1. Выполнение скрипта
Подготовьте переменные окружения и запустите скрипт в режиме mgmt.
Переменные и команда запуска
export KUBECONFIG=./mgmtcluster.conf
export OLD="mgmtcluster.ip-10-11-12-14.shturval.link"
export NEW="mgmtcluster.mydomain.ru"
./change-domain-name.sh mgmt
| Переменная | Описание | Пример |
|---|---|---|
OLD |
Текущее доменное имя кластера управления | mgmtcluster.ip-10-11-12-14.shturval.link |
NEW |
Новое (корпоративное) доменное имя кластера управления | mgmtcluster.mydomain.ru |
KUBECONFIG |
Статический kubeconfig кластера управления | mgmtcluster.conf |
Скрипт создаст резервные копии ресурсов в каталоге ./bak, изменит домен в ClusterProfile, ShturvalServicePatch, NodeConfigItem, ShturvalServiceConfig и аннотациях неймспейсов, подождет 5 минут и перезапустит нагрузки в неймспейсах shturval-backend, shturval-cd и ingress.
После запуска подтвердите выполнение, когда будет выведен запрос Продолжить? [y/N].
Если вы используете скрипт, ручные шаги 2-4 выполнять не требуется.
Вариант 2. Последовательное выполнение команд вручную
- Создайте резервные копии всех ресурсов, в которые будут вноситься правки:
- профили кластеров (ClusterProfile);
- ShturvalServicePatch и ShturvalServiceConfig;
- конфигурация узлов (NCI).
В случае ошибки изменения доменного имени в кластере, вы сможете использовать бэкап для отката изменений.
Команды резервного копирования
mkdir bak
kubectl get clusterprofile -n kube-system -o yaml >./bak/clusterprofile.yaml
kubectl get shturvalservicepatch -o yaml >./bak/shturvalservicepatch.yaml
kubectl get shturvalserviceconfig -o yaml >./bak/shturvalserviceconfig.yaml
kubectl get nodeconfigitem -o yaml >./bak/nodeconfigitem.yaml
- Измените доменное имя в:
- дефолтном профиле кластера -
default-client-cluster-profile; - ShturvalServicePatch:
shturval-ingress-controller-commonиshturval-frontend-oidc-client; - NCI -
controlplane-oidc-nci; - ShturvalServiceConfig:
shturval-auth,shturval-backend,shturval-cd,shturval-dashboards,shturval-frontend,shturval-metrics-collector,shturval-monitoring, как приведено далее.
Подготовка переменных
export KUBECONFIG=<Ваше значение>
export OLD="<Ваше значение>"
export NEW="<Ваше значение>"
| Переменная | Описание | Пример |
|---|---|---|
OLD |
Текущее доменное имя кластера управления | mgmtcluster.ip-10-11-12-14.shturval.link |
NEW |
Новое (корпоративное) доменное имя кластера управления | mgmtcluster.mydomain.ru |
KUBECONFIG |
Статический kubeconfig кластера управления | mgmtcluster.conf |
Команды изменения домена
# Замените на новое доменное имя значения домена в кастомных ресурсах
kubectl patch clusterprofile default-client-cluster-profile -n kube-system --type=json -p='[{"op": "replace", "path": "/spec/loggingEndpoint", "value": "logs.'$NEW'"}, {"op": "replace", "path": "/spec/monitoringEndpoint", "value": "vminsert.'$NEW'"}]'
kubectl patch shturvalservicepatch shturval-ingress-controller-common --type=json -p='[{"op": "replace", "path": "/spec/customvalues/controller/shturval/commonName", "value": "'"$NEW"'"}]'
kubectl patch shturvalservicepatch shturval-frontend-oidc-client --type=json -p='[{"op": "replace", "path": "/spec/customvalues/auth_url_production", "value": "//shturval.'"$NEW"'"}]'
kubectl patch nodeconfigitem controlplane-oidc-nci --type=json -p='[{"op": "replace", "path": "/spec/kubeapi/oidc/issuerurl", "value": "https://shturval.'"$NEW"'"}]'
# Замените на новое доменное имя в ShturvalServiceConfig
for resource in shturval-auth shturval-backend shturval-cd shturval-dashboards shturval-frontend shturval-metrics-collector shturval-monitoring; do echo "Processing $resource..."; NEW_VALUES=$(kubectl get shturvalserviceconfig "$resource" -o jsonpath='{.spec.customvalues}' | jq --arg old "$OLD" --arg new "$NEW" 'tostring | gsub($old; $new) | fromjson'); kubectl patch shturvalserviceconfig "$resource" --type=json -p="[{'op': 'replace', 'path': '/spec/customvalues', 'value': $NEW_VALUES}]"; done
# Обновите аннотации для доступа в ArgoCD из неймспейса
for resource in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do
echo "Processing $resource..."; \
NEW_VALUES=$(kubectl get namespace "$resource" -o jsonpath='{.metadata.annotations}' | jq --arg old "$OLD" --arg new "$NEW" 'tostring | gsub($old; $new) | fromjson'); kubectl patch namespace "$resource" --type=json -p="[{'op': 'replace', 'path': '/metadata/annotations', 'value': $NEW_VALUES}]"; \
done
# Ожидание на 5 минут для применения изменений
sleep 5m
- Перезапустите поды в неймспейсах
shturval-backend,shturval-cdиingress, как приведено далее:
Команда перезапуска подов
for ns in shturval-backend shturval-cd ingress;do for i in $(kubectl -n $ns get deployments.apps,statefulset.apps -o name);do kubectl -n $ns rollout restart $i;done; done
Дождитесь перезапуска подов. При необходимости установки корпоративного сертификата после изменения домена выполните инструкцию из раздела Сценарий добавления корпоративного сертификата в кластер.
Домен клиентского кластера
Чтобы изменить доменное имя в клиентском кластере:
- Подключитесь к кластеру со статическим kubeconfig. В графическом интерфейсе вы можете найти его в кластере управления, в неймспейсе с именем клиентского кластера (Secret с именем
clustername-kubeconfig) или получить его с любого Control Plane узла кластера по пути/etc/kubernetes/admin.conf.
После подключения выберите один из способов изменения доменного имени: выполните скрипт или пройдите шаги вручную.
Вариант 1. Выполнение скрипта
Подготовьте переменные окружения и запустите скрипт в режиме client.
Переменные и команда запуска
export KUBECONFIG=./mycluster.conf
export OLD="mycluster.ip-10-11-12-13.shturval.link"
export NEW="mycluster.mydomain.ru"
export OLDMGMT="mgmtcluster.ip-10-11-12-14.shturval.link"
export NEWMGMT="mgmtcluster.mydomain.ru"
./change-domain-name.sh client
Если доменное имя кластера управления не менялось, укажите в переменной NEWMGMT то же значение, что и в OLDMGMT.
Если в кластере управления был изменен корневой CA сертификат, дополнительно укажите путь к нему.
export CA=/path/to/ca.crt
| Переменная | Описание | Пример |
|---|---|---|
OLD |
Текущее доменное имя клиентского кластера | mycluster.ip-10-11-12-13.shturval.link |
NEW |
Новое (корпоративное) доменное имя клиентского кластера | mycluster.mydomain.ru |
KUBECONFIG |
Статический kubeconfig клиентского кластера | mycluster.conf |
OLDMGMT |
Текущее доменное имя кластера управления | mgmtcluster.ip-10-11-12-14.shturval.link |
NEWMGMT |
Новое (корпоративное) доменное имя кластера управления | mgmtcluster.mydomain.ru |
CA |
Путь до корневого сертификата. Если в кластере управления не был изменен корневой сертификат, не экспортируйте эту переменную | /path/to/ca.crt |
Скрипт создаст резервные копии ресурсов в каталоге ./bak_client, изменит домен в ShturvalServicePatch, NodeConfigItem, ShturvalServiceConfig и аннотациях неймспейсов, при необходимости заменит корневой CA сертификат, подождет 5 минут и перезапустит нагрузки в namespace shturval-cd и ingress.
После запуска скрипта подтвердите выполнение, когда скрипт выведет запрос Продолжить? [y/N].
Если вы используете скрипт, ручные шаги 2-5 выполнять не требуется.
Вариант 2. Последовательное выполнение команд вручную
- Создайте резервные копии всех ресурсов, которые будут изменены:
- ShturvalServicePatch;
- ShturvalServiceConfig;
- конфигурация узлов (NCI).
В случае ошибки изменения доменного имени в кластере, вы сможете использовать бэкап для отката изменений.
Команда
mkdir bak_client
kubectl get shturvalservicepatch -o yaml >./bak_client/shturvalservicepatch.yaml
kubectl get shturvalserviceconfig -o yaml >./bak_client/shturvalserviceconfig.yaml
kubectl get nodeconfigitem -o yaml >./bak_client/nodeconfigitem.yaml
- Измените доменное имя в:
- ShturvalServicePatch -
shturval-ingress-controller-common; - NCI -
controlplane-oidc-nci, как приведено далее.
Подготовка переменных
export KUBECONFIG=<Ваше значение>
export OLD="<Ваше значение>"
export NEW="<Ваше значение>"
export OLDMGMT="<Ваше значение>"
export NEWMGMT="<Ваше значение>"
export CA=<Ваше значение> # Переменная нужна, только если в кластере управления изменен корневой сертификат
| Переменная | Описание | Пример |
|---|---|---|
OLD |
Текущее доменное имя клиентского кластера | mycluster.ip-10-11-12-13.shturval.link |
NEW |
Новое (корпоративное) доменное имя клиентского кластера | mycluster.mydomain.ru |
KUBECONFIG |
Статический kubeconfig клиентского кластера | mycluster.conf |
OLDMGMT |
Текущее доменное имя кластера управления | mgmtcluster.ip-10-11-12-14.shturval.link |
NEWMGMT |
Новое (корпоративное) доменное имя кластера управления | mgmtcluster.mydomain.ru |
CA |
Путь до корневого сертификата. Если в кластере управления не был изменен корневой сертификат, не экспортируйте эту переменную | /path/to/ca.crt |
Команды изменения доменного имени в кастомных ресурсах
kubectl patch shturvalservicepatch shturval-ingress-controller-common --type=json -p='[{"op": "replace", "path": "/spec/customvalues/controller/shturval/commonName", "value": "'"$NEW"'"}]'
kubectl patch nodeconfigitem controlplane-oidc-nci --type=json -p='[{"op": "replace", "path": "/spec/kubeapi/oidc/issuerurl", "value": "https://shturval.'"$NEWMGMT"'"}]'
Если в кластере управления был изменен корневой CA сертификат, замените его в настройках OIDC, выполнив команду приведенную далее:
Команда замены корневого сертификата
CAVALUE=$(base64 -w0 -i $CA); kubectl patch nodeconfigitem controlplane-oidc-nci --type=json -p='[{"op": "replace", "path": "/spec/kubeapi/oidc/cafile", "value": "'"$CAVALUE"'"}]'
- Измените доменное имя в ShturvalServiceConfig:
- shturval-cd;
- shturval-dashboards;
- shturval-metrics-collector;
- shturval-monitoring;
- shturval-log-collector.
Команда
for resource in shturval-cd shturval-dashboards shturval-metrics-collector shturval-monitoring shturval-log-collector; do
echo "Processing $resource..."; \
NEW_VALUES=$(kubectl get shturvalserviceconfig "$resource" -o jsonpath='{.spec.customvalues}' | jq --arg old "$OLD" --arg new "$NEW" 'tostring | gsub($old; $new) | fromjson'); kubectl patch shturvalserviceconfig "$resource" --type=json -p="[{'op': 'replace', 'path': '/spec/customvalues', 'value': $NEW_VALUES}]"; \
NEW_VALUES=$(kubectl get shturvalserviceconfig "$resource" -o jsonpath='{.spec.customvalues}' | jq --arg old "$OLDMGMT" --arg new "$NEWMGMT" 'tostring | gsub($old; $new) | fromjson'); kubectl patch shturvalserviceconfig "$resource" --type=json -p="[{'op': 'replace', 'path': '/spec/customvalues', 'value': $NEW_VALUES}]"; \
done
# Обновите аннотации для доступа в ArgoCD из неймспейса
for resource in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do
echo "Processing $resource..."; \
NEW_VALUES=$(kubectl get namespace "$resource" -o jsonpath='{.metadata.annotations}' | jq --arg old "$OLD" --arg new "$NEW" 'tostring | gsub($old; $new) | fromjson'); kubectl patch namespace "$resource" --type=json -p="[{'op': 'replace', 'path': '/metadata/annotations', 'value': $NEW_VALUES}]"; \
done
# Ожидание на 5 минут для применения изменений
sleep 5m
- Перезапустите поды в неймспейсах
ingressиshturval-cd, как приведено далее:
Команда
for ns in shturval-cd ingress;do for i in $(kubectl -n $ns get deployments.apps,statefulset.apps -o name);do kubectl -n $ns rollout restart $i;done; done
Дождитесь перезапуска подов.