Входные данные Установка Docker Registry Настройка сети Установка docker Загрузка образов Загрузка образов из сети Интернет Загрузка образов из архива Запуск локального registry Настройка Master-node Настройка рабочих нод Подключение worker к кластеру
Окружение
В рамках рассматриваемого далее примера развертывания программной платформы kubernetes предполагается, что в работе используется три машины:
Registry – для размещения локального хранилища образов с присвоенным статическим IP-адресом 10.0.2.20,
Master – мастер-нода с присвоенным статическим IP-адресом 10.0.2.16,
Worker – рабочая нода с присвоенным статическим IP-адресом 10.0.2.17,
которые располагаются в закрытой сети 10.0.2.0/24.
Указанные IP-адреса необходимо заменить на фактически используемые значения в сети.
Для дальнейшей настройки необходимо перейти в сеанс пользователя root:
su -
Далее команды будут выполняться с правами пользователя root, если не указано иное.
Измените хостовое имя машины:
hostnamectl set-hostname registry
В файл /etc/hosts внесите данные о registry:
nano /etc/hosts
10.0.2.20 registry
Для установки 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 (настраиваемая машина);
10.0.2.20
5000 – порт для подключения к локальному regisrty (по умолчанию).
5000
Для сохранения настройки перезапустите конфигурацию системных служб и службу docker:
systemctl daemon-reload systemctl restart docker
Для дальнейшей настройки локального хранилища необходимые образы должны быть предварительно загружены и доступны при вызове команды docker images.
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 командой:
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
1. Для работы kubelet отключите swap:
swapoff -a
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:
nano /etc/modules-load.d/containerd.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-tools iproute-tc ebtables socat conntrack git curl wget runc containerd
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
5. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
6. Запустите службу containerd и добавьте ее в автозагрузку:
systemctl enable --now containerd
7. Установите настройки по умолчанию для конфигурации контейнера:
containerd config default | sudo tee /etc/containerd/config.toml
8. Внесите изменения в файл конфигурации /etc/containerd/config.toml:
nano /etc/containerd/config.toml
8.1 Настройте доступ к локальному registry.
Для этого замените строку:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
на:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.0.2.20:5000"] endpoint = ["http://10.0.2.20:5000"]
8.2 Настройте доступ к контейнеру pause. Обратите внимание, что текущая версия Kubernetes (1.24.17) совместима с контейнером pause только версии 3.7.
Замените строку:
[plugins."io.containerd.grpc.v1.cri"] ... sandbox_image = "registry.k8s.io/pause:3.8"
[plugins."io.containerd.grpc.v1.cri"] ... sandbox_image = "10.0.2.20:5000/pause:3.7"
8.3 Настройте расположение сетевых плагинов.
[plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/opt/cni/bin"
[plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/usr/libexec/cni"
8.4 Настройте использование драйвера cgroup.
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] ... SystemdCgroup = false
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] ... SystemdCgroup = true
9. Перезагрузите конфигурации служб:
systemctl daemon-reload
10. Перезапустите службу containerd:
systemctl restart containerd
11. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
12. Проверьте доступность локального хранилища:
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
13. Для инициализации мастер-ноды необходимо:
13.1 Вывести конфигурацию по умолчанию командой:
kubeadm config print init-defaults > kubeadm-config.yaml
13.2 Привести содержимое конфигурации к следующему виду:
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.0.2.16 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock imagePullPolicy: IfNotPresent name: node taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: 10.0.2.20:5000 imageTag: 3.5.15-0 imageRepository: 10.0.2.20:5000 kind: ClusterConfiguration kubernetesVersion: 1.24.17 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 scheduler: {}
13.3 Сохранить внесенные в конфигурацию изменения.
13.4 Запустить инициализацию мастер-ноды в одноранговом кластере. Данная команда выполнит начальную настройку и подготовку основного узла кластера.
kubeadm init --config=kubeadm-config.yaml
В случае успешной инициализации в конце вывода команды будет отображаться примерно следующее:
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 abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:fff28749381ebebba6754155104ac8ce0ad3b5a992f9cf73757ea2d352b7785a
14. Настройте параметры управления кластером. Настройку можно выполнить как для локального пользователя, так и для суперпользователя 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 выполните команду:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc source /root/.bashrc export KUBECONFIG=/etc/kubernetes/admin.conf
Если в используемой системе файл, отвечающий за настройки разрешения доменных имен (/etc/resolv.conf), располагается по нестандартному пути или имеет нестандартное наименование, скорректируйте путь расположения файла в configmap. Для этого выполните команду:
configmap
kubectl edit configmap coredns -n kube-system
и внесите следующие изменения:
forward . /<путь_к_файлу>/<имя_файла> { max_concurrent 1000 }
Если настройка производилась для локального пользователя, выйдите из сеанса пользователя root командой exit и дальнейшие действия по настройке кластера выполняйте от имени локального пользователя.
exit
15. Настройте внутреннюю конфигурацию сети в кластере (в примере используется flannel).
15.1 Импортируйте образы на хосте с настроенным локальным registry:
docker load -i ~/flannel-cni-plugin-flannel.tar.xz docker load -i ~/flannel-flanneld.tar.xz
15.2 Задайте новые имена для загруженных образов командой вида:
docker tag <имя_распакованного_образа>:<тег> <IP-адрес_registry>:<порт>/<имя_образа>:<тег>
<IP-адрес_registry> — IP-адрес хоста с настроенным локальным registry;
<IP-адрес_registry>
<порт> — порт для подключения к локальному registry (по умолчанию 5000);
<порт>
<имя_образа> — имя образа;
<имя_образа>
<тег> — тег образа.
<тег>
Например:
docker tag registry.red-soft.ru/k8s7c/flannel-cni-plugin-flannel:240916 10.0.2.20:5000/flannel-cni-plugin-flannel:240916docker tag registry.red-soft.ru/k8s7c/flannel-flanneld:240919 10.0.2.20:5000/flannel-flanneld:240919
10.0.2.20 — IP-адрес хоста с настроенным локальным registry;
5000 — порт для подключения к локальному registry (по умолчанию 5000);
flannel-cni-plugin-flannel, flannel-flanneld — имена образов;
flannel-cni-plugin-flannel
flannel-flanneld
240916
240919
15.3 Загрузите распакованные образы в локальное хранилище:
docker push 10.0.2.20:5000/flannel-cni-plugin-flannel:240916docker push 10.0.2.20:5000/flannel-flanneld:240919
15.4 На master-ноде создайте файл конфигурации kube-flannel.yaml со следующим содержимым:
apiVersion: v1 kind: Namespace metadata: labels: k8s-app: flannel pod-security.kubernetes.io/enforce: privileged name: kube-flannel --- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: flannel name: flannel namespace: kube-flannel --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: flannel name: flannel rules: - apiGroups: - "" resources: - pods verbs: - get - apiGroups: - "" resources: - nodes verbs: - get - list - watch - apiGroups: - "" resources: - nodes/status verbs: - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: flannel name: flannel roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: flannel subjects: - kind: ServiceAccount name: flannel namespace: kube-flannel --- apiVersion: v1 kind: ConfigMap metadata: labels: app: flannel k8s-app: flannel tier: node name: kube-flannel-cfg namespace: kube-flannel data: cni-conf.json: | { "name": "cbr0", "cniVersion": "0.3.1", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] } net-conf.json: | { "Network": "10.244.0.0/16", "EnableNFTables": false, "Backend": { "Type": "vxlan" } } --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: flannel k8s-app: flannel tier: node name: kube-flannel-ds namespace: kube-flannel spec: selector: matchLabels: app: flannel k8s-app: flannel template: metadata: labels: app: flannel k8s-app: flannel tier: node spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/os operator: In values: - linux containers: - args: - --ip-masq - --kube-subnet-mgr command: - flanneld env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: EVENT_QUEUE_DEPTH value: "5000" image: 10.0.2.20:5000/flannel-flanneld:240919 name: kube-flannel resources: requests: cpu: 100m memory: 50Mi securityContext: capabilities: add: - NET_ADMIN - NET_RAW privileged: false volumeMounts: - mountPath: /run/flannel name: run - mountPath: /etc/kube-flannel/ name: flannel-cfg - mountPath: /run/xtables.lock name: xtables-lock hostNetwork: true initContainers: - args: - -f - /flannel - /usr/libexec/cni/flannel command: - cp image: 10.0.2.20:5000/flannel-cni-plugin-flannel:240916 name: install-cni-plugin volumeMounts: - mountPath: /usr/libexec/cni name: cni-plugin - args: - -f - /etc/kube-flannel/cni-conf.json - /etc/cni/net.d/10-flannel.conflist command: - cp image: 10.0.2.20:5000/flannel-flanneld:240919 name: install-cni volumeMounts: - mountPath: /etc/cni/net.d name: cni - mountPath: /etc/kube-flannel/ name: flannel-cfg priorityClassName: system-node-critical serviceAccountName: flannel tolerations: - effect: NoSchedule operator: Exists volumes: - hostPath: path: /run/flannel name: run - hostPath: path: /usr/libexec/cni name: cni-plugin - hostPath: path: /etc/cni/net.d name: cni - configMap: name: kube-flannel-cfg name: flannel-cfg - hostPath: path: /run/xtables.lock type: FileOrCreate name: xtables-lock
Сохраните внесенные в конфигурацию изменения.
15.5 На master-ноде примените внутреннюю конфигурацию сети в кластере:
kubectl apply -f kube-flannel.yaml
Потребуется некоторое время для настройки (от 2 до 5 минут).
16. После применения конфигурации проверьте список и статус системных компонентов Kubernetes, а также компонентов сетевого плагина flannel:
kubectl get all -n kube-system kubectl get all -n kube-flannel
17. Выполните дополнительную настройку сети:
sudo hostnamectl set-hostname masternode
Проверьте изменения:
hostname && hostname -I masternode 10.0.2.16
18. В файл /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
12. Выполните дополнительную настройку сети:
sudo hostnamectl set-hostname worker
hostname && hostname -I worker10.0.2.17
13. В файл /etc/hosts внесите данные о master и worker:
После этого можно приступать к присоединению worker к кластеру.
1. На master-ноде получите команду присоединения worker:
2. На worker выполните полученную команду:
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 --discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391 [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
Дата последнего изменения: 27.02.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Нажимая «Отправить запрос», вы соглашаетесь с условиями обработки персональных данных.
Вы будете получать только актуальную информацию по обновлению безопасности
Подписываясь на уведомления, вы соглашаетесь с условиями обработки персональных данных.
На ваш почтовый адрес отправлено письмо с подтверждением подписки.