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

Данное руководство описывает процесс установки кластера Kubernetes в окружении РЕД ОС, Альт Сервер и Astra Linux с использованием подключения к Интернету. Для офлайн-установки в окружении РЕД ОС обратитесь к разделу Установка кластера Kubernetes с помощью Kubespray.

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

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

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

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

Чтобы установить 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. Примените изменения параметров sysctl, выполнив следующую команду:

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

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

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

      apt-get install kubernetes-kubeadm kubernetes-kubelet containerd cri-tools
    • Установка пакетов для Astra Linux:

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

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

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

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

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

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

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

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

    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. Запустите инициализацию управляющего узла в одноранговом кластере.

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

      Здесь:

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

      Пример вывода команды после успешной инициализации управляющего узла
      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. Проверьте список и статус подов контрольной плоскости кластера, выполнив следующую команду:

      kubectl get pod -n kube-system
      Пример вывода списка подов контрольной плоскости кластера
      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. Если установка выполняется на единственный узел, удалите все метки (taints) с узла:

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

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

        Здесь:

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

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

        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. Выведите команду для присоединения рабочего узла, выполнив следующую команду:

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