Kube Earth by Anarki3000
Minikube — популярное решение для запуска локального кластера Kubernetes на macOS, Linux и Windows. Несмотря на большой набор функций и кроссплатформенную поддержку, Minikube всё же отличается от полнофункционального кластера Kubernetes.
Часто это сбивает с толку разработчиков и новых пользователей Kubernetes, которым нужно протестировать приложение в локальной среде. Команда Kubernetes aaS VK Cloud Solutions перевела статью о том, как наладить беспроблемную работу с Minikube.
О локальной разработке, в том числе Minikube, на Вечерней школе Kubernetes рассказывал Павел Селиванов, Architect и Developer Advocate VK Cloud Solutions. Вы можете посмотреть урок в записи.
Выделение CPU и RAM
По умолчанию Minikube запускается с двух ядер и двух гигабайт памяти — этих ресурсов хватит небольшой команде для тестирования нескольких микросервисов. Но если использовать его для комплексного тестирования с базами данных (например, с PostgreSQL или Redis) и очередями сообщений (например, с Kafka), то, исчерпав доступные ресурсы, Minikube выйдет из строя.
Чтобы этого не произошло, для начала предоставьте больше ресурсов базовому драйверу, например VirtualBox, Docker и другим.
Поменяйте настройки памяти и процессора с помощью команды:
$ minikube config set memory 6144
$ minikube config set cpus 4
Или воспользуйтесь флагом командной строки при запуске:
$ minikube start --memory 6144 --cpus 4
Чтобы использовать максимум доступных ресурсов:
$ minikube start --memory=max --cpus=max
Указание версии Kubernetes
Это можно сделать с помощью команды:
$ minikube start --kubernetes-version=v1.19.0
Также имеет смысл указать версию Kubernetes, когда вы тестируете несколько кластеров, работающих на разных версиях. Для этого используйте флаг
--profile
:$ minikube start -p dev --kubernetes-version=v1.19.0
$ minikube start -p stage --kubernetes-version=v1.18.0
Локальные образы Docker
Если вы не пользуетесь инструментами для автоматизации работы, например skaffold, то вам придется помещать образы контейнеров в Minikube вручную, чтобы использовать локально созданные артефакты.
Если кластер построен на основе среды исполнения контейнера Docker (в отличие от cri-o или containerd), укажите для терминала использование внутреннего демона Docker в кластере с помощью команды:
$ eval $(minikube docker-env)
Теперь все команды Docker выполняются внутри кластера с помощью демона Docker:
$ docker build -t my_awesome_image .
Созданный образ доступен для любых рабочих нагрузок Kubernetes, которые его запрашивают. Тем не менее убедитесь, что для параметра
imagePullPolicy
установлено значение Never
. Иначе Kubernetes попытается извлечь этот образ из удаленного репозитория, что приведет к сбою.Чтобы снова использовать собственный Docker-демон, откройте новое окно терминала или введите команду:
$ eval $(minikube docker-env -u)
Команды для других сред выполнения — в документации Minikube.
Дополнения Minikube
Minikube поддерживает несколько расширений, которые дополняют базовую функциональность. По умолчанию включены два из них:
default-storageclass
и storage-provisioner
.Чтобы включить другие дополнения, выполните команду:
$ minikube addons enable <название дополнения>
Это позволяет легко установить инструменты отладки (например, панель управления, EFK, metrics-server) или сетевые инструменты (например, Ingress, Istio), но я бы хотел предостеречь вас от их установки по двум причинам:
- Если у оборудования ограничены ресурсы, то дополнения их «съедят». Чтобы сохранить ресурсы для подов приложений, по возможности используйте другие решения. Например, не запускайте панели управления непосредственно в Kubernetes, а используйте интеграции с Lens или K9s.
- Чтобы поддерживать согласованный способ установки дополнений в Minikube и продуктивных кластерах, устанавливайте их с помощью существующих методов. Например, используйте Helm-чарт для nginx-Ingress вместо дополнения Ingress в Minikube.
Доступ к приложениям
Чтобы дать внутренним приложениям доступ к внешнему трафику, в Kubernetes есть
NodePort
и LoadBalancer
. Их реализация в Minikube зависит от операционной системы (macOS или Linux) и варианта развертывания (Docker, VirtualBox, VMWare).Чаще всего я видел проблемы у пользователей macOS, которые запускают Minikube с драйвером Docker. Поскольку на macOS нет docker0 bridge, то невозможно получить IP-адрес контейнера с хоста. Когда я запускаю Kubernetes через NodePort, то не могу выполнить
$(minikube ip):<port>
непосредственно из терминала. Посмотрим на пример эхо-сервера из документации Minikube. При попытке получить endpoint Minikube macOS зависает, а на Linux выдает ожидаемый результат:
# Echo server example with nodeport 31652
$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
$ kubectl expose deployment hello-minikube --type=NodePort --port=8080
# on macOS this hangs
$ curl $(minikube ip):31652
curl: (7) Failed to connect to 192.168.49.2 port 31652: Network is unreachable
# on Linux, this returns
$ curl $(minikube ip):31652
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
...
Доступ к
NodePort
сервиса можно получить тремя способами:- С помощью команды
minikube service <название сервиса>
создать туннель и присвоить произвольное значение nodeport:
- Использовать команду
port-forward
, чтобы сопоставить сервис и localhost:
- Открыть порты (либо диапазоны портов) при запуске Minikube:
$ minikube start
--extra-config=apiserver.service-node-port-range=32760-32767
--ports=127.0.0.1:32760-32767:32760-32767
Если вы привыкли использовать команду
docker -p
или настраивать порты через файлы docker-compose, то вам больше подойдет последний подход. Если же для экспорта в приложении есть несколько диапазонов портов (например, 5432 — для PostgreSQL, 9092 — для Kafka), то можно просто открыть отдельные порты. Или же можно использовать команду port-forwarding
для взаимодействия не только с Minikube, но и с удаленными кластерами. Если при этом вам нужен проработанный UI, подойдет Kube Forwarder.Для
LoadBalancer
задачу можно решить с помощью команды minikube tunnel. Она запускается как процесс и создает сетевой маршрут на хосте, используя IP-адрес кластера в качестве шлюза. Таким образом можно открывать отдельные сервисы, но наиболее распространенный вариант — открыть контроллер Ingress (например, nginx, Ambassador, Traefik) и направить входящий трафик через него. Изменение файла /etc/hosts
для сопоставления IP-адреса Minikube с именем DNS также может эмулировать обращение к внешней конечной точке DNS.Примечание. Также можно настроить Minikube на прием команд в удаленной сети, задав параметр--listen-address=0.0.0.0
. Это удобно для тестирования, но подход стоит использовать с осторожностью из соображений безопасности.
Горячая перезагрузка с подключениями хоста и синхронизацией файлов
Minikube поддерживает подключение директории хоста к VM аналогично команде
docker -v
. Чтобы подключить директорию, используйте:$ minikube mount <исходная директория на хосте>:<целевая директория в minikube>
На эту директорию может ссылаться любой контейнер Kubernetes:
volumeMount:
- name: configs
mountPath: /usr/app/configs
volumes:
- name: configs
hostPath:
path: <целевая директория в minikube>
Это может быть полезно для подключения различных конфигураций или секретов для тестирования. При этом не нужен механизм перезагрузки для повторного подключения значений в поде.
Для синхронизации файлов в Minikube в момент запуска их можно также разместить в директории
$MINIKUBE_HOME/files
. Вариант подойдет для подключения пользовательской конфигурации DNS или SSL-сертификатов.$ mkdir -p ~/.minikube/files/etc
$ echo nameserver 8.8.8.8 > ~/.minikube/files/etc/resolv.conf
$ minikube start
Заключение
Для большинства разработчиков, которые собираются переходить с Docker на Kubernetes, «просто протестировать» приложения с помощью Minikube не так уж просто. Лучше всего этот инструмент работает с решениями для итеративной разработки приложений, например с Draft, Okteto и Skaffold. Но даже без них важно понимать, как настраивать ресурсы, помещать образы и получать доступ к приложениям извне.
Команда Kubernetes aaS VK Cloud Solutions развивает собственный Kubernetes aaS, о нем рассказывали в этой статье. Будет здорово, если вы его протестируете и дадите обратную связь. Для тестирования всем новым пользователям начисляем при регистрации 3000 бонусных рублей.
Что почитать по теме: