Kubernetes Test Cloud on VirtualBox - andyceo/documentation GitHub Wiki

Требования к системе

  • Чистота хост системы (никакие данные не должны конфигурироваться руками)
  • Простота и быстрота ввода новых нод (загрузка по сети - PXE/iPXE)
  • Прозрачность системы и понятность конфигурации (желательно что бы конифги можно было коммитить в Git)
  • Возможность дальнейшего масштабирования

Выбранное техническое решение

  • CoreOS в качестве хост-системы. Загрузка по iPXE
  • Для загрузки кластера используется отдельная машина с TFTP, DNS, DHCP (dnsmasq поднятый в docker контейнере) и HTTP сервер конфигурации для CoreOS - matchbox (тоже работает в Docker-контейнере)
  • Конфигурация основана на k8s - Kubernetes cluster загружаемый по сети

Пошаговая инструкция по разворачиванию кластера

С нуля, в тестовой среде, на основе VirtualBox.

Минимальные требования:

  • установленный VirtualBox с Extension Pack (обязательно иначе не будет работать загрузка по сети iPXE)
  • 8 ГБ ОЗУ

Предварительные настройки сети и создание виртуальных машин

Создание и настройка NAT-сети VirtualBox

В VirtulaBox заходим: Файл --> Настройки --> Сеть --> "Добавить новую NAT сеть" и задаём следующие настройки:

  • Имя сети: Kubernetes
  • CIDR сети: 10.0.2.0/24
  • Поддержка DHCP: выключено
  • Поддержка IPv6: выключено

Нажимаем кнопку проброс портов и вносим следующие настройки:

Имя Протокол Адрес хоста Порт хоста Адрес гостя Порт гостя
ssh boot TCP 127.0.0.1 22 10.0.2.15 22
https node1 TCP 127.0.0.1 443 10.0.2.21 443
dashboard proxy boot TCP 127.0.0.1 8001 10.0.2.15 8001

Создание ноды-загрузчика

Создаём новую виртуальную машину.

  • Имя: boot
  • Тип: Linux
  • Версия: Ubuntu (64-bit)
  • 512 Мб ОЗУ
  • HDD 10GB
  • Настройки сети --> Адаптер 1 --> Тип подключения "Сеть NAT"; Имя "Kubernetes".

Ставим Ubuntu 16.04 LTS. Обновляем и устанавливаем приложения Docker, Git.

Настраиваем сеть вручную:

  • ip: 10.0.2.15
  • netmask: 255.255.255.0
  • gw: 10.0.2.1
  • dns: 8.8.8.8

Более подробно про настроку сети в Ubuntu можно почитать здесь.

Создаём 3 ноды, которые будут грузится по iPXE

Это действие нужно проделать для каждой из машин в диапазоне 1-3.

Создаём новую виртуальную машину.

  • Имя: node{N}
  • Тип: Linux
  • Версия: Other Linux (64-bit)
  • 1024 Мб ОЗУ
  • HDD 5GB?
  • Настройки сети --> Адаптер 1 --> Тип подключения "Сеть NAT"; Имя "Kubernetes".
  • Система --> Порядок загрузки: Оставляем включенной только "Сеть"

Разворачивание кластера Kubernetes

Настройка ноды-загрузчика (boot)

Официальная документация: https://github.com/coreos/coreos-baremetal/blob/master/Documentation/getting-started-docker.md

Клонируем репозиторий со свежими конфигами:

git clone https://github.com/coreos/coreos-baremetal.git
cd coreos-baremetal

Скачиваем свежие образы CoreOS:

./scripts/get-coreos stable 1185.3.0 ./examples/assets

Генерируем сертификаты для Kubernetes:

rm -rf examples/assets/tls
./scripts/tls/k8s-certgen

Добавляем записи о нодах в hosts:

nano /etc/hosts
10.0.2.21 node1.example.com
10.0.2.22 node2.example.com
10.0.2.23 node3.example.com

Редактируем конфиг dnsmasq:

