Требования к системе
2 узла, требования к плоскости управления — 4 ГБ, 4 ЦП, 50 ГБ
3 узла, требования к рабочему узлу — 16 ГБ, 8 ЦП, 100 ГБ
Инструменты системного администратора
Установите следующие предварительные требования на всех узлах
dnf install nano mc iputils wget curl vim bash-completion nc tcpdump telnet bind-utils -y
Шаг 1: Установите имя хоста и обновите файл хостов
Войдите в систему или ssh на каждой машине и выполните команды hostnamectl, чтобы задать соответствующее имя хоста.
sudo hostnamectl set-hostname “kube-apiserver.kalyuzhnyy.ru” && exec bash
и т.д. для соответствующего сервера своя запись sudo hostnamectl set-hostname…
Добавьте следующие записи в файл
nano /etc/hosts на каждом узле.
192.168.0.70 k8rhelsmas1.kalyuzhnyy.ru
192.168.0.71 k8rhelsmas1.kalyuzhnyy.ru
192.168.0.72 k8rhelswor1.kalyuzhnyy.ru
192.168.0.73 k8rhelswor2.kalyuzhnyy.ru
192.168.0.74 k8rhelswor3.kalyuzhnyy.ru
Шаг 2: Отключите пространство подкачки на каждом узле
Удалите записи подкачки Swap из /etc/default/grub
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Сохраните и выйдите, а затем введите команду
grub2-mkconfig -o /boot/grub2/grub.cfg
Шаг 3: Настройте правила SELinux и Firewall для Kubernetes
Установите режим SELinux как разрешающий на всех узлах с помощью следующих команд:
sudo setenforce 0
sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux
Требования к межсетевому экрану
Нам нужно количество портов как в плоскости управления, так и в рабочих узлах, убедитесь, что разрешены порты ниже
На главном узле разрешите следующие порты в брандмауэре.
На плоскости управления или главных узлах
firewall-cmd --permanent --add-service={kube-apiserver,kube-control-plane,kube-control-plane-secure,kube-api,kube-worker}
firewall-cmd --permanent --zone=trusted --add-interface=lo
firewall-cmd --permanent --zone=trusted --add-service={kube-api,kube-scheduler,kube-scheduler-secure,kube-controller-manager}
firewall-cmd --reload
firewall-cmd --list-all-zones
или
sudo firewall-cmd --zone=public --permanent --add-port=6443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10250/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10251/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10252/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10255/tcp
sudo firewall-cmd --zone=public --permanent --add-port=5473/tcp
sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
или
sudo firewall-cmd --permanent --add-port={6443,2379,2380,10250,10251,10252,10257,10259,179}/tcp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --reload
Или выключить фаервол
systemctl stop firewalld
systemctl disable firewalld
На рабочих узлах
firewall-cmd --permanent --add-service=kube-worker
firewall-cmd --permanent --zone=trusted --add-interface=lo
firewall-cmd --permanent --zone=trusted --add-service=kube-api
firewall-cmd --reload
firewall-cmd --list-all-zones
Шаг 4: Добавьте модули и параметры ядра
Переадресация IPv4 и предоставление iptables возможности видеть трафик по мостам
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
Параметры sysctl, необходимые во время настройки.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
Включение модулей и проверка.
modprobe overlay
modprobe br_netfilter
lsmod | grep br_netfilter
lsmod | grep overlay
Применяйте параметры без перезагрузки серверов
sysctl --system
Убедитесь, что установлено значение 1.
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
Установка контейнерных сред выполнения CRI-O
В этой конфигурации мы предпочитаем использовать CRI-O в качестве среды выполнения контейнера, хотя доступны и другие варианты, такие как containerd, Docker и Mirantis.
Установите переменную для версии платформы Kubernetes.
VER=1.32
Затем выполните приведенную ниже команду, чтобы установить репозиторий Kubernetes на RHEL 9;
sudo tee /etc/yum.repos.d/k8s.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v$VER/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v$VER/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl
EOF
Обратите внимание на exclude=kubelet kubeadm kubectl. Здесь указывается список пакетов, которые должны быть исключены из установки или обновления из этого репозитория. Это необходимо для того, чтобы избежать непреднамеренных или неожиданных обновлений критически важных компонентов Kubernetes, таких как kubelet, kubeadm и kubectl!
Установите компоненты Kubernetes на всех узлах
К компонентам, которые необходимо установить, относятся kubeadm, kubelet и kubectl. Чтобы установить их из только что созданного репозитория, вам нужно передать --disableexcludes=REPO-ID Помните, они были исключены!
sudo dnf install kubelet kubeadm kubectl --disableexcludes=kubernetes -y
Убедитесь, что услуга kubelet запущена и работает;
sudo systemctl enable --now kubelet
Инициализация кластера Kubernetes на уровне управления с помощью Kubeadm
После выполнения описанных выше действий инициализируйте кластер Kubernetes на мастер-узле. Мастер-узел Kubernetes отвечает за поддержание нужного состояния кластера.
Мы будем использовать инструмент kubeadm для развертывания нашего кластера K8S.
Кластер может быть инициирован с помощью инструмента kubeadm, передав аргумент команды init;
kubeadm init <args>
Некоторые из распространенных аргументов/вариантов включают:
- --apiserver-advertise-address: Определяет IP-адрес, который будет прослушивать сервер API. Если он не определен, будет использоваться сетевой интерфейс по умолчанию. Пример использования: --apiserver-advertise-address=192.168.233.181.
- --pod-network-cidr: Укажите диапазон IP-адресов для сети pod. Если этот параметр установлен, плоскость управления будет автоматически выделять CIDR для каждого узла этой сети. Вы используете это для определения предпочтительного диапазона сети, если существует вероятность столкновения между предпочитаемым сетевым модулем вашего сетевого плагина и некоторыми из ваших хост-сетей, например--pod-network-cidr=10.100.0.0/16.
- --control-plane-endpoint: Указывает имя хоста и порт, которые сервер API будет прослушивать. Это рекомендуется вместо использования --apiserver-advertise-address так как он позволяет определить общую конечную точку, такую как балансировка нагрузки, DNS-имя или IP-адрес, который можно использовать при обновлении одного главного узла до высокодоступного узла. Например, --control-plane-endpoint=cluster.kalyuzhnyy.ru:6443.
Поскольку в этом руководстве мы запускаем только один кластер Kubernetes на мастер-ноде (в демонстрационных целях) и не планируем переходить на высокодоступный кластер, то при начальной загрузке кластера мы укажем только IP-адрес плоскости управления.
Таким образом, выполните приведенную ниже команду на главном узле для начальной загрузки узла уровня управления Kubernetes.
Обязательно выполняйте команды от имени обычного пользователя (рекомендуется), с правами sudo.
Таким образом, если вы root, то переключитесь на обычного пользователя с правами sudo (nkalyuzhnyy наш обычный, для вас это может быть другой пользователь)
su - nkalyuzhnyy
sudo kubeadm init --apiserver-advertise-address=192.168.233.181 --pod-network-cidr=10.100.0.0/16
Команда начнется с предварительного извлечения (kubeadm config images pull) необходимых образов контейнеров для кластера Kubernetes перед инициализацией кластера.
Как только инициализация будет завершена, вы сможете увидеть вывод, подобный приведенному ниже;
[preflight] Running pre-flight checks
[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-rhel-node-ms-01 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.233.181]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-rhel-node-ms-01 localhost] and IPs [192.168.233.181 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-rhel-node-ms-01 localhost] and IPs [192.168.233.181 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "super-admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests"
[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 501.071226ms
[api-check] Waiting for a healthy API server. This can take up to 4m0s
[api-check] The API server is healthy after 3.500982906s
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-rhel-node-ms-01 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node k8s-rhel-node-ms-01 as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: cksg7l.su9fsi574cr9sd53
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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.233.181:6443 --token cksg7l.su9fsi574cr9sd53 \
--discovery-token-ca-cert-hash sha256:065a2927d6b3503633e94e9ba68dd8e55b6d41344d0394e5476aea1125888502
Далее создайте директорию кластера Kubernetes.
mkdir -p $HOME/.kube
Скопируйте файл конфигурации администратора Kubernetes в созданную выше директорию кластера.
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
Установите правильное владение файлом конфигурации кластера.
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Проверка состояния кластера Kubernetes;
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8rhelmas1.kalyuzhnyy.ru NotReady control-plane 4m30s v1.32.1
Как видите, кластер еще не готов.
Вы также можете получить адрес уровня управления и служб кластера;
kubectl cluster-info
Kubernetes control plane is running at https://192.168.233.181:6443
CoreDNS is running at https://192.168.233.181:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Установите модуль Pod Network на мастер-ноду
Pod — это группа из одного или нескольких связанных контейнеров в кластере Kubernetes. Они имеют один и тот же жизненный цикл, хранилище и сеть. Чтобы модули Pod могли взаимодействовать друг с другом, необходимо развернуть надстройку сети Pod на основе интерфейса Container Network Interface (CNI).
Существует несколько сетевых дополнений Pod, из которых вы можете выбрать. Обратитесь к странице Дополнения для получения дополнительной информации.
Чтобы развернуть сеть CNI Pod, выполните приведенную ниже команду на главном узле;
kubectl apply -f [podnetwork].yaml
Где [podnetwork].yaml — это путь к вашему предпочитаемому файлу CNI YAML. В этой демонстрации мы будем использовать сетевой плагин Calico.
Установите сетевое дополнение Calico Pod Operator, выполнив команду ниже. Выполните команду от имени пользователя, с которым вы создали кластер Kubernetes.
Текущая версия релиза - v3.28.0.
Получите текущую версию релиза со страницы релизов и замените значение CNI_VER ниже.
CNI_VER=3.29.1
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v${CNI_VER}/manifests/tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/tiers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/adminnetworkpolicies.policy.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created
Затем скачайте файл определения пользовательских ресурсов, необходимый для настройки Calico. По умолчанию для плагина Calico используется сеть 192.168.0.0/16.
Если вы использовали пользовательский pod CIDR, как определено выше (--pod-network-cidr=10.100.0.0/16),
скачайте файл пользовательских ресурсов и измените сеть в соответствии с вашей пользовательской.
Манифест той же версии CNI мы приведем выше.
wget https://raw.githubusercontent.com/projectcalico/calico/v${CNI_VER}/manifests/custom-resources.yaml
cat custom-resources.yaml
# This section includes base Calico installation configuration.
# For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
ipPools:
- name: default-ipv4-ippool
blockSize: 26
cidr: 192.168.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
---
# This section configures the Calico API server.
# For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
Сетевая секция пользовательского файла ресурсов теперь по умолчанию будет выглядеть так, как показано ниже;
- blockSize: 26
cidr: 192.168.0.0/16
Обновите сетевую подсеть в соответствии с вашей подсетью.
sed -i 's/192.168.10.100/' custom-resources.yaml
CIDR должен быть изменен сейчас;
grep cidr custom-resources.yaml
cidr: 10.100.0.0/16
Примените изменения.
kubectl create -f custom-resources.yaml
Образец вывода;
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created
Получение работающих модулей pod в кластере Kubernetes
После завершения команды вы можете перечислить Pods в пространствах имен, выполнив команду ниже;
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-5d4b86bbc5-9lrhg 0/1 ContainerCreating 0 25s
calico-apiserver calico-apiserver-5d4b86bbc5-hbrk5 0/1 ContainerCreating 0 25s
calico-system calico-kube-controllers-5568c67b5-tr2sd 0/1 ContainerCreating 0 25s
calico-system calico-node-m5clj 0/1 Running 0 26s
calico-system calico-typha-67f9f69d47-mstbb 1/1 Running 0 26s
calico-system csi-node-driver-hgg7l 0/2 ContainerCreating 0 25s
kube-system coredns-668d6bf9bc-5pn78 1/1 Running 0 14m
kube-system coredns-668d6bf9bc-cls2n 1/1 Running 0 14m
kube-system etcd-k8s-rhel-node-ms-01 1/1 Running 0 14m
kube-system kube-apiserver-k8s-rhel-node-ms-01 1/1 Running 0 14m
kube-system kube-controller-manager-k8s-rhel-node-ms-01 1/1 Running 0 14m
kube-system kube-proxy-6tw49 1/1 Running 0 14m
kube-system kube-scheduler-k8s-rhel-node-ms-01 1/1 Running 0 14m
tigera-operator tigera-operator-7d68577dc5-vxzwk 1/1 Running 0 3m37s
Вы можете перечислять Pods в определенных пространствах имен;
kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-5568c67b5-tr2sd 1/1 Running 0 68s
calico-node-m5clj 1/1 Running 0 69s
calico-typha-67f9f69d47-mstbb 1/1 Running 0 69s
csi-node-driver-hgg7l 2/2 Running 0 68s
Как видно, все Pods в пространстве имен calico-system running.
Откройте порты кластера Kubernetes на брандмауэре
Если на узлах работает межсетевой экран, то есть некоторые порты, которые необходимо открыть для обеспечения работоспособности кластера.
Порты плоскости управления;
Протокол Диапазон портовЦельИспользуетсяПротокол tcp 6443Сервер API KubernetesВсеПротокол tcp 2379-2380Клиентский API сервера etcdkube-apiserver, etcdПротокол tcp 10250Kubelet APISelf, Плоскость управленияПротокол tcp 10259kube-schedulerСамПротокол tcp 10257kube-контроллер-менеджерСам
Итак, порты, которые должны быть открыты и доступны извне главного узла:
- 6443 — сервер API Kubernetes (безопасный порт)
- 2379-2380 - API клиента сервера etcd
- 10250 - Kubelet API
- 10251 - kube-scheduler
- 10252 - kube-контроллер-менеджер
Заметка
Если вы поняли, мы используем Calico CNI. Согласно документации CNI: Если ваш дистрибутив Linux поставляется с установленным Firewalld
или другим менеджером iptables, он должен быть отключен. Они могут нарушать правила, добавленные Calico, и приводить к
неожиданному поведению. ... Если необходим межсетевой экран хоста, его можно настроить с помощью Calico HostEndpoint и
GlobalNetworkPolicy. Дополнительные сведения о настройке см. в разделе Политика для узлов и виртуальных машин.
В результате мы отключили и остановили наш Firewalld. Пожалуйста, помните о последствиях этого, прежде чем вы сможете продолжить!
sudo systemctl disable --now firewalld
Рабочие узлы — порты, которые должны быть открыты при использовании системного брандмауэра для контроля доступа;
ПротоколНаправлениеДиапазон портовЦельИспользуетсяПротокол tcpin10250Kubelet APISelf, Плоскость управленияПротокол tcpin30000-32767NodePortВсе
Добавление рабочих узлов в кластер Kubernetes
Теперь вы можете добавить рабочие узлы в кластер Kubernetes с помощью команды kubeadm join следующим образом.
Перед этим убедитесь, что среда выполнения контейнера установлена, настроена и работает. Мы используем контейнерный CRI;
systemctl status containerd
Пример вывода с узла worker01 (k8s-rhel-node-wk-01);
● containerd.service - containerd container runtime
Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; preset: disabled)
Active: active (running) since Sat 2025-01-18 09:58:47 EST; 35min ago
Docs: https://containerd.io
Process: 14564 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 14566 (containerd)
Tasks: 8
Memory: 20.3M
CPU: 2.842s
CGroup: /system.slice/containerd.service
└─14566 /usr/bin/containerd
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169496832-05:00" level=info msg="Start subscribing containerd event"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169572239-05:00" level=info msg="Start recovering state"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169653754-05:00" level=info msg="Start event monitor"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169696562-05:00" level=info msg="Start snapshots syncer"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169743305-05:00" level=info msg="Start cni network conf syncer for default"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169774730-05:00" level=info msg="Start streaming server"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169769921-05:00" level=info msg=serving... address=/run/containerd/containerd.sock.ttrpc
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169864423-05:00" level=info msg=serving... address=/run/containerd/containerd.sock
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru containerd[14566]: time="2025-02-08T09:58:47.169906043-05:00" level=info msg="containerd successfully booted in 0.021092s"
Feb 8 09:58:47 k8rhelswor1.kalyuzhnyy.ru systemd[1]: Started containerd container runtime.
Убедившись в этом, получите команду присоединения к кластеру, которая была выведена во время загрузки кластера, и выполните ее на каждом узле.
Обратите внимание, что эта команда отображается после инициализации плоскости управления выше и должна быть выполнена от имени привилегированного пользователя.
sudo kubeadm join 192.168.233.181:6443 --token cksg7l.su9fsi574cr9sd53 \
--discovery-token-ca-cert-hash sha256:065a2927d6b3503633e94e9ba68dd8e55b6d41344d0394e5476aea1125888502
Если вы не сохранили команду присоединения к кластеру Kubernetes, вы можете в любой момент времени выполнить печать с помощью приведенной ниже команды на главном или управляющем уровне.
kubeadm token create --print-join-command
Как только команда будет выполнена, вы получите результат, подобный приведенному ниже;
[sudo] password for nkalyuzhnyy:
[preflight] Running pre-flight checks
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[preflight] Use 'kubeadm init phase upload-config --config your-config.yaml' to re-upload it.
[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 501.497956ms
[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.
На уровне управления Kubernetes (master, как обычный пользователь, от имени которого вы создали кластер) выполните приведенную ниже команду, чтобы убедиться, что узлы присоединились к кластеру.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8rhelsmas1.kalyuzhnyy.ru Ready control-plane 40m v1.32.1
k8rhelsmas2.kalyuzhnyy.ru Ready control-plane 2m8s v1.32.1
k8rhelswor1.kalyuzhnyy.ru Ready <none> 40s v1.32.1
k8rhelswor2.kalyuzhnyy.ru Ready <none> 21s v1.32.1
Существуют различные узлы stati;
- NotReady: узел добавлен в кластер, но еще не готов к приему рабочих нагрузок.
- SchedulingDisabled: узел не может получать новые рабочие нагрузки, так как он помечен как незапланированный.
- Готово: узел готов к приему рабочих нагрузок.
- OutOfDisk: указывает на то, что на узле заканчивается место на диске.
- MemoryPressure: указывает на то, что на узле заканчивается память.
- PIDPressure: указывает на то, что на узле слишком много процессов
- DiskPressure: указывает на то, что на узле заканчивается место на диске.
- NetworkUnavailable: указывает, что узел недоступен по сети.
- Незапланированный: указывает, что узел не может быть запланирован для новых рабочих нагрузок.
- ConditionUnknown: указывает, что состояние узла неизвестно из-за ошибки.
Роль узлов Worker может отображаться как <none>. Это нормально. По умолчанию узлу не назначена никакая роль. Только до тех пор, пока плоскость управления не назначит рабочую нагрузку на узел, он покажет правильную роль.
Тем не менее, вы можете обновить эту РОЛЬ с помощью команды;
kubectl label node <worker-node-name> node-role.kubernetes.io/worker=true
Получение информации о кластере Kubernetes
Как видите, теперь у нас есть кластер. Выполните команду ниже, чтобы получить информацию о кластере.
kubectl cluster-info
Kubernetes control plane is running at https://192.168.233.181:6443
CoreDNS is running at https://192.168.233.181:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Список ресурсов API кластера Kubernetes
Вы можете перечислить все ресурсы кластера Kubernetes с помощью команды ниже;
kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingadmissionpolicies admissionregistration.k8s.io/v1 false ValidatingAdmissionPolicy
validatingadmissionpolicybindings admissionregistration.k8s.io/v1 false ValidatingAdmissionPolicyBinding
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
selfsubjectreviews authentication.k8s.io/v1 false SelfSubjectReview
tokenreviews authentication.k8s.io/v1 false TokenReview
localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
leases coordination.k8s.io/v1 true Lease
bgpconfigurations crd.projectcalico.org/v1 false BGPConfiguration
bgpfilters crd.projectcalico.org/v1 false BGPFilter
bgppeers crd.projectcalico.org/v1 false BGPPeer
blockaffinities crd.projectcalico.org/v1 false BlockAffinity
caliconodestatuses crd.projectcalico.org/v1 false CalicoNodeStatus
clusterinformations crd.projectcalico.org/v1 false ClusterInformation
felixconfigurations crd.projectcalico.org/v1 false FelixConfiguration
globalnetworkpolicies crd.projectcalico.org/v1 false GlobalNetworkPolicy
globalnetworksets crd.projectcalico.org/v1 false GlobalNetworkSet
hostendpoints crd.projectcalico.org/v1 false HostEndpoint
ipamblocks crd.projectcalico.org/v1 false IPAMBlock
ipamconfigs crd.projectcalico.org/v1 false IPAMConfig
ipamhandles crd.projectcalico.org/v1 false IPAMHandle
ippools crd.projectcalico.org/v1 false IPPool
ipreservations crd.projectcalico.org/v1 false IPReservation
kubecontrollersconfigurations crd.projectcalico.org/v1 false KubeControllersConfiguration
networkpolicies crd.projectcalico.org/v1 true NetworkPolicy
networksets crd.projectcalico.org/v1 true NetworkSet
tiers crd.projectcalico.org/v1 false Tier
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
flowschemas flowcontrol.apiserver.k8s.io/v1 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1 false PriorityLevelConfiguration
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
runtimeclasses node.k8s.io/v1 false RuntimeClass
apiservers operator.tigera.io/v1 false APIServer
imagesets operator.tigera.io/v1 false ImageSet
installations operator.tigera.io/v1 false Installation
tigerastatuses operator.tigera.io/v1 false TigeraStatus
poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
adminnetworkpolicies anp policy.networking.k8s.io/v1alpha1 false AdminNetworkPolicy
bgpconfigurations bgpconfig,bgpconfigs projectcalico.org/v3 false BGPConfiguration
bgpfilters projectcalico.org/v3 false BGPFilter
bgppeers projectcalico.org/v3 false BGPPeer
blockaffinities blockaffinity,affinity,affinities projectcalico.org/v3 false BlockAffinity
caliconodestatuses caliconodestatus projectcalico.org/v3 false CalicoNodeStatus
clusterinformations clusterinfo projectcalico.org/v3 false ClusterInformation
felixconfigurations felixconfig,felixconfigs projectcalico.org/v3 false FelixConfiguration
globalnetworkpolicies gnp,cgnp,calicoglobalnetworkpolicies projectcalico.org/v3 false GlobalNetworkPolicy
globalnetworksets projectcalico.org/v3 false GlobalNetworkSet
hostendpoints hep,heps projectcalico.org/v3 false HostEndpoint
ipamconfigurations ipamconfig projectcalico.org/v3 false IPAMConfiguration
ippools projectcalico.org/v3 false IPPool
ipreservations projectcalico.org/v3 false IPReservation
kubecontrollersconfigurations kcconfig projectcalico.org/v3 false KubeControllersConfiguration
networkpolicies cnp,caliconetworkpolicy,caliconetworkpolicies projectcalico.org/v3 true NetworkPolicy
networksets netsets projectcalico.org/v3 true NetworkSet
profiles projectcalico.org/v3 false Profile
tiers projectcalico.org/v3 false Tier
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
roles rbac.authorization.k8s.io/v1 true Role
priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
csidrivers storage.k8s.io/v1 false CSIDriver
csinodes storage.k8s.io/v1 false CSINode
csistoragecapacities storage.k8s.io/v1 true CSIStorageCapacity
storageclasses sc storage.k8s.io/v1 false StorageClass
volumeattachments storage.k8s.io/v1 false VolumeAttachment
Теперь вы готовы к развертыванию приложения в кластере Kubernetes.
Проверка SELinux
Обратите внимание, что мы не отключили SELinux. Он работает в принудительном режиме. Если вы заметите какие-либо проблемы, обязательно проверьте логи.
sudo dnf install setroubleshoot-server
sudo sealert -a /var/log/audit/audit.log
sudo ausearch -m AVC -ts recent
sudo grep denied /var/log/audit/audit.log
Если возникнут какие-либо проблемы, исправьте их соответствующим образом.
Если у вас есть какие-либо мысли или вопросы по этой теме, пожалуйста, не стесняйтесь оставить комментарий или отправить мне сообщение. Я хотел бы продолжить дискуссию и услышать вашу точку зрения.
А также вы всегда можете поддержать меня зайдя на сайт и подписаться https://dzen.ru/kalyuzhnyy.ru и найти больше статей на моих ресурсах https://kalyuzhnyy.ru и https://dev.kalyuzhnyy.ru