Установка кластера Kubernetes вручную

Данное руководство описывает процесс установки кластера Kubernetes в окружении РЕД ОС и Astra Linux с использованием подключения к Интернету.

Для развертывания кластера с помощью автономного установщика обратитесь к разделу Установка кластера Kubernetes с помощью Kubespray. Обратите внимание, что список ОС, в которых поддерживается офлайн-установка, ограничен.

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

В данном руководстве установка кластера Kubernetes производится с использованием среды выполнения контейнеров containerd и сетевого плагина Calico.

  • Можно использовать любую поддерживаемую среду выполнения из списка, приведенного в разделе технических требований.

  • Использование альтернативных сетевых плагинов, таких как Flannel, не поддерживается.

Установка Kubernetes на узлы кластера

Нижеприведенные действия выполняются на каждом узле кластера. Все узлы кластера должны быть подключены к Интернету.

Чтобы установить Kubernetes на узле кластера, выполните следующие действия:

  1. Для корректной работы агентов kubelet отключите использование файлов подкачки и исключите их из файла /etc/fstab, чтобы их использование не возобновилось после перезагрузки узла:

    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  2. Для автозагрузки модулей ядра, необходимых для работы сервиса containerd, в каталоге /etc/modules-load.d создайте файл containerd.conf со следующим содержимым:

    overlay
    br_netfilter
  3. Загрузите модули ядра overlay и br_netfilter:

    modprobe overlay
    modprobe br_netfilter
  4. Убедитесь, что модули загружены и работают, с помощью следующей команды:

    lsmod | egrep "br_netfilter|overlay"
  5. Для обеспечения работы внутренней сети Kubernetes в каталоге /etc/sysctl.d/ создайте файл 99-kubernetes-cri.conf со следующим содержимым:

    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-ip6tables = 1
  6. Чтобы избежать ошибок разрешения имен, отключите использование IPv6. Для этого в каталоге /etc/sysctl.d/ создайте файл 99-disable-ipv6.conf со следующим содержимым:

    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 1
  7. Примените изменения параметров sysctl, выполнив следующую команду:

    sysctl --system
  8. Установите пакеты, необходимые для работы Kubernetes. Список пакетов зависит от ОС, в окружении которой будет развернут кластер.

    • Установка пакетов для РЕД ОС:

      dnf install kubernetes kubernetes-kubeadm cri-tools tc ipvsadm ebtables socat conntrack git curl wget runc containerd
    • Установка пакетов для Astra Linux:

      apt-get install kubelet kubeadm kubectl containerd cri-tools socat conntrack
    Если некоторые из требуемых пакетов недоступны в репозитории производителя ОС, вы можете установить их из репозитория Kubernetes. Подробности приведены в официальной документации Kubernetes.
  9. Установите утилиту nerdctl:

    1. Скачайте архив утилиты, выполнив следующую команду:

      curl -O https://github.com/containerd/nerdctl/releases/download/v2.1.6/nerdctl-2.1.6-linux-amd64.tar.gz
    2. Распакуйте архив в каталог /usr/local/bin, выполнив следующую команду:

      tar -xzvf nerdctl-2.1.6-linux-amd64.tar.gz -C /usr/local/bin
  10. Если на узле не установлена утилита iptables, установите ее согласно документации производителя ОС.

  11. Разрешите проброс портов, выполнив следующую команду:

    iptables -P FORWARD ACCEPT
  12. Установите настройки по умолчанию для конфигурации контейнеров, выполнив следующую команду:

    containerd config default | sudo tee /etc/containerd/config.toml
  13. Разрешите использование контрольных групп (cgroup) Kubernetes:

    sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
  14. Чтобы обеспечить работу сокета containerd, в каталоге /etc создайте файл crictl.yaml, если он не существует, и добавьте в него следующие строки:

    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 30
    debug: false
  15. Запустите службу containerd и добавьте ее в автозагрузку:

    systemctl enable --now containerd
  16. Добавьте службу kubelet в автозагрузку:

    systemctl enable kubelet.service
  17. На master-узлах кластера выполните следующие действия:

    1. Загрузите образы контейнеров, необходимых инструменту kubeadm для инициализации узла кластера:

      kubeadm config images pull

      Если доступ узла в Интернет осуществляется через прокси-сервер, необходимо скопировать его конфигурацию в файл конфигурации прокси containerd:

      1. В каталоге /etc/systemd/system/containerd.service.d создайте файл http-proxy.conf, если он не существует.

      2. Скопируйте в http-proxy.conf содержимое файла /etc/environment:

        cat /etc/environment > /etc/systemd/system/containerd.service.d/http-proxy.conf

      После копирования добавьте исключения в список NO_PROXY файла /etc/environment.

      Приведенный список исключений указан в качестве примера, для вашей сети он может отличаться. Ознакомьтесь с рекомендациями по настройке списка NO_PROXY.

      10.96.0.0/12,10.233.0.0/18,10.244.0.0/16,.svc,.cluster.local
    2. Запустите инициализацию master-узла в одноранговом кластере.

      kubeadm init --pod-network-cidr=<internal_cluster_net>

      Здесь:

      • <internal_cluster_net> — адрес внутренней подсети для кластера, например, 10.244.0.0/16.

      Пример вывода команды после успешной инициализации master-узла
      Your Kubernetes control-plane has initialized successfully!
      
      To start using your cluster, you need to run the following as a regular user:
      
        mkdir -p $HOME/.kube
        sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
        sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
      Alternatively, if you are the root user, you can run:
      
        export KUBECONFIG=/etc/kubernetes/admin.conf
      
      You should now deploy a pod network to the cluster.
      Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
        https://kubernetes.io/docs/concepts/cluster-administration/addons/
      
      Then you can join any number of worker nodes by running the following on each as root:
      
      kubeadm join 192.168.186.86:6443 --token kb0ejg.qtsdbljcnfcc3acd \
          --discovery-token-ca-cert-hash sha256:92d275184e764076086f4cc86bca47f6ecedd46526568cc494d97dc27958bec7
    3. Настройте параметры управления кластером:

      • Для управления кластером от имени локального пользователя выполните следующие команды:

        mkdir /home/$USER/.kube
        cp -i /etc/kubernetes/admin.conf /home/$USER/.kube/config
        chown $USER. /home/$USER/.kube /home/$USER/.kube/config
      • Для управления кластером от имени суперпользователя (root) выполните следующие команды:

        echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
        source .bashrc
        export KUBECONFIG=/etc/kubernetes/admin.conf
    4. Если настройка управления кластером производилась для локального пользователя, выйдите из сеанса пользователя root командой exit и дальнейшие действия по настройке кластера выполняйте от имени локального пользователя.

    5. Установите внутреннюю конфигурацию сети в кластере, выполнив следующую команду:

      kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
    6. Проверьте список и статус подов control plane (плоскости управления) кластера, выполнив следующую команду:

      kubectl get pod -n kube-system
      Пример вывода списка подов control plane кластера
      NAME                                          READY   STATUS    RESTARTS       AGE
      calico-kube-controllers-6c99c8747f-cxxdr      1/1     Running   0              1m
      calico-node-cxtrl                             1/1     Running   0              1m
      coredns-5d78c9869d-phl6k                      1/1     Running   0              1m
      coredns-5d78c9869d-w27xw                      1/1     Running   0              1m
      etcd.test.rvision.local                       1/1     Running   0              1m
      kube-apiserver.test.rvision.local             1/1     Running   0              1m
      kube-controller-manager.test.rvision.local    1/1     Running   0              1m
      kube-proxy-sw9qt                              1/1     Running   0              1m
      kube-scheduler.test.rvision.local             1/1     Running   0              1m
    7. Если установка выполняется на единственный узел, удалите все свойства taint с узла:

      1. Получите список свойств taint узла, выполнив следующую команду:

        kubectl get nodes <node_name> -o jsonpath='{.spec.taints}'

        Здесь:

        • <node_name> — имя узла.

        Пример вывода списка свойств taint для узла
        [{"effect":"NoSchedule","key":"node-role.kubernetes.io/master"},{"effect":"NoSchedule","key":"node-role.kubernetes.io/control-plane"}]
      2. Удалите свойства taint с узла, выполнив для каждого свойства следующую команду:

        kubectl taint node <node_name> <taint_key>-

        Здесь:

        • <node_name> — имя узла.

        • <taint_key> — имя свойства, находящееся в поле key сведений о нем.

    8. Установите дополнительные пакеты для инсталляции системы.

      • Установка пакетов для РЕД ОС:

        dnf install ansible yq jq
      • Установка пакетов для Astra Linux:

        apt-get install helm ansible yq jq
      Если какие-либо из указанных пакетов недоступны в репозитории производителя ОС, установите их согласно официальной документации производителя ОС.
    9. Для успешной установки менеджера логов Loki в составе системы измените имя сервиса kube-dns на coredns:

      1. Создайте копию файла конфигурации сервиса kube-dns:

        kubectl -n kube-system get svc kube-dns -o yaml > core.yaml
      2. Измените имя сервиса kube-dns на coredns:

        sed -i 's/name: kube-dns/name: coredns/g' core.yaml
      3. Удалите существующий сервис kube-dns:

        kubectl -n kube-system delete svc kube-dns
      4. Создайте сервис coredns, применив его конфигурацию:

        kubectl apply -f core.yaml
    10. Выведите команду для присоединения worker-узла, выполнив следующую команду:

      kubeadm token create --print-join-command
      Пример команды для присоединения worker-узла
      kubeadm join 192.168.186.86:6443 --token kb0ejg.qtsdbljcnfcc3acd --discovery-token-ca-cert-hash sha256:92d275184e764076086f4cc86bca47f6ecedd46526568cc494d97dc27958bec7
  18. На каждом из worker-узлов выполните вышеуказанную команду для присоединения worker-узла к кластеру.

