Рубрики
Uncategorized

Неограниченные условия предварительного просмотра с пространствами имен Kubernetes

В нашей большой серии Anti-Daxtains Kubernetes мы кратко объяснили, что статические испытательные среды … Помечено DevOps, Kubernetes, Plationnative, Docker.

В нашем Большая серия Kubernetes Anti-образцов , мы кратко объяснили, что статические испытательные среды больше не нужны, если вы используете Kubernetes. Они дорогие, трудно поддерживать, и трудно убирать.

Вместо этого мы предложили принять временные среды, созданные по требованию, когда открыт запрос на тягу.

В этой статье мы увидим практические объяснения о том, как достичь неограниченной временной среды с использованием пространств имен Kubernetes.

Выбор стратегии именования

Поскольку среды предварительного просмотра будут созданы и уничтожены динамическими способом, вам нужно выбрать стратегию их имена. Хотя несколько решений существуют для именования, два наиболее распространенных варианта являются:

  1. Используя имя ветки как контекстный URL. Это означает example.com/feature1, example.com/feature2, example.com/feature3 , и так на
  2. Используя имя ветки как хозяин поддомена. Это означает stature1.example.com, функция2.example.com, функция3.example.com

Контекстная стратегия на основе URL очень проста в настройке, поскольку ему не нужны какие-либо специальные настройки DNS (или SEMS/SELLCARDS TLS). С другой стороны, не все приложения предназначены для запуска с другим корневым контекстом. Если вы уверены, что ваше приложение не будет проблем с URL-адресом контекста, то эта стратегия самая легкая для начала.

Стратегия именования на основе хоста гораздо более надежна, но требует некоторой конфигурации в вашем поставщике DNS, чтобы поймать всех поддоменов и отправлять их в кластер, который будет держать все ваши предварительные пространства имен.

В обоих случаях мы также используем основные пространства имен Kubernetes с тем же именем, что и ветвь. Мы используем тот факт, что GIT филиалы имеют уникальные имена, убедившись, что между названиями окружающей среды нет столкновений или пространствами Kubernetes.

Также очень распространено для команд, чтобы создавать имена отделений, которые представляют конкретные вопросы (например, с Джирой). Это позволяет очень легко понять, что разработчики реализуются для каждой функции функции.

Например, если разработчик начинает работать над «Выпуск 45 для выставления счета», то:

  1. Ветка Git создается с именем Выпуск-45-биллинг
  2. Временная среда развернута в пространстве имен Kubernetes Выпуск-45-биллинг
  3. Окружающая среда выставлена в example.com/issue-45-billing или в Выпуск-45-billing.example.com.

Использование вход в Kubernetes для управления движением

Вы можете создать предварительный просмотр в пространстве имен Kubernetes, используя любой из доступных механизмов развертывания (например, Helm или Kustomize). Для того, чтобы отличить трафик между различными стручками, вам также необходимо установить попадание kubernetes. Вход является специальным ресурсом Kubernetes, ответственных за запросы на маршрутизацию внутри кластера.

Есть несколько реализаций, и для нашего примера мы будем использовать Посол шлюза . Мы будем использовать Посол кромки стека 1.13.8 Но открытый источник Эмиссарный проникновение должен работать тоже. Как стратегии именования на основе хоста, так и контекстами, основанные на основе спецификации входа.

Вы можете посмотреть, как мы создали наш вход в Пример приложения для контекстной стратегии именования.

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: "simple-java-app-ing"
  annotations:
    kubernetes.io/ingress.class: {{ .Values.ingress.class }}

spec:
  rules:
    - http:
        paths:
          - path: {{ .Values.ingress.path }}
            backend:
              serviceName: simple-service
              servicePort: 80

Наиболее важной собственностью является свойство «Путь», которое говорит о том, что контекст URL-адреса для чтения, когда запрос наступает в кластере (например, example.com/feature1, example.com/feature2 и т. Д.).

Мы используем HELM для создания этого свойства PATH настраиваемого. Это означает, что мы можем пройти значение HELM для каждого развертывания, которое представляет URL-адрес этой среды предварительного просмотра.

Помимо конфигурируемого входа, наша пример примерки — это приложение Vanilla Kubernetes. Вы можете увидеть полный Хелм диаграмма в Github Отказ

Создание среды для запроса на тягу

С применением проявляется на месте и входной, установленном в кластере, мы теперь готовы настроить рабочий процесс для временных сред.

Сначала нам нужен конвейер, который создает временную среду, когда открывается запрос на тяга (или синхронизирован/обновлен).

Codefresh поставляется с богатым набором триггеров, которые позволяют вам точно определить, какие события запускают трубопровод. Вот диалоговое окно триггера:

Мы заинтересованы только в начальном событии открытия запроса на тягу вместе с событием «синхронизации». В условиях GitHub запрос на тягу синхронизируется, когда кто-то подталкивает еще один коммит до уже открытого запроса на тягу. Мы хотим обновить обстановку в этом случае.

Что касается самого трубопровода, это очень просто всего 4 шагов:

version: "1.0"
stages:
  - "prepare"
  - "verify"
  - "deploy"

steps:
  main_clone:
    title: "Cloning repository"
    type: "git-clone"
    repo: "codefresh-contrib/unlimited-test-environments-source-code"
    revision: "${{CF_REVISION}}"
    stage: "prepare"
  build_app_image:
    title: Building Docker Image
    type: build
    stage: prepare
    image_name: kostiscodefresh/spring-actuator-sample-app
    working_directory: ./
    tag: '${{CF_BRANCH}}'
    dockerfile: Dockerfile
  clone:
    title: "Cloning repository"
    type: "git-clone"
    repo: "codefresh-contrib/unlimited-test-environments-manifests"
    revision: main
    stage: "deploy"
  deploy:
    title: Deploying Helm Chart
    type: helm
    stage: deploy
    working_directory: ./unlimited-test-environments-manifests
    arguments:
      action: install
      chart_name: simple-java-app
      release_name: my-spring-app
      helm_version: 3.2.4
      kube_context: myawscluster
      namespace: ${{CF_BRANCH_TAG_NORMALIZED}}
      cmd_ps: '--create-namespace --wait --timeout 5m'
      custom_values:
        - 'image_tag=${{CF_BRANCH_TAG_NORMALIZED}}'
        - 'replicaCount=3'
        - 'ingress_path=/${{CF_BRANCH_TAG_NORMALIZED}}/'

4 шага:

  1. А шаг клона Для проверки источника приложения
  2. А построить шаг Создать изображение контейнера, а также протолкнуть его в Docker Hub
  3. Другой шаг клона для проверки диаграммы HELM
  4. Шлем развертывает шаг Развернуть приложение к новому пространству имен

Ключевой момент здесь Cf_branch_tag_nomasalized Переменная. Это Переменная Предоставляется Codefresh и представляет ветвь GIT, которая вызвала этот трубопровод.

Мы используем переменную в шаге развертывания в свойстве имен, а также Ingress_Path имущество.

В качестве примера, если я создаю запрос на тягу на филиал GitHub под названием «Demo» и запустить этот трубопровод:

  1. Пространство имен под названием Демо будет создан на кластере
  2. Хелм будет развернуть версию приложения на этом пространстве имен
  3. Вход кластера будет проинструктирован перенаправить все трафик в /Демо/ к этому развертыванию

Вот развертывание результата в браузере:

И это все! Теперь каждый раз, когда открывается новый запрос на тягу, в соответствующем пространстве имен состоится новое развертывание.

Поскольку мы также поймаем событие PR Sync в нашем триггере Git, мы также можем снова совершить на ветке, где запрос на тяга уже открыт. Другое развертывание состоится со всеми нашими изменениями.

Автоматические комментарии к запросу потягивания с URL окружающей среды

Даже если у вас есть Конвенция об именах для предварительного просмотра среды, которые легко запомнить, для всех членов вашей команды было бы очень полезно, чтобы все члены вашей команды на самом деле иметь письменный журнал истории создания временной среды.

Одним из наиболее распространенных шаблонов является добавление URL среды в качестве комментариев в том же запросе на тягу, которые его создали.

В приведенном выше примере я работаю над функцией 2345 или ветви под названием PR-2345. . После того, как я создал запрос на тягу, окружающая среда была развернута в мою кластер Kubernetes, и комментарий к запросу на тягу имеет точный URL.

Таким образом, любой, кто отвечает за рассмотрение запроса на тягу, имеет в одном месте, оба изменения файла, так и временная среда для проверки того, как приложение смотрит после изменений.

Для достижения этого шаблона вы можете использовать плагин Codefresh для Добавление комментариев для вытягивания запросов Отказ Вы можете добавить следующий фрагмент в вашем трубопроводе Codefresh:

 add_pr_comment:
    title: Adding comment on PR
    stage: deploy
    type: kostis-codefresh/github-pr-comment
    fail_fast: false
    arguments:
      PR_COMMENT_TEXT: "[CI] Staging environment is at https://kostis.sales-dev.codefresh.io/${{CF_BRANCH_TAG_NORMALIZED}}/"
      GIT_PROVIDER_NAME: 'github-1'

С помощью этого шага трубопровода мы добавляем комментарий к запросу на тягу. Для самого комментария мы снова используем предопределенные Cf_branch_tag_nomasalized Переменная, которая обеспечивает имя запроса на тягу.

Плагин знает, какой запрос на тягу будет использоваться для комментариев, автоматически выявляя запрос на тягу с триггера трубопровода. Вот почему нам не нужно указывать, какой запрос на тягу будет прокомментирован.

Проверки качества и дымовые испытания

Создание автоматического предварительного просмотра среды для каждого запроса на тягу — это возможности, которая также предлагается несколькими другими продуктами в экосистеме Kubernetes. Большая мощность Codefresh поставляется с гибкостью, чтобы добавить любые шаги проверки до или после создания окружающей среды.

Например, будет разумно запустить блок и тесты интеграции до развертывания среды. В конце концов, если модульные тесты проваливаются, это действительно имеет смысл создать временную среду? Разработчик должен вместо этого исправить тесты подразделения, а затем попробуйте снова развернуть.

С другой стороны, может быть, вы хотите использовать временную среду для интеграционных тестов и возможных Scans. Таким образом, когда создается запрос на тяга, рецензент будет иметь всю необходимую информацию:

  • Код, который был изменен
  • Как выглядит приложение
  • Если новый код вводит проблемы безопасности или нет
  • Если новый код пропускает единицу и интеграционные тесты.

Составление всю эту информацию доступной в одном месте приводит к гораздо более быстрым процессу обзора.

Также возможно добавить дополнительные шаги в трубопроводе, который проверяет вещи после Окружающая среда создана. Очень распространенный пример запущен набор дымовых испытаний на вновь созданную временную среду. Это дает вам еще более высокую уверенность в правильности изменений.

Вы также можете включить другие шаги после развертывания, такого как публикация сообщения на Slack Channel, отправка электронного письма, обновляя приборную панель и так далее.

Вот наш последний конвейер для создания среды предварительного просмотра при открытии запроса на тягу.

Этот трубопровод имеет следующие шаги:

  1. А шаг клона Чтобы получить исходный код приложения
  2. А Фристайл шаг который проходит Maven для компиляции и единицы тесты
  3. А построить шаг Чтобы создать докерный образ приложения
  4. Шаг, который сканирует исходный код для вопросов безопасности с Снайк
  5. Шаг, который сканирует изображение контейнера Для вопросов безопасности с тривей
  6. Шаг, который проходит Интеграционные тесты Запустив приложение в контейнере услуг
  7. Шаг для Анализ сонара
  8. Шаг, который клоны второй репозиторий Git что имеет Хелм диаграмма приложения
  9. Шаг, который разворает исходный код в новое пространство имен.
  10. Шаг, который Добавляет комментарий На запрос на тягу с URL-адресом временной среды
  11. Шаг, который проходит Дымовые испытания против временной тестовой среды

Вот весь определение трубопровода:

version: "1.0"
stages:
  - "prepare"
  - "verify"
  - "deploy"

steps:
  main_clone:
    title: "Cloning repository"
    type: "git-clone"
    repo: "codefresh-contrib/unlimited-test-environments-source-code"
    revision: "${{CF_REVISION}}"
    stage: "prepare"

  run_unit_tests:
    title: Compile/Unit test
    stage: prepare
    image: 'maven:3.5.2-jdk-8-alpine'
    commands:
      - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository package   
  build_app_image:
    title: Building Docker Image
    type: build
    stage: prepare
    image_name: kostiscodefresh/spring-actuator-sample-app
    working_directory: ./
    tag: '${{CF_BRANCH}}'
    dockerfile: Dockerfile
  scan_code:
    title: Source security scan
    stage: verify
    image: 'snyk/snyk-cli:maven-3.6.3_java11'
    commands:
      - snyk monitor       
  scan_image:
    title: Container security scan
    stage: verify
    image: 'aquasec/trivy'
    commands:
      - trivy image docker.io/kostiscodefresh/spring-actuator-sample-app:${{CF_BRANCH}}
  run_integration_tests:
    title: Integration tests
    stage: verify
    image: maven:3.5.2-jdk-8-alpine
    commands:
     - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository verify -Dserver.host=http://my-spring-app -Dsonar.organization=kostis-codefresh-github
    services:
      composition:
        my-spring-app:
          image: '${{build_app_image}}'
          ports:
            - 8080
      readiness:
        timeoutSeconds: 30
        periodSeconds: 15
        image: byrnedo/alpine-curl
        commands:
          - "curl http://my-spring-app:8080/"
  sonar_scan:
    title: Sonar Scan
    stage: verify
    image: 'maven:3.8.1-jdk-11-slim'
    commands:
      - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository sonar:sonar -Dsonar.login=${{SONAR_TOKEN}} -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=kostis-codefresh-github
  clone:
    title: "Cloning repository"
    type: "git-clone"
    repo: "codefresh-contrib/unlimited-test-environments-manifests"
    revision: main
    stage: "deploy"
  deploy:
    title: Deploying Helm Chart
    type: helm
    stage: deploy
    working_directory: ./unlimited-test-environments-manifests
    arguments:
      action: install
      chart_name: simple-java-app
      release_name: my-spring-app
      helm_version: 3.2.4
      kube_context: myawscluster
      namespace: ${{CF_BRANCH_TAG_NORMALIZED}}
      cmd_ps: '--create-namespace --wait --timeout 5m'
      custom_values:
        - 'image_tag=${{CF_BRANCH_TAG_NORMALIZED}}'
        - 'replicaCount=3'
        - 'ingress_path=/${{CF_BRANCH_TAG_NORMALIZED}}/'
  add_pr_comment:
    title: Adding comment on PR
    stage: deploy
    type: kostis-codefresh/github-pr-comment
    fail_fast: false
    arguments:
      PR_COMMENT_TEXT: "[CI] Staging environment is at https://kostis.sales-dev.codefresh.io/${{CF_BRANCH_TAG_NORMALIZED}}/"
      GIT_PROVIDER_NAME: 'github-1'
  run_smoke_tests:
    title: Smoke tests
    stage: deploy
    image: maven:3.5.2-jdk-8-alpine
    working_directory: "${{main_clone}}"
    fail_fast: false
    commands:
     - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository verify -Dserver.host=https://kostis.sales-dev.codefresh.io/${{CF_BRANCH_TAG_NORMALIZED}}/  -Dserver.port=443

