понедельник, 29 ноября 2021 г.

Настраиваем VMware Workstation для работы с контейнерами и кластерами Kubernetes

Если вы еще только осваиваете контейнеры и кластеры Kubernetes и ищете простой способ настроить для них тестовую инфраструктуру, то вам может пригодиться VMware Workstation Pro или Workstation Player, в которых начиная с 16 версии появилась поддержка контейнеров.

Механизм работы с контейнерами в Workstation похож на тот, что присутствует в vSphere with Tanzu. Для запуска контейнеров в Workstation используются легковесные ВМ CXR (Container Runtime for ESXi) внутри которых установлена Photon OS с containerd. Каждый контейнер запускается внутри отдельной ВМ, что, с одной стороны, требует дополнительных вычислительных ресурсов на хосте Workstation по сравнению с одной "большой" ВМ, с другой, обеспечивает лучшую изоляцию запускаемых приложений друг от друга, а также позволяет упростить настройку сети для контейнеров, поскольку каждая ВМ имеет уникальный адрес в виртуальной сети.

Помимо запуска контейнеров, вместе с Workstation идет Open Source инструмент Kind, который позволяет создавать кластеры Kubernetes внутри контейнеров.

В этой статье мы рассмотрим шаги по базовой настройке Kubernetes поверх Workstation, а также затронем вопросы по настройке сети для Pod'ов.


Подготовка VMware Workstation

После установки VMware Workstation откройте коммандную строку CMD, перейдите в папку C:\Program Files (x86)\VMware\VMware Workstation\bin и выполните:

vctl system start

vctl kind

После выполнения команд в профиле пользователя будет создана папка %userprofile%\.vctl, куда будет загружен шаблон CRX и утилиты vctl и kind для работы с контейнерами.

По умолчанию vctl создает ВМ с 2 ядрами и 1 ГБ ОЗУ для запуска контейнеров и ВМ с 2 ядрами и 2 ГБ ОЗУ для ВМ под Kubernetes. Изменить настройки ВМ можно с помощью команды vctl system config. Например, после выполнения команды vctl system config --k8s-cpus 4 --k8s-mem 4g все создаваемые ВМ под K8s будут использовать по 4 ядра и по 4 ГБ ОЗУ.

Параметры ВМ можно также задать, отредактировав файл %userprofile%\.vctl\config.yaml. В этом же файле указывается к какой VMnet сети будут подключаться ВМ для контейнеров. В текущей версии Workstation для подключения контейнеров может использоваться только сеть с настроенными сервисами DHCP и NAT. По умолчанию такой сетью является VMnet8. При установке VMware Workstation автоматически выбирается для VMnet8 подсеть класса C из диапазона 192.168.0.0 - 192.168.255.255 и поднимает службу VMware NAT Server, отвечающую за трансляцию адресов и передачу трафика между виртуальной и физической сетями.


Запуск контейнеров

Создать контейнер можно с помощью команды vctl. Формат и дополнительные опции команды похожи на хорошо знакомый всем docker.

Для создания обычного контейнера с nginx выполните:

vctl run -n web-server -d nginx

Также как и в Docker поддерживается монтирование Persistent Volumes с хоста с помощью ключа -v, передача переменных окружение через -e, и маппинг портов с помощью -p.

Для просмотра списка контейнеров используется команда vctl ps -a, для удаления vctl rm -f <имя_контейнера>.


Создание кластера Kubernetes

Для создания кластера используется команда kind create cluster. В качестве доп.параметров при выполнении команды можно указать путь к конфигурационному файлу и имя кластера. Для примера опишем кластер Kubernetes, состоящий из одной master node и одной worker node в config.yaml.

kind: Cluster

apiVersion: kind.x-k8s.io/v1alpha4

networking:

  apiServerPort: 6443

nodes:

- role: control-plane

- role: worker

Для создания кластера выполните команду:

kind create cluster --config C:\config.yaml --name k8s

Выполнив vctl ps и kind get kubeconfig --name <имя_кластера> можно увидеть, что Workstation создал две отдельные ВМ под master и worker node и прописал параметры для подключения к кластеру Kubernetes в файле %userprofile%\.kube\config.

Описание дополнительных параметров для настройки кластера через Kind приведено в документе https://kind.sigs.k8s.io/docs/user/configuration/

Взаимодействие с кластером Kubernetes может выполниться с помощью утилиты kubectl или через REST API при подключении на https://localhost:6443 или IP адрес хоста Workstation.

Для проверки работоспособности кластера Kubernetes создадим простой yaml файл и опишем конфигурацию Pod.

#pod.yaml

apiVersion: v1

kind: Pod

metadata:

  name: web

spec:

  containers:

  - name: web

    image: vmwarecna/nginx:latest

    ports:

    - containerPort: 80

      hostPort: 8080

Создадим Pod:

kubectl apply -f C:\pod.yaml

Проверим, что Pod запущен и работает:

kubectl get pods

kubectl describe pod/web

Поскольку в yaml файле мы прописали port forwarding, то доступ к приложению в Pod можно получить, если подключиться на IP адрес ВМ worker node (для нашего приложения используется порт 8080).

Узнать IP адрес ВМ можно с помощью команды vctl ps или через kubectl.

kubectl get nodes

kubectl describe node/k8s-worker


Публикация Pod'а во внешнюю сеть

Поскольку worker node'ы подключаются к виртуальной сети VMnet8, то для публикации приложения во внешний мир нужно настроить правила NAT трансляции в Workstation. Отредактировать настройки NAT можно из консоли Workstation: Edit -> Virtual Network Editor -> VMnet8 -> NAT Settings -> Port Forwarding -> Add...

Если вы используете Workstation Player и у вас нет Virtual Network Editor, то настройки NAT можно изменить с помощью утилиты vmrun.exe из папки "C:\Program Files (x86)\VMware\VMware Workstation" в формате vmrun setPortForwarding <VMNET_NAME> <PROTOCOL> <HOST_PORT> <VM_IP> <VM_PORT>, например:

vmrun setPortForwarding vmnet8 TCP 8080 192.168.159.133 8080

Сами настройки NAT на хосте хранятся в двух местах. В файле "C:\ProgramData\VMware\vmnetnat.conf" в разделе [incomingtcp] в формате <HOST_PORT> = <VM_IP>:<VM_PORT>.

Пример скрипта PowerShell для добавление записи:

$FileName = "C:\ProgramData\VMware\vmnetnat.conf"

$HostPort = "8080"

$VMIpVMPort = "192.168.159.133:8080"

(Get-Content $FileName) -replace "\[incomingtcp\]", "$&`n$HostPort = $VMIpVMPort" | Set-Content $FileName

И в реестре:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\VMware, Inc.\VMnetLib\VMnetConfig\vmnet8\NAT\TCPForward

В формате:

Name: <HOST_PORT>

Data: <VM_IP>:<VM_PORT>

Пример скрипта PowerShell для добавления записи:

New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\VMware, Inc.\VMnetLib\VMnetConfig\vmnet8\NAT\TCPForward" -Name "8080" -Value "192.168.159.133:8080"

Если вы меняете параметры напрямую, то не забудьте перезапустить службу VMware NAT Service:

Restart-Service -Name "VMware NAT Service"

После этого Pod станет доступен по сети при обращении на IP адрес хоста Workstation (не забудьте настроить Windows Firewall).


Удаление кластера Kubernetes

После завершения работы вы можете удалить кластер Kubernetes и остановить vctl с помощью команд:

kind delete cluster --name <ИМЯ_КЛАСТЕРА>

vctl system stop


Комментариев нет:

Отправить комментарий