Изменить доменное имя в кластере

В инсталлированном кластере (управления, клиентском кластере) при необходимости вы можете изменить доменно имя. Это может быть необходимо в случае, когда требуется использовать внутренний балансировщик нагрузки для Ingress-контроллера и корпоративный домен вместо shturval.link.

Изменение доменного имени включает множественную конфигурацию различных ресурсов кластера, по ходу выполнения шагов инструкции могут возникнуть непредвиденные ошибки. Если кластер еще не инсталлирован, вы можете обойти автоматическое присвоение домена shturval.link, выполнив инсталляцию кластера с внешним балансировщиком и после установки заменить внутренним балансировщиком нагрузки Ingress. В этом случае снизится количество операций и не потребуется менять доменное имя кластера.

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

Обратите внимание!

  • Изменение доменного имени кластера управления заблокирует доступ к его клиентским кластерам с помощью kubeconfig. Для восстановления доступа потребуется изменить доменные имена или повторно создать кластеры.
  • Все действия по смене доменного имени выполняются в интерфейсе командной строки.

Чтобы изменить доменное имя:

  1. Подключитесь к кластеру управления со статическим kubeconfig. В графическом интерфейсе вы можете найти его в неймспейсе кластера управления, в Secret с именем clustername-kubeconfig или получить его с любого Control Plane узла кластера по пути /etc/kubernetes/admin.conf.

  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
  1. Измените доменное имя в:
  • дефолтном профиле кластера - 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
  1. Перезапустите поды в неймспейсах 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

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

Домен клиентского кластера

Чтобы изменить доменное имя в клиентском кластере:

  1. Подключитесь к кластеру со статическим kubeconfig. В графическом интерфейсе вы можете найти его в кластере управления, в неймспейсе с именем клиентского кластера (Secret с именем clustername-kubeconfig) или получить его с любого Control Plane узла кластера по пути /etc/kubernetes/admin.conf.

  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
  1. Измените доменное имя в:
  • 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"'"}]'
  1. Измените доменное имя в 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
  1. Перезапустите поды в неймспейсах 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

Дождитесь перезапуска подов.

×