Теперь, когда создается среда предварительного просмотра, у вас есть гарантия, что она передавала проверки, определенные вашей командой (качество и безопасность), оставив только фактическую бизнес-логику в качестве пункта обзора.

Это делает процесс просмотра запросов на тяга как можно быстрее, поскольку все общие проверки полностью автоматизированы, и рецензенты могут сосредоточиться исключительно на том, как работает приложение.

Уничтожение предварительного просмотра среды

Создание среды предварительного просмотра может быть дорогостоящей операцией в большой команде. Снижение облачных затрат — одна из самых больших задач, когда дело доходит до Кубернаны и облачной инфраструктуры.

Вы должны иметь способ убирать среды предварительного просмотра, когда они больше не используются. Несмотря на то, что в некоторых командах есть автоматическая работа (например, через CRON), чтобы уничтожить среды предварительного просмотра, которые больше не используются, наиболее экономически эффективным вариантом является удаление среды предварительного просмотра сразу после закрытия соответствующего потяжения.

Мы можем настроить триггер для этого события с помощью диалога Git Codefresh:

Для этого трубопровода мы захватываем запрос на потяжку закрытых событий. Не очень важно, если бы запрос на тяга был объединен или нет. Поскольку он закрыт, мы предполагаем, что соответствующая среда предварительного просмотра больше не требуется.

Трубопровод, который удаляет окружающую среду, тривиально; У него есть только один шаг:

Вот полное определение удаления трубопровода:

version: "1.0"
steps:
  delete_app:
    title: Delete app
    type: helm
    arguments:
      action: auth
      helm_version: 3.2.4
      kube_context: myawscluster
      namespace: ${{CF_BRANCH_TAG_NORMALIZED}}
      commands:
            - helm delete my-spring-app --namespace ${{CF_BRANCH_TAG_NORMALIZED}}
            - kubectl delete namespace ${{CF_BRANCH_TAG_NORMALIZED}}

В трубопроводе мы удалите приложение HELM, а также удалите соответствующее пространство имен с тем же именем.

Принимая мышление среды предварительного просмотра

Мы надеемся, что вам понравилось это руководство для предварительного просмотра среды. Принятие Kubernetes — это как техническая задача, так и сдвиг парадигмы, поскольку несколько традиционных практик больше не требуются. Хватит с использованием предварительно определенных тестовых сред и переключиться на динамические среды предварительного просмотра сегодня!

Для получения более подробной информации см. Наше Документация Для предварительного просмотра среды.

Обратите внимание, что среды предварительного просмотра могут повлиять на ваш платежную плату, если они не настроены должным образом и управляются. Если вы используете проект с открытым исходным кодом с общественной инфраструктурой, вам необходимо принять меры предосторожности для предотвращения злоупотребления этим механизмом.

Новичок в Codefresh? Создайте свой бесплатный аккаунт сегодня Действительно

Оригинал: «https://dev.to/codefreshio/unlimited-preview-environments-with-kubernetes-namespaces-1cn5»