-
Notifications
You must be signed in to change notification settings - Fork 7
Kubernetes Test Cloud on VirtualBox
- Чистота хост системы (никакие данные не должны конфигурироваться руками)
- Простота и быстрота ввода новых нод (загрузка по сети - PXE/iPXE)
- Прозрачность системы и понятность конфигурации (желательно что бы конифги можно было коммитить в Git)
- Возможность дальнейшего масштабирования
- CoreOS в качестве хост-системы. Загрузка по iPXE
- Для загрузки кластера используется отдельная машина с TFTP, DNS, DHCP (dnsmasq поднятый в docker контейнере) и HTTP сервер конфигурации для CoreOS - matchbox (тоже работает в Docker-контейнере)
- Конфигурация основана на k8s - Kubernetes cluster загружаемый по сети
С нуля, в тестовой среде, на основе VirtualBox.
Минимальные требования:
- установленный VirtualBox с Extension Pack (обязательно иначе не будет работать загрузка по сети iPXE)
- 8 ГБ ОЗУ
В 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 можно почитать здесь.
Это действие нужно проделать для каждой из машин в диапазоне 1-3.
Создаём новую виртуальную машину.
- Имя: node{N}
- Тип: Linux
- Версия: Other Linux (64-bit)
- 1024 Мб ОЗУ
- HDD 5GB?
- Настройки сети --> Адаптер 1 --> Тип подключения "Сеть NAT"; Имя "Kubernetes".
- Система --> Порядок загрузки: Оставляем включенной только "Сеть"
Официальная документация: 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
- Запуск и тестирование
Запускаем виртуальные машины: 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
- Настройка kubectl Windows клиента и Dashboard
Dashboard уже установлен, нужно лишь запустить прокси.
На boot-ноде запускаем proxy:
kubectl proxy --address 0.0.0.0
Теперь в браузере открываем:
Если остались вопросы, то документация по теме тут: 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 ГБ ОЗУ
- Настройка виртуальной машины 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".
Система --> Порядок загрузки: Оставляем включенной только "Сеть"
- Настройка ноды-загрузчика (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
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
- Запуск и тестирование
Запускаем виртуальные машины: 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
- Настройка kubectl Windows клиента и Dashboard
Dashboard уже установлен, нужно лишь запустить прокси.
На boot-ноде запускаем proxy:
kubectl proxy --address 0.0.0.0
Теперь в браузере открываем:
Если остались вопросы, то документация по теме тут: 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
Footer is under construction
Sidebar is under construction