Deckhouse Kubernetes Platform на РЕД виртуализации

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

Выберите ниже один из двух вариантов, для продолжения установки кластера:

Добавьте узел в кластер (подробнее о добавлении статического узла в кластер читайте в документации):

  • Подготовьте чистую виртуальную машину, которая будет узлом кластера.
  • Настройте StorageClass локального хранилища, выполнив на master-узле следующую команду:

    1sudo -i d8 k create -f - << EOF
    2apiVersion: deckhouse.io/v1alpha1
    3kind: LocalPathProvisioner
    4metadata:
    5  name: localpath
    6spec:
    7  path: "/opt/local-path-provisioner"
    8  reclaimPolicy: Delete
    9EOF
    
  • Укажите, что созданный StorageClass должен использоваться как StorageClass по умолчанию. Для этого выполните на master-узле следующую команду:

    1sudo -i d8 k patch mc global --type merge \
    2  -p "{\"spec\": {\"settings\":{\"defaultClusterStorageClass\":\"localpath\"}}}"
    
  • Создайте NodeGroup worker. Для этого выполните на master-узле следующую команду:

    1sudo -i d8 k create -f - << EOF
    2apiVersion: deckhouse.io/v1
    3kind: NodeGroup
    4metadata:
    5  name: worker
    6spec:
    7  nodeType: Static
    8  staticInstances:
    9    count: 1
    10    labelSelector:
    11      matchLabels:
    12        role: worker
    13EOF
    
  • Сгенерируйте SSH-ключ с пустой парольной фразой. Для этого выполните на master-узле следующую команду:

    1ssh-keygen -t rsa -f /dev/shm/caps-id -C "" -N ""
    
  • Создайте в кластере ресурс SSHCredentials. Для этого выполните на master-узле следующую команду:

    1sudo -i d8 k create -f - <<EOF
    2apiVersion: deckhouse.io/v1alpha1
    3kind: SSHCredentials
    4metadata:
    5  name: caps
    6spec:
    7  user: caps
    8  privateSSHKey: "`cat /dev/shm/caps-id | base64 -w0`"
    9EOF
    
  • Выведите публичную часть сгенерированного ранее SSH-ключа (он понадобится на следующем шаге). Для этого выполните на master-узле следующую команду:

    1cat /dev/shm/caps-id.pub
    
  • На подготовленной виртуальной машине создайте пользователя caps. Для этого выполните следующую команду, указав публичную часть SSH-ключа, полученную на предыдущем шаге:

    1# Укажите публичную часть SSH-ключа пользователя.
    2export KEY='<SSH-PUBLIC-KEY>'
    3useradd -m -s /bin/bash caps
    4usermod -aG sudo caps
    5echo 'caps ALL=(ALL) NOPASSWD: ALL' | sudo EDITOR='tee -a' visudo
    6mkdir /home/caps/.ssh
    7echo $KEY >> /home/caps/.ssh/authorized_keys
    8chown -R caps:caps /home/caps
    9chmod 700 /home/caps/.ssh
    10chmod 600 /home/caps/.ssh/authorized_keys
    
  • В операционных системах семейства Astra Linux, при использовании модуля мандатного контроля целостности Parsec, сконфигурируйте максимальный уровень целостности для пользователя caps:

    1pdpl-user -i 63 caps
    
  • Создайте StaticInstance для добавляемого узла. Для этого выполните на master-узле следующую команду, указав IP-адрес добавляемого узла:

    1# Укажите IP-адрес узла, который необходимо подключить к кластеру.
    2export NODE=<NODE-IP-ADDRESS>
    3sudo -i d8 k create -f - <<EOF
    4apiVersion: deckhouse.io/v1alpha1
    5kind: StaticInstance
    6metadata:
    7  name: d8cluster-worker
    8  labels:
    9    role: worker
    10spec:
    11  address: "$NODE"
    12  credentialsRef:
    13    kind: SSHCredentials
    14    name: caps
    15EOF
    
  • Убедитесь, что все узлы кластера находятся в статусе Ready.

    Выполните на master-узле следующую команду, чтобы получить список узлов кластера:

    1sudo -i d8 k get no
    

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

    1$ sudo -i d8 k get no
    2NAME               STATUS   ROLES                  AGE    VERSION
    3d8cluster          Ready    control-plane,master   30m   v1.23.17
    4d8cluster-worker   Ready    worker                 10m   v1.23.17
    

Запуск всех компонентов Deckhouse после завершения установки может занять какое-то время.

  • Убедитесь, что под Kruise controller manager модуля ingress-nginx запустился и находится в статусе Ready.

    Выполните на master-узле следующую команду:

    1sudo -i d8 k -n d8-ingress-nginx get po -l app=kruise
    

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

    1$ sudo -i d8 k -n d8-ingress-nginx get po -l app=kruise
    2NAME                                         READY   STATUS    RESTARTS    AGE
    3kruise-controller-manager-7dfcbdc549-b4wk7   3/3     Running   0           15m
    