nano contrib/dnsmasq/docker0.conf
# dnsmasq.conf
dhcp-range=10.0.2.16,10.0.2.50
dhcp-option=3,10.0.2.1
dhcp-option=6,10.0.2.15
dhcp-host=08:00:27:22:6a:d7,10.0.2.21,1h
dhcp-host=08:00:27:e5:9d:4c,10.0.2.22,1h
dhcp-host=08:00:27:18:af:bb,10.0.2.23,1h
enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-userclass=set:ipxe,iPXE
dhcp-boot=tag:#ipxe,undionly.kpxe
dhcp-boot=tag:ipxe,http://matchbox.foo:8080/boot.ipxe
log-queries
log-dhcp
address=/bootcfg.foo/10.0.2.15
address=/matchbox.foo/10.0.2.15
address=/node1.example.com/10.0.2.21
address=/node2.example.com/10.0.2.22
address=/node3.example.com/10.0.2.23
address=/cluster.example.com/10.0.2.21

MAC-адреса в опциях dhcp-host=... нужно заменить на те что указаны в настройках виртуальных машин: node1, node2, node3.

В одном окне терминала запускаем matchbox (API-бэкенд для ignition):

docker pull quay.io/coreos/matchbox:latest
docker run -p 8080:8080 -v --restart always $PWD/examples:/var/lib/matchbox:Z -v $PWD/examples/groups/k8s:/var/lib/matchbox/groups:Z quay.io/coreos/matchbox:latest -address=0.0.0.0:8080 -log-level=debug

В файлах:

examples/groups/k8s/node{N}.json

Нужно изменить MAC-адреса на те что указаны в настройках виртуальных машин: node1, node2, node3.

В другом окне терминала запускаем dnsmasq (реализующий DHCP/DNS/TFTP):

docker run --name dnsmasq --restart always --cap-add=NET_ADMIN --net=host -v $PWD/contrib/dnsmasq/docker0.conf:/etc/dnsmasq.conf:Z quay.io/coreos/dnsmasq -d
  1. Запуск и тестирование

Запускаем виртуальные машины: node1, node2, node3. Они должны загрузиться по сети.

Настраиваем на boot сервере доступ к кластеру Kubernetes:

kubectl config set-cluster default-cluster --server=https://node1.example.com --certificate-authority=examples/assets/tls/ca.pem kubectl config set-credentials default-admin --certificate-authority=examples/assets/tls/ca.pem --client-key=examples/assets/tls/admin-key.pem --client-certificate=examples/assets/tls/admin.pem kubectl config set-context default-system --cluster=default-cluster --user=default-admin kubectl config use-context default-system

Проверяем работоспособность:

root@ubuntu:~# kubectl get nodes NAME STATUS AGE node1.example.com Ready 21h node2.example.com Ready 21h node3.example.com Ready 21h

  1. Настройка kubectl Windows клиента и Dashboard

Dashboard уже установлен, нужно лишь запустить прокси.

На boot-ноде запускаем proxy:

kubectl proxy --address 0.0.0.0

Теперь в браузере открываем:

http://127.0.0.1:8001/ui

Если остались вопросы, то документация по теме тут: https://coreos.com/kubernetes/docs/latest/deploy-addons.html

Скачиваем kubectl: Для windows: https://github.com/eirslett/kubectl-windows/releases и кладём в: C:\Users{USER}.kube

Настраиваем kubectl:

Настраиваем предварительно скачав сгенерированные сертификаты с boot-сервера в папку: C:\Users{USER}.kube\tls.

cd C:\Users{USER}.kube ./kubectl.exe config set-cluster default-cluster --server=https://node1.example.com --certificate-authority=tls\ca.pem ./kubectl.exe config set-credentials default-admin --certificate-authority=tls\ca.pem --client-key=tls\admin-key.pem --client-certificate=tls\admin.pem ./kubectl.exe config set-context default-system --cluster=default-cluster --user=default-admin ./kubectl.exe config use-context default-system

В итоге должен получиться файл C:\Users{USER}.kube\config:

apiVersion: v1 clusters:

  • cluster: certificate-authority: tls\ca.pem server: https://node1.example.com name: default-cluster contexts:
  • context: cluster: default-cluster user: default-admin name: default-system current-context: default-system kind: Config preferences: {} users:
  • name: default-admin user: client-certificate: tls\admin.pem client-key: tls\admin-key.pem

