2022-07-17
876

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

Описание

Kubernetes предназначен для контейнеризированных приложений.

    Используется для автоматизации:
  • Развертывания приложений;
  • Масштабирования приложений;
  • Управления приложениями.

Разработчик описывает ресурсы и конфигурацию приложения в манифесте (yaml-файле) и передает его в Kubernetes, используя для этого специальный инструмент (kubectl, Helm и др.) В результате Kubernetes создаст или настроит все запрошенные ресурсы. После этого Kubernetes будет контролировать, соответствует ли реальное состояние ресурсов желаемому, и при необходимости устранит расхождения (например, запустит упавший контейнер).

Структура кластера kubernetes

Физически Kubernetes представляет собой кластер, образованный несколькими узлами — нодами. Ноды бывают двух типов: вычислительные (worker) и управляющие (master). Команды управления посылаются на master node, а он уже управляет worker node.

    • Cluster - основной компонент
      • Nodes - кластер состоит из node
      • Master node - сервер, который управляет worker nodes. Это узел кластера, реализующий логику управления самим кластером и ресурсами, которые находятся в его распоряжении;
      • Worker node - это узел кластера, на котором непосредственно работают приложения и вспомогательные службы.

У каждой системы, которая добавляется к кластеру должно быть минимум 2 ядра и 1700МБ оперативной памяти.

Настройка master-сервера

Отключение swap

Для того, чтобы кластер мог запустится должен быть отключен swap на каждом узле кластера. Для выключения swap используется команда
swapoff -a
кроме того, чтобы он не подключался при перезагрузке, нужно закомментировать раздел swap в файле
/etc/fstab
это можно сделать вручную или командой
sed -i '/ swap /s/^/#/' /etc/fstab

Отключение SELinux

Отключение до перезагрузки
setenforce 0
отключение навсегда
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Открытие портов файрвола

Открытие портов в CentOS:
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
применение настроек
firewall-cmd --reload
Открытие портов в Ubuntu:
ufw allow 6443
ufw allow 2379:2380/tcp
ufw allow 10250
ufw allow 10251
ufw allow 10252
ufw allow 10255

Установка docker

Установка в CentOS:
добавление репозитория со свежей версией docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
установка docker
yum install docker-ce
Кроме того можно установить дополнительные компоненты
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Установка в Ubuntu:
добавление ключа репозитория
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
добавление репозитория
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu 
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
установка docker
apt update
apt install docker-ce
Кроме того можно установить дополнительные компоненты
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Запуск и добавление в автозагрузку
systemctl start docker
systemctl enable docker
Проверка работы
systemctl status docker
docker ps

Установка cri-dockerd

Репозиторий cri-dockerd на github

Установка в CentOS:
нужно скачать пакет cri-dockerd соответствующий версии системы
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd-0.2.3-3.el8.x86_64.rpm
установка скачанного пакета
yum install cri-dockerd-0.2.2.20220610195206.0737013-0.el7.x86_64.rpm
Установка в Ubuntu:
нужно скачать пакет cri-dockerd соответствующий версии системы
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd_0.2.3.3-0.ubuntu-jammy_amd64.deb
установка скачанного пакета
apt install ./cri-dockerd_0.2.3.3-0.ubuntu-jammy_amd64.deb
Применение изменений
sudo systemctl daemon-reload
Запуск и добавление в автозагрузку службы и сокета
systemctl start cri-docker.service
systemctl enable cri-docker.service
systemctl start cri-docker.socket
systemctl enable cri-docker.socket

Установка компонентов kubernetes

Установка в CentOS:
для установки всех необходимых компонентов нужно добавить репозиторий kubernetes, для этого нужно создать файл
touch /etc/yum.repos.d/kubernetes.repo
и записать в него следующее
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
или выполнить команду
cat > etc/yum.repos.d/kubernetes.repo <<EOF 
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
установка компонентов кластера kubernetes
yum install kubelet kubeadm kubectl kubernetes-cni
Установка в Ubuntu:
добавление ключа репозитория
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
добавление репозитория
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
установка компонентов кластера kubernetes
apt update
apt install kubelet kubeadm kubectl kubernetes-cni
Запуск и добавление в автозагрузку kubelet
systemctl enable kubelet
systemctl start kubelet

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

