Друзья, привет!

Как-то томным осеннем вечером взбрело мне в голову начать изучать 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 копируем его и заходим.

Готово: мы настроили свой кластер!

Комментарии (6)


  1. m1skam
    00.00.0000 00:00

    Опять гайды "сделай то, не знаю что"

    В качестве OS для наших узлов я выбрал CentOS 9. Скачиваем его с http://centos-mirror.rbc.ru/pub/centos/7.9.2009/isos/x86_64/ и выбираем минимальный образ CentOS-7-x86_64-Minimal-2009.iso

    По ссылке, в названии образа и далее на скриншотах CentOS 7 а не CentOS 9. И точно ли стоит выбирать OS у которой жизненный цикл заканчивается через год?

    Теперь для удобства мы можем подклюичться к нашим ВМ машинам по SSH. Я буду делать это через MobaXterm (https://mobaxterm.mobatek.net) это также можно сделать через обычную командную строку вашего компьютера. Но я привык к MOBA.

    В гайде про настройку Kubernetes так важна информация о ssh клиенте который вам нравится?

    Отключим SELinux. Для этого в sudo vi /etc/sysconfig/selinux нужно указать disabled

    Вы потратили абзац текста с описанием того, почему нужно отключить swap и что такое swap, но ни строчки не написали зачем вы отключаете SELinux? ИМХО отключение SELinux порочная практика, которая кочует из гайда в гайд.

    А также в sudo vi /etc/sysconfig/network добавить NETWORKING=yes и GATEWAY=192.168.1.1

    Хм. Я уверен, что если напишу, как у вас, у меня ничего не заработает.


    1. manisks
      00.00.0000 00:00
      -1

      Добрый день

      Раз вы такой компетентный и всезнающий человек, будьте добры, поясните, почему отключение SELinux порочная практика?

      Или вы только и умеете что засирать чужие статьи и чужой труд?!


      1. sirmax123
        00.00.0000 00:00
        +2

        А где тут засирание? Еще одна статья которая абсолютно и полностью бесполезная- есть шаги, возможно они даже приведут к результату, но нет пояснений зачем? Почему фланнел зачем он нужен в этом локальном сетапе? Можно ли без него или нет, и почему? Просто карго-культ, сделайте раз-два-три и все, понимать шаги вам не надо, сломается - снесите и делайте с начала.

        Кто генерал сертификаты, на сколько времени они валидны, где лежат, почему в них такие параметры а не другие? Что делать когда их срок жизни пройдёт?

        Это только маленькая часть вопросов к этой статье.


      1. m1skam
        00.00.0000 00:00
        +2

        SELinux предоставляет гибкую систему для ограничение прав пользователей и процессов на уровне ядра. Это одна из систем безопасности и если в каждом мануале оставлять рекомендацию о том, что бы отключать это, без объяснения зачем это делается и чем это грозит - то рано или поздно такие вещи просачиваются в прод среду, а потом мы имеем новости типа слитых данных из торчащей наружу базы данных или эластика или сервер пополняет очередной ботнет.

        Хороший тон, это писать в ключе "Вот этой командой мы отключаем SELinux, однако делаем мы это для того, что бы не заморачиваться с его настройкой в тестовой среде, однако настоятельно рекомендую разобраться с тем как оно работает, и как его настраивать. Вот ссылки на гайды по SELinux. Не отключайте эту опцию на проде!"


        1. BigWiseHedgehog Автор
          00.00.0000 00:00
          +1

          Добрый день!

          Спасибо за комментарии. В будущем учту. Его настройка и подразумевалась в тестовой среде для изучения команд, ресурсов и т.п. Мне следовало подробнее изучать каждый шаг и описывать что и для чего. Поторопился :)


  1. Shku
    00.00.0000 00:00
    +1

    "В качестве OS для наших узлов я выбрал CentOS 9." CentOS 7