В этой статье мы покажем, как развернуть простое приложение (для голосования в нашем случае) с помощью werf. Прежде всего рекомендуем ознакомиться с кратким введением, если вы этого еще не сделали.
Подготовка
Установите werf.
У вас должен быть доступ к кластеру Kubernetes и возможность push’ить образы в container registry. Container registry также должен быть доступен из кластера для извлечения образов.
Если кластер Kubernetes и container registry у вас уже настроены и работают, достаточно:
- Выполнить стандартный вход в container registry со своего хоста.
- Убедиться, что кластер Kubernetes доступен с хоста (дополнительная настройка
werf
, скорее всего, не потребуется, если у вас уже установлен и работаетkubectl
).
В ином случае выполните одну из следующих инструкций, чтобы настроить локальный кластер Kubernetes и container registry в вашей системе:
- Установите minikube.
- Установите kubectl.
-
Запустите minikube:
minikube start --driver=docker --insecure-registry registry.example.com:80
ВАЖНО. С параметром
--insecure-registry
мы подготавливаем такое окружение, которое сможет работать с Container Registry без TLS. В нашем случае для упрощения настройка TLS отсутствует. -
Установка NGINX Ingress Controller:
minikube addons enable ingress
-
Установка Container Registry для хранения образов:
minikube addons enable registry
Создадим Ingress для доступа к Container Registry.
@" --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: registry namespace: kube-system annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: rules: - host: registry.example.com http: paths: - path: / pathType: Prefix backend: service: name: registry port: number: 80 "@ | kubectl apply -f -
-
Разрешаем доступ в Container Registry без TLS для Docker:
Через меню Docker Desktop -> Settings -> Docker Engine добавим новый ключ в конфигурацию:
{ "insecure-registries": ["registry.example.com:80"] }
Перезапустим Docker Desktop через меню, открывающееся правым кликом по иконке Docker Desktop в трее.
Затем снова запустим minikube:
minikube start --driver=docker --insecure-registry registry.example.com:80
-
Разрешаем доступ в Container Registry без TLS для werf:
В терминале, где будет запускаться werf, установим переменную окружения
WERF_INSECURE_REGISTRY=1
.Для cmd.exe:
set WERF_INSECURE_REGISTRY=1
Для bash:
export WERF_INSECURE_REGISTRY=1
Для PowerShell:
$Env:WERF_INSECURE_REGISTRY = "1"
-
Мы будем использовать домены
vote.quickstart-application.example.com
иresult.quickstart-application.example.com
для доступа к приложению и доменregistry.example.com
для доступа к Container Registry.Обновим файл hosts. Сначала получите IP-адрес minikube:
minikube ip
Используя полученный выше IP-адрес minikube, добавьте в конец файла
C:\Windows\System32\drivers\etc\hosts
следующую строку:<IP-адрес minikube> vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com
Должно получиться примерно так:
192.168.99.99 vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com
-
Также делаем доступ к домену
registry.example.com
из minikube node:minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
- Установите minikube.
- Установите kubectl.
-
Запустите minikube:
minikube start --vm=true --insecure-registry registry.example.com:80
ВАЖНО. С параметром
--insecure-registry
мы подготавливаем такое окружение, которое сможет работать с Container Registry без TLS. В нашем случае для упрощения настройка TLS отсутствует. -
Установка NGINX Ingress Controller:
minikube addons enable ingress
-
Установка Container Registry для хранения образов:
minikube addons enable registry
Создадим Ingress для доступа к Container Registry:
kubectl apply -f - << EOF --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: registry namespace: kube-system annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: rules: - host: registry.example.com http: paths: - path: / pathType: Prefix backend: service: name: registry port: number: 80 EOF
-
Разрешаем доступ в Container Registry без TLS для docker:
Через меню Docker Desktop -> Settings -> Docker Engine добавим новый ключ в конфигурацию:
{ "insecure-registries": ["registry.example.com:80"] }
Перезапустим Docker Desktop через меню, открывающееся правым кликом по иконке Docker Desktop в трее.
Затем снова запустим minikube:
minikube start --vm=true --insecure-registry registry.example.com:80
-
Разрешаем доступ в Container Registry без TLS для werf:
В терминале, где будет запускаться werf, установим переменную окружения
WERF_INSECURE_REGISTRY=1
. Для bash:export WERF_INSECURE_REGISTRY=1
Чтобы опция автоматически устанавливалась в новых bash-сессиях, добавим её в
.bashrc
:echo export WERF_INSECURE_REGISTRY=1 | tee -a ~/.bashrc
-
Мы будем использовать домены
vote.quickstart-application.example.com
иresult.quickstart-application.example.com
для доступа к приложению и доменregistry.example.com
для доступа к Container Registry.Обновим файл hosts. Выполните команду в терминале:
echo "$(minikube ip) vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com" | sudo tee -a /etc/hosts
-
Также делаем доступ к домену
registry.example.com
из minikube node:minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
-
Установите minikube по инструкции (достаточно выполнить только первый пункт этих инструкций под названием Installation).
-
Запустите minikube:
minikube start --driver=docker --insecure-registry registry.example.com:80
ВАЖНО. С параметром
--insecure-registry
мы подготавливаем такое окружение, которое сможет работать с Container Registry без TLS. В нашем случае для упрощения настройка TLS отсутствует. -
Если вы не устанавливали отдельно утилиту
kubectl
, можно создать alias наkubectl
, поставляемую с munikube:alias kubectl="minikube kubectl --" echo 'alias kubectl="minikube kubectl --"' >> ~/.bash_aliases
-
Установка NGINX Ingress Controller:
minikube addons enable ingress
-
Установка Container Registry для хранения образов:
minikube addons enable registry
Создадим Ingress для доступа к Container Registry:
kubectl apply -f - << EOF --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: registry namespace: kube-system annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: rules: - host: registry.example.com http: paths: - path: / pathType: Prefix backend: service: name: registry port: number: 80 EOF
-
Разрешаем доступ в Container Registry без TLS для Docker:
В файл, по умолчанию находящийся в
/etc/docker/daemon.json
, добавим новый ключ:{ "insecure-registries": ["registry.example.com:80"] }
Если такого файла в каталоге нет, его нужно создать и вставить в него указанные выше строки. Обратите внимание, что для доступа к изменению файлов в каталоге
/etc
нужны права суперпользователя (root).Перезапустим Docker:
sudo systemctl restart docker
Затем снова запустим minikube:
minikube start --driver=docker --insecure-registry registry.example.com:80
-
Разрешаем доступ в Container Registry без TLS для werf:
В терминале, где будет запускаться werf, установим переменную окружения
WERF_INSECURE_REGISTRY=1
.Для bash:
export WERF_INSECURE_REGISTRY=1
Чтобы опция автоматически устанавливалась в новых bash-сессиях, добавим её в
.bashrc
:echo export WERF_INSECURE_REGISTRY=1 | tee -a ~/.bashrc
-
Мы будем использовать домены
vote.quickstart-application.example.com
иresult.quickstart-application.example.com
для доступа к приложению и доменregistry.example.com
для доступа к Container Registry.Обновим файл hosts. Убедитесь, что minikube запущен и работает:
echo "$(minikube ip)"
Если в результате был показан IP-адрес кластера, значит кластер запущен и работает.
Выполните команду в терминале:
echo "$(minikube ip) vote.quickstart-application.example.com result.quickstart-application.example.com registry.example.com" | sudo tee -a /etc/hosts
-
Также делаем доступ к домену
registry.example.com
из minikube node:minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
Разверните приложение-пример
-
Склонируйте репозиторий нашего приложения-примера:
git clone https://github.com/werf/quickstart-application cd quickstart-application
-
Запустите команду converge, которая использует Container Registry для хранения образов:
werf converge --repo registry.example.com:80/quickstart-application
Примечание: для подключения к кластеру Kubernetes werf
использует те же настройки, что и kubectl
: файл ~/.kube/config
и переменную среды KUBECONFIG
. Также поддерживаются флаги --kube-config
и --kube-config-base64
- с их помощью можно указывать кастомные файлы kubeconfig.
Проверьте результаты
После успешного завершения команды converge
можно считать, что наше приложение развернуто и работает.
Как вы помните, наше приложение представляет собой простую голосовалку. Давайте его проверим!
-
Чтобы принять участие в голосовании, перейдите по ссылке: vote.quickstart-application.example.com
-
Чтобы увидеть результаты голосования, перейдите по ссылке: result.quickstart-application.example.com
Принципы работы
Чтобы развернуть приложение с помощью werf
, необходимо описать желаемое состояние в Git (как описано в Как это работает).
-
В нашем репозитории имеются следующие Dockerfile’ы:
vote/Dockerfile result/Dockerfile worker/Dockerfile
-
В
werf.yaml
на них прописаны соответствующие ссылки:configVersion: 1 project: quickstart-application --- image: vote dockerfile: vote/Dockerfile context: vote --- image: result dockerfile: result/Dockerfile context: result --- image: worker dockerfile: worker/Dockerfile context: worker
-
Шаблоны для компонентов приложения
vote
,db
,redis
,result
иworker
описаны в каталоге.helm/templates/
. Схема ниже показывает, как компоненты взаимодействуют между собой:
- Фронтенд-приложение на Python или ASP.NET Core позволяет пользователю проголосовать за один из двух вариантов;
- Очередь на базе Redis или NATS получает новые голоса;
- Worker на основе .NET Core, Java или .NET Core 2.1 собирает голоса и сохраняет их в…
- Базу данных Postgres или TiDB в томе Docker;
- Веб-приложение на Node.js или ASP.NET Core SignalR в реальном времени показывает результаты голосования.