Чтобы настроить Kubernetes Cluster на серверах Ubuntu с Virtualbox и Kubeadm, выполните следующие действия:
Предварительные требования:
- Виртуальные машины с минимальной спецификацией:
- 2ядра и 2 ГБ ОЗУ для главного узла
- 1 ядро и 1 ГБ для каждого из рабочих узлов
- Ubuntu Server 18.04, установленный на всех виртуальных машинах
- Сервер OpenSSHустановлено на всех виртуальных машинах
Все виртуальные машины должны взаимодействовать с Интернетом, главным хостом и друг с другом. Это можно сделать с помощью различных средств, таких как мостовые сети, адаптеры виртуальных хостов и т. Д. Пример схемы сети, приведенный ниже, можно настроить.
Схема сети
Ansible:
Вы можете делать все вручную, но для ускорения процесса настройки вы можете использовать инструмент автоматизации, например Ansible. Его можно установить на хост виртуализации, другую виртуальную машину и т. Д.
Этапы установки для воспроизведения на хосте
- Обновление информации о пакетах в репозитории:
$ sudo apt update
- Установка менеджера пакетов для Python3:
$ sudo apt install python3-pip
- Установка пакета Ansible:
$ sudo pip3 install ansible
Настройка доступа по ключу SSH:
Генерация пар ключей
Чтобы иметь возможность подключаться к виртуальным машинам без пароля, вам необходимо настроить ключи ssh. Команда ниже создаст пару ключей ssh (приватных и открытых) и позволит вам войти в разные системы без ввода пароля.
$ ssh-keygen -t rsa -b 4096
Эти ключи будут созданы в расположении по умолчанию: / home /USER / .ssh
Авторизация ключей на виртуальных машинах
Следующим шагом является загрузка вновь созданных ключей ssh на все виртуальные машины.
Для каждой извиртуальная машина, которую вам нужно вызвать:
$ ssh-copy-id USER@IP_ADDRESS
Эта команда скопирует ваш открытый ключ в файл авторизованные_ключи и позволит вам войти без пароля.
SSH root-доступ
По умолчанию доступ к корневой учетной записи с ssh невозможен только по паролю. Доступ к нему можно получить с помощью ключей ssh (которые вы создали ранее). Предполагая настройки файлов по умолчанию, вы можете скопировать каталог ssh из пользователя в корневой каталог.
Этот шаг необходимо выполнить на всех виртуальных машинах:
$ sudo cp -r /home/USER/.ssh /root/
Вы можете проверить это, выполнив следующую команду на главном хосте:
$ ssh root@IP_ADDRESS
Если вы можете подключиться без пароля, это означает, что ключи настроены правильно.
Проверка соединения между виртуальными машинами и Ansible:
Проверка соединения
Необходимо проверить, может ли Ansible подключаться ко всем виртуальным машинам. Для этого вам понадобятся 2 вещи:
- Hosts файл с информацией о хостах (в данном случае с виртуальными машинами)
- файл Playbook с инструкциями, что вам требуется от Ansible для выполнения
Пример файла hosts:
[kubernetes:children]
master
nodes
[kubernetes:vars]
ansible_user=root
ansible_port=22
[master]
kubernetes-master ansible_host=10.0.0.10
[nodes]
kubernetes-node1 ansible_host=10.0.0.11
kubernetes-node2 ansible_host=10.0.0.12
kubernetes-node3 ansible_host=10.0.0.13
Файл хостов состоит из 2 основных групп хостов:
- master - группа, созданная для главного узла
- узлов - группа, созданная для рабочих узлов
Переменные, специфичные для группы, хранятся в разделе [kubernetes: vars] .
Пример playbook:
- name: Playbook for checking connection between hosts
hosts: all
gather_facts: no
tasks:
- name: Task to check the connection
ping:
Основная цель вышеприведенного playbook - проверить соединение между хостом и виртуальными машинами.
Вы можете проверить соединение, вызвав команду:
$ ansible-playbook -i hosts_file ping.yaml
Вывод этой команды должен выглядеть следующим образом:
PLAY [Playbook for checking connection between hosts] *****************************************************
TASK [Task to check the connection] ***********************************************************************
ok: [kubernetes-node1]
ok: [kubernetes-node2]
ok: [kubernetes-node3]
ok: [kubernetes-master]
PLAY RECAP ************************************************************************************************
kubernetes-master : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
kubernetes-node1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
kubernetes-node2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
kubernetes-node3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Вывод выше подтверждает, что соединение между Ansible и виртуальными машинами было успешным.
Конфигурация перед развертыванием кластера:
Настройка имен хостов
Имена хостов можно настроить с помощью Ansible. Каждый vm должен соединяться с каждым vm по своим именам хостов. Ansible может изменять имена хостов, а также файл / etc / hosts. Пример playbook: hostname.yaml
Отключить SWAP
Необходимо поменять своп при работе с Kubernetes. Пример playbook: disable_swap.yaml
Установка дополнительного программного обеспечения
Некоторые пакеты требуются перед инициализацией. Все они могут быть установлены с Ansible:
Пример playbook: apt_install.yaml
Контейнерный интерфейс времени выполнения
В этом примере вы установите Docker в качестве своего CRI. Playbook docker_install.yaml будет:
- Добавить ключ подписи apt для Docker
- Добавить хранилище Docker
- Установить Docker с определенной версией (рекомендуется последняя))
Конфигурация Docker
[ПРЕДУПРЕЖДЕНИЕ IsDockerSystemdCheck]: обнаружил «cgroupfs» как драйвер cgroup Docker. Рекомендуемый драйвер "systemd"
При развертывании кластера Kubernetes kubeadm выдаст выше предупреждение о драйвере Docker cgroup. Playbook docker_configure.yaml был создан для решения этой проблемы.
Установка инструментов Kubernetes
Существует несколько основных компонентов Kubernetes, которые необходимо установить перед развертыванием кластера. Playbook kubetools_install.yaml будет:
- Для главного и рабочего узлов:
- Добавить подходящий ключ подписи для Kubernetes
- Добавить хранилище Kubernetes
- Установить kubelet и kubeadm
- Дополнительно для главного узла:
Перезагрузить
Playbook reboot.yaml перезагрузит все виртуальные машины.
Развертывание кластера:
Инициализация кластера
После успешного завершения всех описанных выше шагов можно создать кластер. Команда ниже инициализирует кластер:
$ kubeadm init --apiserver-advertise-address=IP_ADDRESS_OF_MASTER_NODE --pod-network-cidr=192.168.0.0/16
Kubeadm может дать предупреждение о количестве процессоров. Его можно игнорировать, передавая дополнительный аргумент команде инициализации kubeadm: --ignore-preflight-errors=NumCPU
При успешной инициализации kubeadm должно получиться что-то похожее на это:
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
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.0.10:6443 --token SECRET-TOKEN \
--discovery-token-ca-cert-hash sha256:SECRET-CA-CERT-HASH
Копировать команду соединения kubeadm для всех рабочих узлов:
kubeadm join 10.0.0.10:6443 --token SECRET-TOKEN \
--discovery-token-ca-cert-hash sha256:SECRET-CA-CERT-HASH
Запустите приведенные ниже команды как обычный пользователь:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Развертывание сетевого интерфейса контейнера (CNI)
CNI отвечает за взаимодействие между модулями и узлами. Есть много примеров, таких как:
- Фланель
- Калико
- Плетение
- Multus
Команда ниже установитБязь:
$ kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
Подготовка рабочих узлов
Выполнение ранее сохраненной команды из вывода kubeadm init на всех рабочих узлах :
kubeadm join 10.0.0.10:6443 --token SECRET-TOKEN \
--discovery-token-ca-cert-hash sha256:SECRET-CA-CERT-HASH
Все рабочие узлы должны выводить:
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.
Тестирование:
Выполнить приведенную ниже команду на главном узле как обычный пользователь, чтобы проверить, правильно ли подключены узлы:
$ kubectl get nodes
Вывод этой команды:
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 115m v1.16.2
kubernetes-node1 Ready <none> 106m v1.16.2
kubernetes-node2 Ready <none> 105m v1.16.2
kubernetes-node3 Ready <none> 105m v1.16.2
Выше вывода делается вывод, что все узлы настроены правильно.
Модули теперь могут быть развернуты в кластере!