Друзья, привет!
Как-то томным осеннем вечером взбрело мне в голову начать изучать Kubernetes. Прочитал много разных статей и литературы, и понял, что нужно приступать к опытам на живую. И для этого мне необходимо поднять кластер у себя локально на компьютере. Minikube использовать не хотел так как в реальности одноузлового кластера нигде не встретишь. Поэтому было решено развернуть его у себя локально на трех узлах с использованием VirtualBox. Но полностью рабочего гайда по настройке, без каких-либо подводных камней я так и не нашел. Поэтому пропустив через себя множество всяких статей, страницы официальной доки кубера и всякую литературу по нему, хочу поделиться с вами своим опытом настройки кластера. Не судите, пожалуйста, строго это моя первая статья и первый кластер K8S.
Настройка виртуалок
В качестве OS для наших узлов я выбрал CentOS 9. Скачиваем его с http://centos-mirror.rbc.ru/pub/centos/7.9.2009/isos/x86_64/ и выбираем минимальный образ CentOS-7-x86_64-Minimal-2009.iso
Далее настроим наши виртуальные машины (ВМ), на которых будет развернут кластер. Я буду делать это в VirtualBox версии 6.1.34 r150636 (https://www.virtualbox.org)
Создадим шаблонную ВМ с именем kube_node_template. И задаем ей 2Гб оперативы.
Дадим ему 10 ГБ места на диске.
Дадим ему 2 ядра
И установим адаптер сети
В разделе «Носители» нужно будет выбрать виртуальный привод. Здесь уже отображается файл виртуального диска, но он почти пустой, так как операционная система еще не была установлена. Поэтому для установки системы нужно будет выбрать ISO файл образа с операционной системой.
Нажмите на «Пусто», в правой части окна напротив пункта «Оптический привод» нажмите на кнопку с изображением диска, а затем в контекстном меню выберите пункт «Выбрать файл диска ». И выбираем свой скаченный iso файл CentOS-7-x86_64-Minimal-2009.iso.
Переходим к установке операционной системы и создания пользователя. Нажимаем "Запустить" нашу ВМ.
И выбираем Install CentOS 7
Создаем пользователей.
Задаю пароль для root и создаю пользователя kube_admin.
После того как наша ОС установится, отключим работу со swap памяти, так как K8S работу с ним не поддерживает. (Swap -это файл подкачки, механизм виртуальной памяти перемещающий отдельные фрагменты памяти из оперативной памяти на жёсткий диск, внешний накопитель, специально выделенный раздел или файл, тем самым выполняя своё предназначение и освобождая оперативную память для других активных фрагментов памяти.)
Проверим что он есть командой SUDO SWAPON -S а затем отключим его SUDO SWAPOFF -A
И сделаем так чтобы при перезагрузке системы он опять не включился. В sudo vi /etc/fstab комментируем последнюю строку
После чего для применения настроек делаем ребут системы и проверяем sudo shutdown -r now
Далее включим ethernet adapter. Для этого отредактируем файл sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 и включим ONBOOT=yes
Сделаем рестрат sudo shutdown -r now и проверим командой ip addr
Далее мы из нашего шаблона создадим 3 ВМ, которые будут нашими нодами кластера. Одна будет мастером и две воркер. Выбираем в VirtualBox клонировать. Указываю имя и в политике MAC-адреса выбираем сгенерировать новый MAC
Получилось 3 виртуалки
Запускаем их. Далее нам необходимо сделать статические IP для наших ВМ. Для этого нужно отредактировать файлы ifcfg-enp0s3 в каталоге sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s в ipaddr указываем нужный нам ip
Выполняем ребут сервера sudo shutdown -r now и проверим командой ip addr что IP адресс для адаптера enp0s3 изменился на указанный нами в конфиге
Делаем это на всех наших ВМ кластер, только указываем другой IPADDR.
Теперь для удобства мы можем подклюичться к нашим ВМ машинам по SSH. Я буду делать это через MobaXterm (https://mobaxterm.mobatek.net) это также можно сделать через обычную командную строку вашего компьютера. Но я привык к MOBA.
Жмем создать сессию и указываем IP адрес ВМ
Переименуем наши хосты чтобы в дальнейшем не путаться (пример для мастера). Для этого в sudo vi /etc/hostname указываем имя нашей ноды. В данном случае это master
Добавим все наши хосты в файлик /etc/hosts, чтобы можно было обращаться к нашим хостам по имени узла
Делаем ребут сервера и проверяем (Ну или можно перезапустить службу sudo systemctl restart systemd-hostnamed но нужно будет перезайти в виртуалку). Проверяем чьл поменялось имя машины с localhost на master и можно сделать пинг по имени машины например worker2
Теперь необходимо открыть следующий список TCP-портов в брандмауре firewalld. Проверить что он запущен можно с помощью sudo systemctl status firewalld.service. Проверить список открытых портов sudo firewall-cmd --list-all
На мастер ноде откроем следующие порты и перезапустим службу firewalld. Чтобы это правило действовало постоянно добавьте –permanent
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --permanent --add-port=10255/tcp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
И рестартуем службу sudo systemctl restart firewalld
Проверяем sudo firewall-cmd --list-all
На воркерах открываем следующие и также ребутаем службу.
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10255/tcp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --add-masquerade --permanent
Отключим SELinux. Для этого в sudo vi /etc/sysconfig/selinux нужно указать disabled
Также для K8S необходимо чтобы все пакеты проходящие через сетевые мосты обрабатывались через iptables. Для этого необходимо установить переменную ядра net.bridge.bridge-nf-call-iptables=1:
sudo cat << EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
EOF
И загрузим его в ядро командой sudo modprobe br_netfilter
И выполняем рестарт sudo sysctl --system
Для выкачивания пакетов из интернета нам необходимо сделать следующие настройки. В sudo vi /etc/resolv.conf добавив в него nameserver 8.8.8.8
А также в sudo vi /etc/sysconfig/network добавить NETWORKING=yes и GATEWAY=192.168.1.1
И выполняем рестарт сервера sudo shutdown -r now
Настройка master ноды
Устанавливаем containerd
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y containerd.io
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
Перезаупскаем службу
sudo systemctl enable containerd
sudo systemctl start containerd
sudo systemctl status containerd
Переходим к установке K8S
Добавим репозиторий кубера в пакетный менеджер:
sudo cat > tee /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=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
Перезачитаем кэш yum sudo yum makecache fast
Переходим к настройке мастер узла:
sudo yum -y install kubelet kubeadm kubectl
sudo systemctl enable kubelet.service
sudo systemctl start kubelet.service
sudo systemctl status kubelet.service
Ставим Flannel
Сетевой плагин Flannel настраивает сетевое взаимодействие между контейнерами.
sudo yum install wget
sudo wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
grep -i network kube-flannel.yml
Далее запускаем инициализацию нашей мастер ноды с указанием подсети которую создал flannel 10.244.0.0/16
sudo kubeadm init --pod-network-cidr 10.244.0.0/16
Инициализация занимает несколько минут и результатом ее выполнения будет:
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.1.100:6443 --token 1lbb8b.o2haph49cvjdc679 --discovery-token-ca-cert-hash sha256:b16ceb25ebf3b9f04e82c32310f2e98f0d755b9127cb85f225bff5cab495ee12
на мастер ноде выполним команды из строк 5-7. Таким образом мы скопируем конфигурационный файл в домашнюю директорию. Строка 19 это токен для подключения воркер узлов к мастеру.
Настраиваем воркеры
Настраиваем containerd и kubernetes также как и для мастер узла. После настройки используем наш токен из 19 строки. И затем проверяем что все наши ноды добавились и активны командой kubectl get nodes
Установка веб консоли K8S
На мастер ноде выполняем команду с помощью которой мы скачали файлик со всеми ресурсами для настройки UI
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
Дальше нам необходимо чтобы была возможность подключаться с нашего компьютера к кластеру через браузер. Нам нужно настроить ресурс Service. Добавляем type: NodePort и указываем любой порт nodePort в диапазоне 30000-32767.
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30555
selector:
k8s-app: kubernetes-dashboard
После выполняем kubectl apply -f recommended.yaml В результате которого создаются все описанные в файле recommended.yaml ресурсы.
Проверяем что создалась наша служба (Service) с типом NodePort: kubectl get svc -n kubernetes-dashboard
Смотрим на какой ноде развернут наш pod для UI: kubectl get pods -o wide -n kubernetes-dashboard
В моем случае это worker2 у которого айпишник 192.168.1.52
Идем в браузер и проверяем https://192.168.1.52:30555
Теперь необходимо настроить админскую учетку. Для примера можно посмотреть тут https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md. Создадим файл sudo vi admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
И применим его kubectl apply -f admin-user.yaml
После создадим токен с помощью которого залогинимся в UI kubectl -n kubernetes-dashboard create token admin-user копируем его и заходим.
Готово: мы настроили свой кластер!
m1skam
Опять гайды "сделай то, не знаю что"
По ссылке, в названии образа и далее на скриншотах CentOS 7 а не CentOS 9. И точно ли стоит выбирать OS у которой жизненный цикл заканчивается через год?
В гайде про настройку Kubernetes так важна информация о ssh клиенте который вам нравится?
Вы потратили абзац текста с описанием того, почему нужно отключить swap и что такое swap, но ни строчки не написали зачем вы отключаете SELinux? ИМХО отключение SELinux порочная практика, которая кочует из гайда в гайд.
Хм. Я уверен, что если напишу, как у вас, у меня ничего не заработает.
manisks
Добрый день
Раз вы такой компетентный и всезнающий человек, будьте добры, поясните, почему отключение SELinux порочная практика?
Или вы только и умеете что засирать чужие статьи и чужой труд?!
sirmax123
А где тут засирание? Еще одна статья которая абсолютно и полностью бесполезная- есть шаги, возможно они даже приведут к результату, но нет пояснений зачем? Почему фланнел зачем он нужен в этом локальном сетапе? Можно ли без него или нет, и почему? Просто карго-культ, сделайте раз-два-три и все, понимать шаги вам не надо, сломается - снесите и делайте с начала.
Кто генерал сертификаты, на сколько времени они валидны, где лежат, почему в них такие параметры а не другие? Что делать когда их срок жизни пройдёт?
Это только маленькая часть вопросов к этой статье.
m1skam
SELinux предоставляет гибкую систему для ограничение прав пользователей и процессов на уровне ядра. Это одна из систем безопасности и если в каждом мануале оставлять рекомендацию о том, что бы отключать это, без объяснения зачем это делается и чем это грозит - то рано или поздно такие вещи просачиваются в прод среду, а потом мы имеем новости типа слитых данных из торчащей наружу базы данных или эластика или сервер пополняет очередной ботнет.
Хороший тон, это писать в ключе "Вот этой командой мы отключаем SELinux, однако делаем мы это для того, что бы не заморачиваться с его настройкой в тестовой среде, однако настоятельно рекомендую разобраться с тем как оно работает, и как его настраивать. Вот ссылки на гайды по SELinux. Не отключайте эту опцию на проде!"
BigWiseHedgehog Автор
Добрый день!
Спасибо за комментарии. В будущем учту. Его настройка и подразумевалась в тестовой среде для изучения команд, ресурсов и т.п. Мне следовало подробнее изучать каждый шаг и описывать что и для чего. Поторопился :)