Включение шифрования трафика между узлами кластера

Чтобы настроить шифрование трафика между узлами кластера, вы можете включить использование протокола WireGuard для сетевого плагина Calico. После этого плагин начнет создавать защищенные туннели между узлами кластера.

  • Для работы WireGuard требуется ядро Linux версии 5.6 и выше, поскольку этот протокол встроен в ядро начиная с версии 5.6.

  • Трафик между узлами кластера шифруется, но на каждом узле трафик между самим подом и его хостом остается открытым. Считается, что для его перехвата злоумышленнику требуется прямой доступ к самому хосту.

  • Трафик между подами на одном узле не шифруется.

Инструкции по устранению типичных проблем при работе WireGuard приведены в разделе Устранение проблем при эксплуатации системы.

Чтобы включить шифрование трафика между узлами кластера, выполните следующие действия:

  1. Убедитесь что на всех узлах кластера открыт порт 51820.

  2. Подключитесь к терминалу master-узла кластера.

  3. Чтобы отслеживать статус WireGuard, установите утилиту wg с помощью менеджера пакетов вашей операционной системы, например:

    sudo dnf install -y yq wireguard-tools
  4. Включите параметр wireguardEnabled в ресурсе FelixConfiguration, выполнив следующую команду:

    kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'
  5. Убедитесь, что шифрование трафика между узлами кластера включено:

    1. Проверьте, что в информации об узлах Calico появилось поле wireguardPublicKey:

      for node in $(kubectl get nodes -o yaml| yq '.items[].metadata.name'); do
        echo ">>> $node";
        calicoctl get node $node -o yaml | grep wireguardPublicKey;
      done
    2. Проверьте, что утилита wg возвращает информацию о конфигурации, с помощью следующих команд:

      sudo wg show
      sudo wg showconf wireguard.cali

В Calico процесс обновления ключей WireGuard полностью автоматизирован и не требует ручных действий. Он встроен в работу компонента Felix на каждом узле кластера.

Описание алгоритма обновления ключей приведено в разделе Обновление ключей WireGuard.

Была ли полезна эта страница?

Обратная связь