Теперь на master-сервере можно запустить инициализацию кластера командой
kubeadm init --pod-network-cidr 10.244.0.0/16 --cri-socket /var/run/cri-dockerd.sock
После выполнения инициализации в конце текстового вывода будет команда, которую нужно выполнить на worker'ах для подключения к кластеру
kubeadm join 192.168.10.15:6443 --token a13kru.12899wph6u4a8ir8 --discovery-token-ca-cert-hash sha256:b8343091597fedd9b7a271f5c5b4016af6dce7442c052784ddd01f414eff68c1
Тоже самое можно получить после инициализации выполнив
kubeadm token create --print-join-command
Будет создан конфигурационный файл кластера по пути
/etc/kubernetes/admin.conf
чтобы каждый раз при выполнении команд kubectl не вводить путь к нему и, чтобы kubectl мог использовать любой пользователь, а не только root, нужно открыть доступ для чтения к этому файлу и добавить переменную окружения.
Открыть доступ на чтение командой
chmod a+r /etc/kubernetes/admin.conf
Добавить переменную окружения в файл
/etc/environment
для этого вписать туда
export KUBECONFIG=/etc/kubernetes/admin.conf
Если не добавить переменную окружения, нужно будет в каждой команде kubectl указывать путь к конфигурационному файлу, например
kubectl get nodes --kubeconfig /etc/kubernetes/admin.conf

Настройка worker-сервера

Отключение swap

Для того, чтобы кластер мог запустится должен быть отключен swap на каждом узле кластера. Для выключения swap используется команда
swapoff -a
кроме того, чтобы он не подключался при перезагрузке, нужно закомментировать раздел swap в файле
/etc/fstab
это можно сделать вручную или командой
sed -i '/ swap /s/^/#/' /etc/fstab

Отключение SELinux

Отключение до перезагрузки
setenforce 0
отключение навсегда
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Открытие портов файервола

Открытие портов в CentOS:
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=10250/tcp
применение настроек
firewall-cmd --reload
Открытие портов в Ubuntu:
ufw allow 30000:32767/tcp
ufw allow 10250

Установка docker

Установка в CentOS:
добавление репозитория со свежей версией docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
установка docker
yum install docker-ce
Кроме того можно установить дополнительные компоненты
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Установка в Ubuntu:
добавление ключа репозитория
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
добавление репозитория
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu 
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
установка docker
apt update
apt install docker-ce
Кроме того можно установить дополнительные компоненты
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Запуск и добавление в автозагрузку
systemctl start docker
systemctl enable docker
Проверка работы
systemctl status docker
docker ps

Установка cri-dockerd

Репозиторий cri-dockerd на github

Установка в CentOS:
нужно скачать пакет cri-dockerd соответствующий версии системы
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd-0.2.3-3.el8.x86_64.rpm
установка скачанного пакета
yum install cri-dockerd-0.2.2.20220610195206.0737013-0.el7.x86_64.rpm
Установка в Ubuntu:
нужно скачать пакет cri-dockerd соответствующий версии системы
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd_0.2.3.3-0.ubuntu-jammy_amd64.deb
установка скачанного пакета
apt install ./cri-dockerd_0.2.3.3-0.ubuntu-jammy_amd64.deb
Применение изменений
sudo systemctl daemon-reload
Запуск и добавление в автозагрузку службы и сокета
systemctl start cri-docker.service
systemctl enable cri-docker.service
systemctl start cri-docker.socket
systemctl enable cri-docker.socket

Установка компонентов kubernetes

Установка в CentOS:
для установки всех необходимых компонентов нужно добавить репозиторий kubernetes, для этого нужно создать файл
touch /etc/yum.repos.d/kubernetes.repo
и записать в него следующее
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
или выполнить команду
cat > etc/yum.repos.d/kubernetes.repo <<EOF 
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
установка компонентов кластера kubernetes
yum install kubelet kubeadm kubectl kubernetes-cni
Установка в Ubuntu:
добавление ключа репозитория
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
добавление репозитория
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
установка компонентов кластера kubernetes
apt update
apt install kubelet kubeadm kubectl kubernetes-cni
Запуск и добавление в автозагрузку kubelet
systemctl enable kubelet
systemctl start kubelet

Подключение к кластеру

Теперь на worker-сервере можно запустить выполнить подключение к кластеру с помощью команды полученной при инициализации кластера, только к ней нужно добавить --cri-socket /var/run/cri-dockerd.sock
kubeadm join 192.168.10.15:6443 --token nwk1m5.b4mlrs3wwhes4b36 --discovery-token-ca-cert-hash sha256:434f1d2c06a5635803979733e0554a82dc910c76c8ae5508f54ade3ec9b0163b --cri-socket /var/run/cri-dockerd.sock

Примечания

Если master-node не видит slave-node можно на slave перезапустить службу kubelet командой
systemctl restart kubelet
Если поды в кластере не видят друг друга или нет доступа к поду через сервис можно попробовать перезапустить системные поды кластера, отвечающие за сеть
kubectl rollout restart deployment.apps/coredns -n kube-system
kubectl rollout restart daemonset.apps/kube-proxy -n kube-system

Команды для управления кластером

  • kubectl get nodes вывод списка узлов кластера
  • kubeadm reset --cri-socket /var/run/cri-dockerd.sock отключение узла от кластера
  • kubectl describe nodes подробное описание узлов кластера
  • kubectl get nodes --show-labels вывод списка узлов кластера с отображением их меток
  • kubectl get node -A -o wide полная информация об узлах кластера