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

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

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

Важно:

  • Изменение доменного имени кластера управления заблокирует доступ к его клиентским кластерам с помощью 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, как показано в примере подготовки переменных (описание параметров ‒ в таблице 6):
    export KUBECONFIG=<Ваше значение>
    export OLD="<Ваше значение>"
    export NEW="<Ваше значение>"
    
    Таблица 6 ‒ Описание переменных

Команды изменения домена:

Заменить на новое доменное имя значения домена в кастомных ресурсах
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. дождаться перезапуска подов. При необходимости установки корпоративного сертификата после изменения домена следует выполнить инструкцию "Сценарий добавления корпоративного сертификата в кластер".

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

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

  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, как приведено в примере подготовки переменных (описание параметров ‒ в таблице 7)
    export KUBECONFIG=<Ваше значение>
    export OLD="<Ваше значение>"
    export NEW="<Ваше значение>"
    export OLDMGMT="<Ваше значение>"
    export NEWMGMT="<Ваше значение>"
    export CA=<Ваше значение> # Переменная нужна, только если в кластере управления изменен корневой сертификат
    
    Таблица 7 ‒ Описание переменных

Команды изменения доменного имени в кастомных ресурсах:

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"'"}]'
  1. если в кластере управления был изменен корневой 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
  1. дождаться перезапуска подов.