Product SiteDocumentation Site

Глава 73. Установка и настройка Kubernetes

73.1. Создание кластера Kubernetes
73.1.1. Инициализация кластера
73.1.2. Настройка сети
73.1.3. Добавление узлов в кластер
73.2. Тестовый запуск nginx
Для создания управляющего (control plane) или вычислительного (worker) узла нужно установить следующие пакеты:
# apt-get install kubernetes1.31-kubeadm kubernetes1.31-kubelet kubernetes1.31-crio cri-tools1.31
Запустить и включить службы crio и kubelet:
# systemctl enable --now crio
# systemctl enable --now kubelet

Примечание

В данном руководстве рассмотрен процесс разворачивания кластера с использованием CRI-O.

73.1. Создание кластера Kubernetes

Для создания кластера необходимо несколько машин (узлов), одна из которых будет управляющим узлом.
Системные требования:
  • ОЗУ: 2 ГБ или более на узел;
  • Процессор: 2 ядра или более;
  • сетевая доступность между всеми узлами;
  • возможность разрешения имён (через DNS или /etc/hosts);
  • Swap должен быть отключен.

    Примечание

    Для отключения Swap нужно выполнить команду:
    # swapoff -a
    И удалить соответствующую строку в /etc/fstab.

73.1.1. Инициализация кластера

Для инициализации кластера нужно на управляющем узле выполнить одну из команд:
  • для настройки сети с использованием Flannel:
    # kubeadm init --pod-network-cidr=10.244.0.0/16
    
  • для настройки сети с использованием Calico:
    # kubeadm init --pod-network-cidr=192.168.0.0/16
    
  • с использованием образов из репозитория ALT (для Flannel)
    # kubeadm init --pod-network-cidr=10.244.0.0/16 \
      --kubernetes-version=1.31.10 \
      --image-repository=registry.altlinux.org/p11
    
  • использованием образов из репозитория ALT (для Calico):
    # kubeadm init --pod-network-cidr=192.168.0.0/16 \
      --kubernetes-version=1.31.10 \
      --image-repository=registry.altlinux.org/p11
    
Пояснение параметров:
  • --pod-network-cidr — диапазон IP-адресов для подсети Pod'ов:
    • 10.244.0.0/16 — рекомендуется для Flannel;
    • 192.168.0.0/16 — рекомендуется для Calico;
  • --image-repository — указывает реестр для образов control plane (по умолчанию registry.k8s.io);
  • --kubernetes-version — фиксирует версию компонентов control plane.
Если инициализация прошла успешно, будет выведено сообщение:
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.0.103:6443 --token 4o84lf.yerap79j66r4riwi \
	--discovery-token-ca-cert-hash sha256:35b569232b0e81ca19cf23948cb7b3580e17be7059bbf242c4fb0e481afd8ff6
Настроить доступ для обычного пользователя:
  1. Создать каталог ~/.kube (с правами пользователя):
    $ mkdir ~/.kube
    
  2. Скопировать конфигурацию (с правами администратора):
    # cp /etc/kubernetes/admin.conf /home/<пользователь>/.kube/config
    
  3. Изменить владельца конфигурационного файла (с правами администратора):
    # chown <пользователь>: /home/<пользователь>/.kube/config
    

73.1.2. Настройка сети

Развернуть сеть (Container Network Interface), запустив один из двух наборов команд (на мастер-узле):
  • для Flannel:
    $ kubectl apply -f https://gitea.basealt.ru/alt/flannel-manifests/raw/branch/main/p11/latest/kube-flannel.yml
    
  • для Calico:
    • перейти в каталог /etc/cni/net.d/:
      # cd /etc/cni/net.d/
    • создать конфигурационный файл 100-crio-bridge.conflist:
      # cp 100-crio-bridge.conflist.sample 100-crio-bridge.conflist
      
    • запустить POD'ы из calico-манифестов:
      $ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/refs/tags/v3.25.0/manifests/tigera-operator.yaml
      $ kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/refs/tags/v3.25.0/manifests/custom-resources.yaml
      
В выводе будут отображены имена всех созданных ресурсов.
Убедиться, что все системные Pod'ы запущены:
$ kubectl get pods --namespace kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-7c65d6cfc9-f6hjb         1/1     Running   0          4m49s
coredns-7c65d6cfc9-g7hbf         1/1     Running   0          4m49s
etcd-kube03                      1/1     Running   0          4m51s
kube-apiserver-kube03            1/1     Running   0          4m54s
kube-controller-manager-kube03   1/1     Running   0          4m56s
kube-proxy-ncdxh                 1/1     Running   0          4m50s
kube-scheduler-kube03            1/1     Running   0          4m49s
coredns должны быть в состоянии Running. Количество kube-flannel и kube-proxy зависит от общего числа узлов.

73.1.3. Добавление узлов в кластер

На каждом worker-узле выполните команду kubeadm join, выведенную при инициализации:
# kubeadm join <ip адрес>:<порт> --token <токен>
 --discovery-token-ca-cert-hash sha256:<хеш> --ignore-preflight-errors=SystemVerification
В данном примере:
# kubeadm join 192.168.0.103:6443 --4o84lf.yerap79j66r4riwi \
	--discovery-token-ca-cert-hash  \
    sha256:35b569232b0e81ca19cf23948cb7b3580e17be7059bbf242c4fb0e481afd8ff6

[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-check] Waiting for a healthy kubelet at http://127.0.0.1:10248/healthz. This can take up to 4m0s
[kubelet-check] The kubelet is healthy after 502.186592ms
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Примечание

Получить токен, если его нет, можно выполнив команду (на мастер-узле):
$ kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES
4o84lf.yerap79j66r4riwi   23h         2025-08-25T09:00:31Z   authentication,signing
По умолчанию срок действия токена — 24 часа. Если требуется добавить новый узел в кластер по окончанию этого периода, можно создать новый токен:
$ kubeadm token create
Если значение параметра --discovery-token-ca-cert-hash неизвестно, его можно получить, выполнив команду (на мастер-узле):
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
   openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'
35b569232b0e81ca19cf23948cb7b3580e17be7059bbf242c4fb0e481afd8ff6
Для ввода IPv6-адреса в параметр <control-plane-host>:<control-plane-port>, адрес control plane должен быть в квадратных скобках:
[fd00::101]:2073
Проверить наличие нод (на мастер-ноде):
$ kubectl get nodes
NAME     STATUS     ROLES           AGE    VERSION
kube01   Ready      <none>          2m2s   v1.31.11
kube02   NotReady   <none>          7s     v1.31.11
kube03   Ready      control-plane   8m4s   v1.31.11
или
$ kubectl get nodes -o wide
Информация о кластере:
$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.0.103:6443
CoreDNS is running at https://192.168.0.103:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Подробная информация об узле:
$ kubectl describe node kube03