Deckhouse Kubernetes Platform в VK Cloud (OpenStack)

Подключение к master-узлу

Deckhouse завершил процесс установки кластера. Осталось выполнить некоторые настройки, для чего необходимо подключиться к master-узлу.

Подключитесь к master-узлу по SSH (IP-адрес master-узла был выведен инсталлятором по завершении установки, но вы также можете найти его используя веб-интерфейс или CLI‑утилиты облачного провайдера):

ssh ubuntu@<MASTER_IP>
ssh ubuntu@<MASTER_IP>

Проверьте работу kubectl, выведя список узлов кластера:

sudo -i d8 k get nodes
sudo -i d8 k get nodes

Пример вывода...

$ sudo -i d8 k get nodes
NAME                                     STATUS   ROLES                  AGE   VERSION
cloud-demo-master-0                      Ready    control-plane,master   12h   v1.23.9
cloud-demo-worker-01a5df48-84549-jwxwm   Ready    worker                 12h   v1.23.9

Запуск Ingress-контроллера после завершения установки Deckhouse может занять какое-то время. Прежде чем продолжить убедитесь что Ingress-контроллер запустился:

sudo -i d8 k -n d8-ingress-nginx get po
sudo -i d8 k -n d8-ingress-nginx get po

Дождитесь перехода Pod’ов в статус Ready.

Пример вывода...

$ sudo -i d8 k -n d8-ingress-nginx get po
NAME                                       READY   STATUS    RESTARTS   AGE
controller-nginx-r6hxc                     3/3     Running   0          16h
kruise-controller-manager-78786f57-82wph   3/3     Running   0          16h

Также дождитесь готовности балансировщика:

sudo -i d8 k -n d8-ingress-nginx get svc nginx-load-balancer
sudo -i d8 k -n d8-ingress-nginx get svc nginx-load-balancer

Значение EXTERNAL-IP должно быть заполнено публичным IP-адресом или DNS-именем.

Пример вывода...

$ sudo -i d8 k -n d8-ingress-nginx get svc nginx-load-balancer
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
nginx-load-balancer   LoadBalancer   10.222.91.204   1.2.3.4         80:30493/TCP,443:30618/TCP   1m

DNS

Для того чтобы получить доступ к веб-интерфейсам компонентов Deckhouse, нужно:

Шаблон DNS-имен используется для настройки Ingress-ресурсов системных приложений. Например, за интерфейсом Grafana закреплено имя grafana. Тогда, для шаблона %s.kube.company.my Grafana будет доступна по адресу grafana.kube.company.my, и т.д.

Чтобы упростить настройку, далее будет использоваться сервис sslip.io.

На master-узле выполните следующую команду, чтобы получить IP-адрес балансировщика и настроить шаблон DNS-имен сервисов Deckhouse на использование sslip.io:

BALANCER_IP=$(sudo -i d8 k -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip') && \
echo "Balancer IP is '${BALANCER_IP}'." && sudo -i d8 k patch mc global --type merge \
  -p "{\"spec\": {\"settings\":{\"modules\":{\"publicDomainTemplate\":\"%s.${BALANCER_IP}.sslip.io\"}}}}" && echo && \
echo "Domain template is '$(sudo -i d8 k get mc global -o=jsonpath='{.spec.settings.modules.publicDomainTemplate}')'."
BALANCER_IP=$(sudo -i d8 k -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip') && \ echo "Balancer IP is '${BALANCER_IP}'." && sudo -i d8 k patch mc global --type merge \ -p "{\"spec\": {\"settings\":{\"modules\":{\"publicDomainTemplate\":\"%s.${BALANCER_IP}.sslip.io\"}}}}" && echo && \ echo "Domain template is '$(sudo -i d8 k get mc global -o=jsonpath='{.spec.settings.modules.publicDomainTemplate}')'."

Команда также выведет установленный шаблон DNS-имен. Пример вывода:

Balancer IP is '1.2.3.4'.
moduleconfig.deckhouse.io/global patched

Domain template is '%s.1.2.3.4.sslip.io'.

Перегенерация сертификатов после изменения шаблона DNS-имен может занять до 5 минут.

Другие варианты настройки...

Вместо сервиса sslip.io вы можете использовать другие варианты настройки.

  • Если у вас есть возможность добавить DNS-запись используя DNS-сервер:
    • Если ваш шаблон DNS-имен кластера является wildcard DNS-шаблоном (например, %s.kube.company.my), то добавьте соответствующую wildcard A-запись со значением IP-адреса балансировщика. Получить IP-адрес балансировщика:
      sudo /opt/deckhouse/bin/kubectl -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip'
      
      sudo /opt/deckhouse/bin/kubectl -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip'
    • Если ваш шаблон DNS-имен кластера НЕ является wildcard DNS-шаблоном (например, %s-kube.company.my), то добавьте А или CNAME-записис адресом балансировщика, для следующих DNS-имен сервисов согласно шаблону DNS-имен:
      • api
      • argocd
      • dashboard
      • documentation
      • dex
      • grafana
      • hubble
      • istio
      • istio-api-proxy
      • kubeconfig
      • openvpn-admin
      • prometheus
      • status
      • upmeter

      Получить IP-адрес балансировщика:

      sudo /opt/deckhouse/bin/kubectl -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip'
      
      sudo /opt/deckhouse/bin/kubectl -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip'

  • Если вы не имеете под управлением DNS-сервер, то на компьютере, с которого необходим доступ к сервисам Deckhouse, добавьте статические записи в файл /etc/hosts (%SystemRoot%\system32\drivers\etc\hosts для Windows).

    Для добавления записей в файл /etc/hosts на на Linux-компьютере с которого необходим доступ к сервисам Deckhouse (далее — ПК), выполните следующие шаги:

    • [Выполните на ПК] Укажите используемый шаблон DNS-имен в переменной DOMAIN_TEMPLATE (например, %s.kube.company.my):

      DOMAIN_TEMPLATE='<DOMAIN_TEMPLATE>'
      
      DOMAIN_TEMPLATE='<DOMAIN_TEMPLATE>'

    • [Выполните на master-узле] Определите IP-адрес балансировщика:

      BALANCER_IP=$(sudo /opt/deckhouse/bin/kubectl -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip') && \
      
      BALANCER_IP=$(sudo /opt/deckhouse/bin/kubectl -n d8-ingress-nginx get svc nginx-load-balancer -o json | jq -r '.status.loadBalancer.ingress[0].ip') && \

    • [Выполните на ПК] Укажите IP-адрес балансировщика в переменной BALANCER_IP:

      BALANCER_IP='<BALANCER_IP>'
      
      BALANCER_IP='<BALANCER_IP>'

    • [Выполните на ПК] Добавьте записи в файл /etc/hosts:

      for i in api argocd dashboard documentation dex grafana hubble istio istio-api-proxy kubeconfig openvpn-admin prometheus status upmeter; do echo "${BALANCER_IP}  ${DOMAIN_TEMPLATE} "| sed "s/%s/$i/"; done  | sudo bash -c "cat >>/etc/hosts"
      
      for i in api argocd dashboard documentation dex grafana hubble istio istio-api-proxy kubeconfig openvpn-admin prometheus status upmeter; do echo "${BALANCER_IP} ${DOMAIN_TEMPLATE} "| sed "s/%s/$i/"; done | sudo bash -c "cat >>/etc/hosts"

Затем, на master-узле выполните следующую команду (укажите используемый шаблон DNS-имен в переменной DOMAIN_TEMPLATE):

DOMAIN_TEMPLATE='<DOMAIN_TEMPLATE>'
sudo -i d8 k patch mc global --type merge -p "{\"spec\": {\"settings\":{\"modules\":{\"publicDomainTemplate\":\"${DOMAIN_TEMPLATE}\"}}}}"
DOMAIN_TEMPLATE='<DOMAIN_TEMPLATE>' sudo -i d8 k patch mc global --type merge -p "{\"spec\": {\"settings\":{\"modules\":{\"publicDomainTemplate\":\"${DOMAIN_TEMPLATE}\"}}}}"

Настройте удаленный доступ к кластеру

На персональном компьютере выполните следующие шаги, для того чтобы настроить подключение kubectl к кластеру:

  • Откройте веб-интерфейс сервиса Kubeconfig Generator. Для него зарезервировано имя kubeconfig, и адрес для доступа формируется согласно шаблона DNS-имен (который вы установили ранее). Например, для шаблона DNS-имен %s.1.2.3.4.sslip.io, веб-интерфейс Kubeconfig Generator будет доступен по адресу https://kubeconfig.1.2.3.4.sslip.io.
  • Авторизуйтесь под пользователем admin@deckhouse.io. Пароль пользователя, сгенерированный на предыдущем шаге, — <GENERATED_PASSWORD> (вы также можете найти его в CustomResource User в файле resource.yml).
  • Выберите вкладку с ОС персонального компьютера.
  • Последовательно скопируйте и выполните команды, приведенные на странице.
  • Проверьте корректную работу kubectl (например, выполнив команду kubectl get no).