Как работать с Minikube: рекомендации и полезные советы

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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), но я бы хотел предостеречь вас от их установки по двум причинам:
  1. Если у оборудования ограничены ресурсы, то дополнения их «съедят». Чтобы сохранить ресурсы для подов приложений, по возможности используйте другие решения. Например, не запускайте панели управления непосредственно в Kubernetes, а используйте интеграции с Lens или K9s.
  2. Чтобы поддерживать согласованный способ установки дополнений в 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 сервиса можно получить тремя способами:

  1. С помощью команды minikube service <название сервиса> создать туннель и присвоить произвольное значение nodeport: 



  2. Использовать команду port-forward, чтобы сопоставить сервис и localhost:



  3. Открыть порты (либо диапазоны портов) при запуске 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 бонусных рублей.

Что почитать по теме:
  1. Устранение неполадок в Kubernetes: в каком направлении двигаться, если что-то идет не так
  2. Запуск проекта в Kubernetes за 60 минут
  3. Наш телеграм-канал с новостями о Kubernetes
Источник: https://habr.com/ru/company/vk/blog/648117/


Интересные статьи

Интересные статьи

Наша рубрика «Где работать в ИТ» — это интервью с интересными айти-компаниями, в которых они делятся подробностями о своем процессе работы. Представители индустрии отвечают на вопросы, где рассказываю...
Тестирование игр - это захватывающая часть процесса их разработки. На рынке существует огромное количество удивительных видеоигр, но все они, прежде чем быть выпущенными,...
Не стоит недооценивать силу простоты. Пожалуй, сложно представить себе, что на чистом JavaScript реализовано что-то вроде системы push-уведомлений, работающей в реальном времени, или инст...
Всем привет!Меня зовут Борис. Я AQA iOS-engineer в Vivid Money.Это вступительная статья, в цикле статей по iOS-автоматизации, в которых хочется рассказать о пользе ui-тес...
А вы знали о том, что то, что вы сейчас читаете, это — данные? Вы видите слова, но на серверах всё это хранится в виде данных. Эти данные можно куда-то скопировать, можно разобраться ...