Далее нужно создать Ingress-контроллер, создать пользователя для доступа в веб-интерфейсы и настроить DNS.

  • Установка Ingress-контроллера

    Создайте на master-узле файл ingress-nginx-controller.yml содержащий конфигурацию Ingress-контроллера:

    1# Секция, описывающая параметры NGINX Ingress controller.
    2# https://deckhouse.ru/products/kubernetes-platform/documentation/v1/modules/ingress-nginx/cr.html
    3apiVersion: deckhouse.io/v1
    4kind: IngressNginxController
    5metadata:
    6  name: nginx
    7spec:
    8  ingressClass: nginx
    9  # Способ поступления трафика из внешнего мира.
    10  inlet: HostPort
    11  hostPort:
    12    httpPort: 80
    13    httpsPort: 443
    14  # Описывает, на каких узлах будет находиться Ingress-контроллер.
    15  # Возможно, захотите изменить.
    16  # Больше примеров здесь
    17  # https://deckhouse.ru/products/kubernetes-platform/documentation/v1/modules/ingress-nginx/examples.html
    18  nodeSelector:
    19    node-role.kubernetes.io/control-plane: ""
    20  tolerations:
    21  - effect: NoSchedule
    22    key: node-role.kubernetes.io/control-plane
    23    operator: Exists
    

    Примените его, выполнив на master-узле следующую команду:

    1sudo -i d8 k create -f ingress-nginx-controller.yml
    

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

    1sudo -i d8 k -n d8-ingress-nginx get po -l app=controller
    

    Дождитесь перехода подов Ingress-контроллера в статус Ready.

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

    1$ sudo -i d8 k -n d8-ingress-nginx get po -l app=controller
    2NAME                                       READY   STATUS    RESTARTS   AGE
    3controller-nginx-r6hxc                     3/3     Running   0          5m
    
  • Создание пользователя для доступа в веб-интерфейсы кластера

    Создайте на master-узле файл user.yml содержащий описание учетной записи пользователя и прав доступа:

    1apiVersion: deckhouse.io/v1
    2kind: ClusterAuthorizationRule
    3metadata:
    4  name: admin
    5spec:
    6  # список учётных записей Kubernetes RBAC
    7  subjects:
    8  - kind: User
    9    name: admin@deckhouse.io
    10  # предустановленный шаблон уровня доступа
    11  accessLevel: SuperAdmin
    12  # разрешить пользователю делать kubectl port-forward
    13  portForwarding: true
    14---
    15# секция, описывающая параметры статического пользователя
    16# используемая версия API Deckhouse
    17apiVersion: deckhouse.io/v1
    18kind: User
    19metadata:
    20  name: admin
    21spec:
    22  # e-mail пользователя
    23  email: admin@deckhouse.io
    24  # это хэш пароля r135hz4nro, сгенерированного сейчас
    25  # сгенерируйте свой или используйте этот, но только для тестирования
    26  # echo "r135hz4nro" | htpasswd -BinC 10 "" | cut -d: -f2 | base64 -w0
    27  # возможно, захотите изменить
    28  password: 'JDJhJDEwJDJaRDZNNks4eTlhMGZPMlVWbGRnV2VxNndWM01lMTQ2dWNMOU14NjZ1Y0w1THZIaXczTGhX'
    

    Примените его, выполнив на master-узле следующую команду:

    1sudo -i d8 k create -f user.yml
    
  • Создание DNS-записи, для доступа в веб-интерфейсы кластера
    • Выясните публичный IP-адрес узла, на котором работает Ingress-контроллер.
    • Если у вас есть возможность добавить DNS-запись используя DNS-сервер:
      • Если ваш шаблон DNS-имен кластера является wildcard DNS-шаблоном (например, %s.kube.my), то добавьте соответствующую wildcard A-запись со значением публичного IP-адреса, который вы получили выше.
      • Если ваш шаблон DNS-имен кластера НЕ является wildcard DNS-шаблоном (например, %s-kube.company.my), то добавьте А или CNAME-записи со значением публичного IP-адреса, который вы получили выше, для следующих DNS-имен сервисов Deckhouse в вашем кластере:
        1api.example.com
        2argocd.example.com
        3dashboard.example.com
        4documentation.example.com
        5dex.example.com
        6grafana.example.com
        7hubble.example.com
        8istio.example.com
        9istio-api-proxy.example.com
        10kubeconfig.example.com
        11openvpn-admin.example.com
        12prometheus.example.com
        13status.example.com
        14upmeter.example.com
        
        
      • Важно: Домен, используемый в шаблоне, не должен совпадать с доменом, указанным в параметре clusterDomain и внутренней сервисной зоне сети. Например, если используется clusterDomain: cluster.local (значение по умолчанию), а сервисная зона сети — ru-central1.internal, то publicDomainTemplate не может быть %s.cluster.local или %s.ru-central1.internal.
    • Если вы не имеете под управлением DNS-сервер: добавьте статические записи соответствия имен конкретных сервисов публичному IP-адресу узла, на котором работает Ingress-контроллер.

      Например, на персональном Linux-компьютере, с которого необходим доступ к сервисам Deckhouse, выполните следующую команду (укажите ваш публичный IP-адрес в переменной PUBLIC_IP) для добавления записей в файл /etc/hosts (для Windows используйте файл %SystemRoot%\system32\drivers\etc\hosts):

      1export PUBLIC_IP="<PUBLIC_IP>"
      2sudo -E bash -c "cat <<EOF >> /etc/hosts
      3$PUBLIC_IP api.example.com
      4$PUBLIC_IP argocd.example.com
      5$PUBLIC_IP dashboard.example.com
      6$PUBLIC_IP documentation.example.com
      7$PUBLIC_IP dex.example.com
      8$PUBLIC_IP grafana.example.com
      9$PUBLIC_IP hubble.example.com
      10$PUBLIC_IP istio.example.com
      11$PUBLIC_IP istio-api-proxy.example.com
      12$PUBLIC_IP kubeconfig.example.com
      13$PUBLIC_IP openvpn-admin.example.com
      14$PUBLIC_IP prometheus.example.com
      15$PUBLIC_IP status.example.com
      16$PUBLIC_IP upmeter.example.com
      17EOF
      18"