В этой статье мы покажем, как развернуть простое приложение (для голосования в нашем случае) с помощью werf. Прежде всего рекомендуем ознакомиться с кратким введением, если вы этого еще не сделали.

Подготовка

Установите werf.

У вас должен быть доступ к кластеру Kubernetes и возможность push’ить образы в container registry. Container registry также должен быть доступен из кластера для извлечения образов.

Если кластер Kubernetes и container registry у вас уже настроены и работают, достаточно:

  1. Выполнить стандартный вход в container registry со своего хоста.
  2. Убедиться, что кластер Kubernetes доступен с хоста (дополнительная настройка werf, скорее всего, не потребуется, если у вас уже установлен и работает kubectl).


В ином случае выполните одну из следующих инструкций, чтобы настроить локальный кластер Kubernetes и container registry в вашей системе:

Windows — minikube
  1. Установите minikube.
  2. Установите kubectl.
  3. Запустите minikube:

    minikube start --driver=docker --insecure-registry registry.example.com:80
    

    ВАЖНО. С параметром --insecure-registry мы подготавливаем такое окружение, которое сможет работать с Container Registry без TLS. В нашем случае для упрощения настройка TLS отсутствует.

  4. Установка NGINX Ingress Controller:

    minikube addons enable ingress
    
  5. Установка 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 -  
    
  6. Разрешаем доступ в 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
    
  7. Разрешаем доступ в 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"
    
  8. Мы будем использовать домены 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
    
  9. Также делаем доступ к домену registry.example.com из minikube node:

    minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
    
MacOS — minikube
  1. Установите minikube.
  2. Установите kubectl.
  3. Запустите minikube:

    minikube start --vm=true --insecure-registry registry.example.com:80
    

    ВАЖНО. С параметром --insecure-registry мы подготавливаем такое окружение, которое сможет работать с Container Registry без TLS. В нашем случае для упрощения настройка TLS отсутствует.

  4. Установка NGINX Ingress Controller:

    minikube addons enable ingress
    
  5. Установка 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
    
  6. Разрешаем доступ в 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
    
  7. Разрешаем доступ в 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
    
  8. Мы будем использовать домены 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
    
  9. Также делаем доступ к домену registry.example.com из minikube node:

    minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
    
Linux — minikube
  1. Установите minikube по инструкции (достаточно выполнить только первый пункт этих инструкций под названием Installation).

  2. Запустите minikube:

    minikube start --driver=docker --insecure-registry registry.example.com:80
    

    ВАЖНО. С параметром --insecure-registry мы подготавливаем такое окружение, которое сможет работать с Container Registry без TLS. В нашем случае для упрощения настройка TLS отсутствует.

  3. Если вы не устанавливали отдельно утилиту kubectl, можно создать alias на kubectl, поставляемую с munikube:

    alias kubectl="minikube kubectl --"
    echo 'alias kubectl="minikube kubectl --"' >> ~/.bash_aliases
    
  4. Установка NGINX Ingress Controller:

    minikube addons enable ingress
    
  5. Установка 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
    
  6. Разрешаем доступ в 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
    
  7. Разрешаем доступ в 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
    
  8. Мы будем использовать домены 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
    
  9. Также делаем доступ к домену registry.example.com из minikube node:

    minikube ssh -- "echo $(minikube ip) registry.example.com | sudo tee -a /etc/hosts"
    

Разверните приложение-пример

  1. Склонируйте репозиторий нашего приложения-примера:

    git clone https://github.com/werf/quickstart-application
    cd quickstart-application
    
  2. Запустите команду 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 можно считать, что наше приложение развернуто и работает.

Как вы помните, наше приложение представляет собой простую голосовалку. Давайте его проверим!

  1. Чтобы принять участие в голосовании, перейдите по ссылке: vote.quickstart-application.example.com

  2. Чтобы увидеть результаты голосования, перейдите по ссылке: result.quickstart-application.example.com

Принципы работы

Чтобы развернуть приложение с помощью werf, необходимо описать желаемое состояние в Git (как описано в Как это работает).

  1. В нашем репозитории имеются следующие Dockerfile’ы:

    vote/Dockerfile
    result/Dockerfile
    worker/Dockerfile
    
  2. В 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
    
  3. Шаблоны для компонентов приложения 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 в реальном времени показывает результаты голосования.