Добавляем запись в hosts:

127.0.0.1 node1.example.com

Проверяем работоспособность:

./kubectl.exe get nodes

Требования предъявляемые к системе

Чистота хост системы (никакие данные не должны конфигурироваться руками)
Простота и быстрота ввода новых нод (загрузка по сети - PXE/iPXE)
Прозрачность системы и понятность конфигурации (желательно что бы конифги можно было коммитить в Git)
Возможность дальнейшего масштабирования

Выбранное техническое решение

CoreOS в качестве хост-системы. Загрузка по iPXE
Для загрузки кластера используется отдельная машина с TFTP, DNS, DHCP (dnsmasq поднятый в docker контейнере) и HTTP сервер конфигурации для CoreOS - matchbox (тоже работает в Docker-контейнере)
Конфигурация основана на k8s - Kubernetes cluster загружаемый по сети

Пошаговая инструкция по разворачиванию кластера

С нуля, в тестовой среде, на основе VirtualBox.

Минимальные требования:

установленный VirtualBox с Extension Pack (обязательно иначе не будет работать загрузка по сети)
8 ГБ ОЗУ
  1. Настройка виртуальной машины 0.1. Настройка сети

В VirtulaBox заходим: Файл --> Настройки --> Сеть --> "Добавить новую NAT сеть" и задаём следующие настройки:

Имя сети: Kubernetes
CIDR сети: 10.0.2.0/24
Поддержка DHCP: выключено
Поддержка IPv6: выключено

Нажимаем кнопку проброс портов и вносим следующие настройки: Имя Протокол Адрес хоста Порт хоста Адрес гостя Порт гостя ssh boot TCP 127.0.0.1 2222 10.0.2.15 22 https node1 TCP 127.0.0.1 443 10.0.2.21 443 dashboard proxy boot TCP 127.0.0.1 8001 10.0.2.15 8001

0.2. Создание ноды-загрузчика

Создаём новую виртуальную машину.

Имя: boot
Тип: Linux
Версия: Ubuntu (64-bit)
512 Мб ОЗУ
HDD 10GB
Настройки сети --> Адаптер 1 --> Тип подключения "Сеть NAT"; Имя "Kubernetes".

Ставим Ubuntu 16.04 LTS. Обновляем и устанавливаем приложения Docker, Git.

Настраиваем сеть вручную:

ip: 10.0.2.15
netmask: 255.255.255.0
gw: 10.0.2.1
dns: 8.8.8.8

0.3. Создаём 3 ноды, которые будут грузится по iPXE

Это действие нужно проделать для каждой из машин в диапазоне 1-3.

Создаём новую виртуальную машину.

Имя: node{N}
Тип: Linux
Версия: Other Linux (64-bit)
1024 Мб ОЗУ
HDD 5GB?
Настройки сети --> Адаптер 1 --> Тип подключения "Сеть NAT"; Имя "Kubernetes".
Система --> Порядок загрузки: Оставляем включенной только "Сеть"
  1. Настройка ноды-загрузчика (boot)

Официальная документация: https://github.com/coreos/coreos-baremetal/blob/master/Documentation/getting-started-docker.md

Клонируем репозиторий со свежими конфигами:

git clone https://github.com/coreos/coreos-baremetal.git cd coreos-baremetal

Скачиваем свежие образы CoreOS:

./scripts/get-coreos stable 1185.3.0 ./examples/assets

Генерируем сертификаты для Kubernetes:

rm -rf examples/assets/tls ./scripts/tls/k8s-certgen

Добавляем записи о нодах в hosts:

nano /etc/hosts

10.0.2.21 node1.example.com 10.0.2.22 node2.example.com 10.0.2.23 node3.example.com

Редактируем конфиг dnsmasq:

nano contrib/dnsmasq/docker0.conf

dnsmasq.conf

