2.9.16.2.5.1 Установка kubernetes с использованием контейнерного движка cri-o без доступа в Интернет
Скачать документ Входные данные
Установка Docker Registry
Настройка сети
Установка docker
Загрузка образов
Загрузка образов из сети Интернет
Загрузка образов из архива
Запуск локального registry
Настройка Master-node
Настройка рабочих нод
Подключение worker к кластеру
Окружение
- Версия РЕД ОС: 7.3
- Конфигурация: Сервер графический
- Версия ПО: kubernetes-1.24.12-1, kubernetes-kubeadm-1.24.12-1
Входные данные
В рамках данной инструкции предполагается, что в работе используется три машины:
Registry – для размещения локального хранилища образов,
Master – мастер-нода,
Worker – рабочая нода,
которые располагаются в закрытой сети 10.0.2.0/24.
Для дальнейшей настройки необходимо перейти в сеанс пользователя root:
su -
Далее команды будут выполняться с правами пользователя root, если не указано иное.
Установка Docker Registry
Настройка сети
Измените хостовое имя машины:
hostnamectl set-hostname registry
В файл /etc/hosts внесите данные о registry:
nano /etc/hosts
10.0.2.20 registry
Установка docker
Для установки docker выполните команду:
dnf install docker-ce
Запустите службу docker и добавьте ее в автозагрузку командой:
systemctl enable --now docker
В файле конфигурации демона docker необходимо указать, что с созданным хранилищем можно взаимодействовать:
nano /etc/docker/daemon.json
{
"insecure-registries": ["10.0.2.20:5000"],
"log-driver": "journald",
"live-restore": true,
"icc": false,
"disable-validation": true
}
где:
10.0.2.20 – IP-адрес машины с локальным regisrty (настраиваемая машина);
5000 – порт для подключения к локальному regisrty (по умолчанию).
Для сохранения настройки перезапустите службу docker:
systemctl restart docker
Загрузка образов
Для дальнейшей настройки локального хранилища необходимые образы должны быть предварительно загружены и доступны при вызове команды docker images
.
Загрузка образов из сети Интернет
Для загрузки образов из официального хранилища компании РЕД СОФТ выполните:
docker pull registry.red-soft.ru/ubi7/registry:latest docker pull registry.red-soft.ru/ubi7/ubi:latest
Загруженным образам необходимо задать теги командой:
docker tag registry.red-soft.ru/ubi7/registry:latest 10.0.2.20:5000/registry:latest docker tag registry.red-soft.ru/ubi7/ubi:latest 10.0.2.20:5000/ubi:latest
Обратите внимание, что загрузить и задать теги следует для всех необходимых образов.
Загрузка образов из архива
В случае если настройка локального registry производится в полностью изолированном контуре, необходимо загрузить образы на машину с доступом к сети Интернет, аналогично п. «Загрузка образов из сети Интернет», и задать соответствующие теги.
Затем сохраните образы в архив:
docker save 10.0.2.20:5000/registry:latest > ~/registry.tar docker save 10.0.2.20:5000/ubi:latest > ~/ubi.tar
Обратите внимание, что загрузить, задать теги и сохранить следует все необходимые образы.
После этого перенесите сохраненные образы на изолированную машину с registry, например, с помощью утилиты scp:
scp ubi.tar registry.tar registry:~
После получения архивов на изолированной машине с registry распакуйте их:
docker load -i ~/registry.tar docker load -i ~/ubi.tar
Если передача образов была выполнена корректно, вывод команды docker images
должен иметь следующий вид:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.0.2.20:5000/registry latest ec0246191e3d 34 hours ago 77MB 10.0.2.20:5000/ubi latest 59db2d81180c 34 hours ago 202MB
Запуск локального registry
Создайте и запустите контейнер registry командой:
docker run -d -p 5000:5000 --restart=always --name registry 10.0.2.20:5000/registry:latest
В случае если образы необходимо хранить отдельно от контейнеров (не в каталоге по умолчанию – /var/lib/registry), создайте новый каталог и примонтируйте его при запуске registry, заменив каталог по умолчанию:
mkdir ~/registry
docker run -d -p 5000:5000 --restart=always --name registry -v ~/registry:/var/lib/registry 10.0.2.20:5000/registry:latest
Поместите образы в настроенное локальное хранилище:
docker push 10.0.2.20:5000/registry:latest docker push 10.0.2.20:5000/ubi:latest
Для проверки работоспособности настроенного локального хранилища попробуйте извлечь из него какой-либо образ, например:
docker pull 10.0.2.20:5000/ubi:latest
Если все настроено верно, вывод команды будет иметь примерно следующий вид:
latest: Pulling from ubi 06fcd37e7f38: Pull complete Digest: sha256:169d5d23b82be10e4517058c4372ecff4e1fc3255fcb017ee3bbcecd6d3db397 Status: Downloaded newer image for 10.0.2.20:5000/ubi:latest 10.0.2.20:5000/ubi:latest
Настройка Master-node
1. Для работы kubelet отключите swap:
- выполните команду для разового отключения:
swapoff -a
- чтобы swap не появился после перезагрузки сервера, выполните команду:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса crio:
nano /etc/modules-load.d/crio.conf
overlay
br_netfilter
Загрузите модули в ядро:
modprobe overlay modprobe br_netfilter
Проверьте, что данные модули работают:
lsmod | egrep "br_netfilter|overlay"
3. Создайте конфигурационный файл для работы сети внутри kubernetes:
nano /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
Примените параметры командой:
sysctl --system
4. Установите необходимые пакеты:
dnf install kubernetes kubernetes-kubeadm cri-o cri-tools
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
5. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
6. Запустите службу crio и добавьте ее в автозагрузку:
systemctl enable --now crio
7. Установите настройки по умолчанию для конфигурации контейнера:
sed -i '/^\[crio\.runtime\]/a seccomp_profile = "\/etc\/containers\/policy.json"' /etc/crio/crio.conf
8. Внесите изменения в файл конфигурации /etc/crio/crio.conf:
nano /etc/crio/crio.conf
Замените строку:
# pause_image = "registry.k8s.io/pause:3.6"
на:
pause_image = "10.0.2.20:5000/pause:3.7"
9. В конце файла /etc/containers/registries.conf добавьте строки:
[[registry]]
location="10.0.2.20:5000"
insecure=true
10. Перезагрузите конфигурации служб:
systemctl daemon-reload
11. Перезапустите службу crio:
systemctl restart crio
12. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
13. Проверьте доступность локального хранилища:
ping 10.0.2.20
PING 10.0.2.20 (10.0.2.20) 56(84) bytes of data.
64 bytes from 10.0.2.20: icmp_seq=1 ttl=64 time=0.248 ms
64 bytes from 10.0.2.20: icmp_seq=2 ttl=64 time=0.312 ms
64 bytes from 10.0.2.20: icmp_seq=3 ttl=64 time=0.391 ms
64 bytes from 10.0.2.20: icmp_seq=4 ttl=64 time=0.413 ms
--- 10.0.2.20 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3068ms
rtt min/avg/max/mdev = 0.248/0.341/0.413/0.065 ms
14. Проверьте доступность образов:
kubeadm config images list --image-repository 10.0.2.20:5000
[I1121 13:16:04.377507 33239 version.go:256] remote version is much newer: v1.28.4; falling back to: stable-1.24
10.0.2.20:5000/kube-apiserver:v1.24.17
10.0.2.20:5000/kube-controller-manager:v1.24.17
10.0.2.20:5000/kube-scheduler:v1.24.17
10.0.2.20:5000/kube-proxy:v1.24.17
10.0.2.20:5000/pause:3.7
10.0.2.20:5000/etcd:3.5.6-0
10.0.2.20:5000/coredns:v1.8.6
15. Загрузите образы контейнеров из локального хранилища, необходимые kubeadm для инициализации ноды кластера:
kubeadm config images pull --image-repository 10.0.2.20:5000 --cri-socket unix:///var/run/crio/crio.sock
16. Запустите инициализацию мастер-ноды в одноранговом кластере. Данная команда выполнит начальную настройку и подготовку основного узла кластера. Ключ --pod-network-cidr
задает адрес внутренней подсети для вашего кластера.
kubeadm init --image-repository 10.0.2.20:5000 --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///var/run/crio/crio.sock
В случае успешной инициализации, в конце вывода команды будет отображаться примерно следующее:
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 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 \
--discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391
17. Настройте параметры управления кластером. Настройку можно выполнить как для локального пользователя, так и для суперпользователя root.
Для управления кластером от имени локального пользователя выполните команды:
mkdir /home/$USER/.kube cp -i /etc/kubernetes/admin.conf /home/$USER/.kube/config chown $USER. /home/$USER/.kube /home/$USER/.kube/config
Для управления кластером от имени суперпользователя root выполните команду:
export KUBECONFIG=/etc/kubernetes/admin.conf
Выполните настройку /etc/resolv.conf. В случае если настройка /etc/resolv.conf не предполагается, внесите изменения в configmap для coredns:
kubectl edit configmap coredns -n kube-system
удалите следующие строки:
forward . /etc/resolv.conf {
max_concurrent 1000
}
Если настройка производилась для локального пользователя, выйдите из сеанса пользователя root командой exit
и дальнейшие действия по настройке кластера выполняйте от имени локального пользователя.
18. Настройте внутреннюю конфигурацию сети в кластере (в примере используется calico).
19.1 Для этого на машине с выходом в Интернет необходимо загрузить следующие образы:
docker pull docker.io/calico/cni:v3.25.0 docker pull docker.io/calico/node:v3.25.0 docker pull docker.io/calico/kube-controllers:v3.25.0
19.2 Задать теги для загруженных образов:
docker tag docker.io/calico/cni:v3.25.0 10.0.2.20:5000/cni:v3.25.0 docker tag docker.io/calico/node:v3.25.0 10.0.2.20:5000/node:v3.25.0 docker tag docker.io/calico/kube-controllers:v3.25.0 10.0.2.20:5000/kube-controllers:v3.25.0
19.3 Сохранить в архив и отправить образы на машину с настроенным локальным registry:
docker save 10.0.2.20:5000/cni:v3.25.0 > cni.tar docker save 10.0.2.20:5000/node:v3.25.0 > node.tar docker save 10.0.2.20:5000/kube-controllers:v3.25.0 > kube-ctrl.tar scp cni.tar node.tar kube-ctrl.tar registry:~
19.4 Распаковать образы на машине с настроенным локальным registry:
docker load -i cni.tar docker load -i node.tar docker load -i kube-ctrl.tar
19.5 Загрузить распакованные образы в локальное хранилище:
docker push 10.0.2.20:5000/cni:v3.25.0 docker push 10.0.2.20:5000/node:v3.25.0 docker push 10.0.2.20:5000/kube-controllers:v3.25.0
19.6 На машине с выходом в Интернет необходимо дополнительно скачать файл конфигурации calico:
curl -o calico.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
и привести следующие строки:
Номер строки Имя образа
4443 docker.io/calico/cni:v3.25.0
4471 docker.io/calico/cni:v3.25.0
4514 docker.io/calico/node:v3.25.0
4540 docker.io/calico/node:v3.25.0
4757 docker.io/calico/kube-controllers:v3.25.0
к следующему виду:
Номер строки Имя образа
4443 10.0.2.20:5000/cni:v3.25.0
4471 10.0.2.20:5000/cni:v3.25.0
4514 10.0.2.20:5000/node:v3.25.0
4540 10.0.2.20:5000/node:v3.25.0
4757 10.0.2.20:5000/kube-controllers:v3.25.0
Например:
было:
- name: upgrade-ipam
image: docker.io/calico/cni:v3.25.0
imagePullPolicy: IfNotPresent
command: ["/opt/cni/bin/calico-ipam", "-upgrade"]
envFrom:
стало:
- name: upgrade-ipam
image: 10.0.2.15:5000/cni:v3.25.0
imagePullPolicy: IfNotPresent
command: ["/opt/cni/bin/calico-ipam", "-upgrade"]
envFrom:
Сохраните внесенные в конфигурацию изменения и передайте файл на машину с настраиваемой master-нодой.
19.7 На master-ноде примените внутреннюю конфигурацию сети в кластере:
kubectl apply -f calico.yaml
Потребуется некоторое время для настройки (от 2 до 5 минут).
20. После применения конфигурации проверьте список и статус всех подов в кластере:
kubectl get all -n kube-system
21. Выполните дополнительную настройку сети:
sudo hostnamectl set-hostname masternode
Проверьте изменения:
hostname && hostname -I masternode 10.0.2.16
22. В файл /etc/hosts внесите данные о master и worker:
sudo nano /etc/hosts
10.0.2.16 masternode
10.0.2.17 worker
Для вывода команды присоединения worker к кластеру выполните:
kubeadm token create --print-join-command
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 \
--discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391
Настройка рабочих нод
1. Для работы kubelet отключите swap:
- выполните команду для разового отключения:
swapoff -a
- чтобы swap не появился после перезагрузки сервера, выполните команду:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса crio:
nano /etc/modules-load.d/crio.conf
overlay
br_netfilter
Загрузите модули в ядро:
modprobe overlay modprobe br_netfilter
Проверьте, что данные модули работают:
lsmod | egrep "br_netfilter|overlay"
3. Создайте конфигурационный файл для работы сети внутри kubernetes:
nano /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
Примените параметры командой:
sysctl --system
4. Установите необходимые пакеты:
dnf install kubernetes kubernetes-kubeadm cri-o cri-tools
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
5. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
6. Запустите службу crio и добавьте ее в автозагрузку:
systemctl enable --now crio
7. Установите настройки по умолчанию для конфигурации контейнера:
sed -i '/^\[crio\.runtime\]/a seccomp_profile = "\/etc\/containers\/policy.json"' /etc/crio/crio.conf
8. Внесите изменения в файл конфигурации /etc/crio/crio.conf:
nano /etc/crio/crio.conf
Замените строку:
# pause_image = "registry.k8s.io/pause:3.6"
на:
pause_image = "10.0.2.20:5000/pause:3.7"
9. В конце файла /etc/containers/registries.conf добавьте строки:
[[registry]]
location="10.0.2.20:5000"
insecure=true
10. Перезагрузите конфигурации служб:
systemctl daemon-reload
11. Перезапустите службу crio:
systemctl restart crio
12. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
13. Выполните дополнительную настройку сети:
sudo hostnamectl set-hostname worker
Проверьте изменения:
hostname && hostname -I
worker
10.0.2.17
14. В файл /etc/hosts внесите данные о master и worker:
sudo nano /etc/hosts
10.0.2.16 masternode
10.0.2.17 worker
Подключение worker к кластеру
1. На master-ноде получите команду присоединения worker:
kubeadm token create --print-join-command
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 \
--discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391
2. На worker выполните полученную команду:
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 --discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391 --cri-socket unix:///var/run/crio/crio.sock
[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-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.
3. На master выполните команду для вывода списка нод кластера и их статуса:
kubectl get nodes NAME STATUS ROLES AGE VERSION localhost.localdomain Ready control-plane 5h3m v1.24.17 worker Ready <none> 89s v1.24.17
Дата последнего изменения: 05.11.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.