dhcp-range=10.0.2.16,10.0.2.50 dhcp-option=3,10.0.2.1 dhcp-option=6,10.0.2.15 dhcp-host=08:00:27:22:6a:d7,10.0.2.21,1h dhcp-host=08:00:27:e5:9d:4c,10.0.2.22,1h dhcp-host=08:00:27:18:af:bb,10.0.2.23,1h enable-tftp tftp-root=/var/lib/tftpboot dhcp-userclass=set:ipxe,iPXE dhcp-boot=tag:#ipxe,undionly.kpxe dhcp-boot=tag:ipxe,http://matchbox.foo:8080/boot.ipxe log-queries log-dhcp address=/bootcfg.foo/10.0.2.15 address=/matchbox.foo/10.0.2.15 address=/node1.example.com/10.0.2.21 address=/node2.example.com/10.0.2.22 address=/node3.example.com/10.0.2.23 address=/cluster.example.com/10.0.2.21

MAC-адреса в опциях "dhcp-host=..." нужно заменить на те что указаны в настройках виртуальных машин: node1, node2, node3.

В одном окне терминала запускаем matchbox (API-бэкенд для ignition):

docker pull quay.io/coreos/matchbox:latest docker run -p 8080:8080 --rm -v $PWD/examples:/var/lib/matchbox:Z -v $PWD/examples/groups/k8s:/var/lib/matchbox/groups:Z quay.io/coreos/matchbox:latest -address=0.0.0.0:8080 -log-level=debug

В файлах:

examples/groups/k8s/node{N}.json

Нужно изменить MAC-адреса на те что указаны в настройках виртуальных машин: node1, node2, node3.

В другом окне терминала запускаем dnsmasq (реализующий DHCP/DNS/TFTP):

docker run --rm --name dnsmasq --cap-add=NET_ADMIN --net=host -v $PWD/contrib/dnsmasq/docker0.conf:/etc/dnsmasq.conf:Z quay.io/coreos/dnsmasq -d

  1. Запуск и тестирование

Запускаем виртуальные машины: node1, node2, node3. Они должны загрузиться по сети.

Настраиваем на boot сервере доступ к кластеру Kubernetes:

kubectl config set-cluster default-cluster --server=https://node1.example.com --certificate-authority=examples/assets/tls/ca.pem kubectl config set-credentials default-admin --certificate-authority=examples/assets/tls/ca.pem --client-key=examples/assets/tls/admin-key.pem --client-certificate=examples/assets/tls/admin.pem kubectl config set-context default-system --cluster=default-cluster --user=default-admin kubectl config use-context default-system

Проверяем работоспособность:

root@ubuntu:~# kubectl get nodes NAME STATUS AGE node1.example.com Ready 21h node2.example.com Ready 21h node3.example.com Ready 21h

  1. Настройка kubectl Windows клиента и Dashboard

Dashboard уже установлен, нужно лишь запустить прокси.

На boot-ноде запускаем proxy:

kubectl proxy --address 0.0.0.0

Теперь в браузере открываем:

http://127.0.0.1:8001/ui

Если остались вопросы, то документация по теме тут: https://coreos.com/kubernetes/docs/latest/deploy-addons.html

Скачиваем kubectl: Для windows: https://github.com/eirslett/kubectl-windows/releases и кладём в: C:\Users{USER}.kube

Настраиваем kubectl:

Настраиваем предварительно скачав сгенерированные сертификаты с boot-сервера в папку: C:\Users{USER}.kube\tls.

cd C:\Users{USER}.kube ./kubectl.exe config set-cluster default-cluster --server=https://node1.example.com --certificate-authority=tls\ca.pem ./kubectl.exe config set-credentials default-admin --certificate-authority=tls\ca.pem --client-key=tls\admin-key.pem --client-certificate=tls\admin.pem ./kubectl.exe config set-context default-system --cluster=default-cluster --user=default-admin ./kubectl.exe config use-context default-system

В итоге должен получиться файл C:\Users{USER}.kube\config:

apiVersion: v1 clusters:

  • cluster: certificate-authority: tls\ca.pem server: https://node1.example.com name: default-cluster contexts:
  • context: cluster: default-cluster user: default-admin name: default-system current-context: default-system kind: Config preferences: {} users:
  • name: default-admin user: client-certificate: tls\admin.pem client-key: tls\admin-key.pem

Добавляем запись в hosts:

127.0.0.1 node1.example.com

Проверяем работоспособность:

./kubectl.exe get nodes

⚠️ **GitHub.com Fallback** ⚠️