Понимание скаффолда

1. Цели

Skaffold — это инструмент, который управляет рабочим процессом сборки, отправки и развертывания вашего приложения. Вы можете использовать Skaffold для простой настройки локального рабочего пространства для разработки, оптимизации внутреннего цикла разработки и интеграции с другими инструментами, такими как Kustomize и Helm, для управления манифестами Kubernetes.

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

Вы будете:

  • Настройте и включите Skaffold для локальной разработки.
  • Создайте и запустите простое приложение на Golang.
  • Управление локальным развертыванием приложений с помощью Skaffold.
  • Сгенерируйте манифесты и разверните приложение.

2. Прежде чем начать

Подготовка рабочего места

  1. Откройте редактор Cloud Shell, перейдя по следующему адресу:
https://shell.cloud.google.com

Разрешите использование сторонних файлов cookie. Нажмите «Сайт не работает», а затем «Разрешить файлы cookie».

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. Если вы еще этого не сделали, в окне терминала клонируйте исходный код приложения с помощью следующей команды:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. Перейдите в каталог клонированного репозитория:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. Чтобы установить рабочую область Cloud Shell в текущий каталог, выполните следующую команду:
cloudshell workspace .

Подготовка вашего проекта

  1. Убедитесь, что ваш проект Google Cloud настроен правильно, выполнив следующую команду:
gcloud config set project {{project-id}}

3. Начало работы со Skaffold

  1. Выполните следующую команду, чтобы создать главный конфигурационный файл Skaffold, skaffold.yaml :
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. Откройте файл skaffold.yaml в панели IDE. Это конфигурационный файл верхнего уровня, определяющий конвейер разработки Skaffold.

Обратите внимание на формат YAML, похожий на Kubernetes, и следующие разделы в этом файле:

  • build
  • deploy
  • profiles

В этих разделах описывается, как следует создавать и развертывать приложение, а также профили для каждой целевой платформы развертывания.

Более подробную информацию о полном списке этапов Skaffold можно найти в документации по этапам конвейера Skaffold.

4. Построить

Раздел build содержит конфигурацию, определяющую способ сборки приложения. В данном случае вы можете увидеть конфигурацию обработки git -тегов, а также раздел artifacts , определяющий образы контейнеров, из которых состоит приложение.

Кроме того, в этом разделе вы можете увидеть ссылку на Dockerfile , используемый для сборки образов. Skaffold также поддерживает другие инструменты сборки, такие как Jib , Maven , Gradle , Cloud-native Buildpacks , Bazel и пользовательские скрипты. Подробнее об этой конфигурации можно прочитать в документации Skaffold Build .

5. Развертывание

Раздел deploy содержит конфигурацию, определяющую способ развертывания приложения. В данном случае вы можете увидеть пример развертывания по умолчанию, который настраивает Skaffold на использование инструмента Kustomize .

Инструмент Kustomize предоставляет функциональность для генерации манифестов Kubernetes путем объединения набора общих YAML-файлов компонентов (в base каталоге) с одним или несколькими «наложениями», которые обычно соответствуют одной или нескольким целевым средам развертывания — как правило, dev , test , staging и production или аналогичным.

В этом примере вы видите два наложения для трех целевых сред: dev , staging и prod . Наложение dev будет использоваться во время локальной разработки, а наложения staging и prod — при развертывании с помощью Skaffold.

6. Профили

Раздел profiles содержит конфигурацию, определяющую параметры сборки, тестирования и развертывания для различных контекстов. Различные контексты, как правило, представляют собой разные среды в конвейере развертывания вашего приложения, например, в этом примере — staging или prod . Это означает, что вы можете легко управлять манифестами, содержимое которых должно отличаться для разных целевых сред, без повторения шаблонной конфигурации.

В разделе profiles можно заменить или изменить любые элементы основной конфигурации (например, разделы build , test или deploy ).

В качестве примера откройте файл overlays > prod > deployment.yaml . Обратите внимание, что количество реплик для приложения здесь установлено на три, что переопределяет базовую конфигурацию.

  1. Откройте в панели IDE следующий файл: app > main.go Это простое приложение на Golang, которое каждую секунду выводит строку в stdout .
  2. Обратите внимание, что приложение также выводит имя пода Kubernetes, в котором оно запущено.

Просмотр Dockerfile

  1. Откройте файл app > Dockerfile в панели IDE. Этот файл содержит последовательность директив для сборки образа контейнера приложения для файла main.go и на него есть ссылка в файле skaffold.yaml верхнего уровня.

7. Разработка с помощью Skaffold

Настройка среды Kubernetes

  1. Выполните следующую команду, чтобы убедиться, что ваш локальный кластер Kubernetes запущен и настроен:
minikube start

Это может занять несколько минут. Если кластер успешно запущен, вы должны увидеть следующий вывод:

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. Выполните следующую команду, чтобы создать пространства имен Kubernetes для dev , staging и prod :
kubectl apply -f namespaces.yaml

Вы должны увидеть следующий результат:

namespace/dev created
namespace/staging created
namespace/prod created

Использование Skaffold для локального развития

  1. Выполните следующую команду, чтобы собрать приложение и развернуть его в локальном кластере Kubernetes, работающем в Cloud Shell:
skaffold dev

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

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

Обратите внимание, что точное имя пода будет отличаться от общего вывода, приведенного выше.

Внесение изменений в приложение

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

  1. Откройте файл app > main.go в панели IDE и измените строку вывода:
"Hello world from pod %s!\n"

к:

"Hello Skaffold world from pod %s!\n"

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

  1. Теперь в файле "app > main.go" в панели IDE измените строку:
time.Sleep(time.Second * 1)

к

time.Sleep(time.Second * 10)

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

Внесение изменений в конфигурацию Kubernetes

Далее вам нужно будет внести изменения в конфигурацию Kubernetes, и Skaffold снова автоматически выполнит повторное развертывание.

  1. Откройте файл base > deployment.yaml в IDE и измените строку:
replicas: 1

к

replicas: 2

После повторного развертывания приложения вы увидите два запущенных пода — у каждого будет своё имя.

  1. Теперь измените ту же строку в файле ` base > deployment.yaml обратно на:
replicas: 1

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

  1. Наконец, нажмите Ctrl-C в окне терминала, чтобы остановить локальную разработку Skaffold.

Вырезание релиза

Далее вы создадите релиз, сгенерировав образ релиза и развернув его в кластере.

  1. Для сборки релиза выполните следующую команду:
skaffold build --file-output artifacts.json

Эта команда создаст окончательный образ (при необходимости) и выведет сведения о релизе в файл artifacts.json .

Если вы хотите использовать такой инструмент, как Cloud Deploy, для развертывания в ваших кластерах, этот файл содержит информацию о релизе. Это означает, что артефакт(ы) являются неизменяемыми на пути к рабочей среде.

  1. Выполните следующую команду, чтобы просмотреть содержимое файла artifacts.json :
cat artifacts.json | jq

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

Развертывание на тестовой площадке

  1. Выполните следующую команду, чтобы развернуть релиз, используя профиль staging :
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

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

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. Нажмите Ctrl-C в окне терминала, чтобы остановить вывод Skafold.
  2. Выполните следующую команду, чтобы увидеть, как ваше приложение работает в кластере:
kubectl get all --namespace staging

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

Развертывание в производственной среде

  1. Теперь выполните следующую команду, чтобы развернуть релиз, используя профиль prod :
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

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

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. Нажмите Ctrl-C в окне терминала, чтобы остановить вывод Skafold.

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

  1. Выполните следующую команду, чтобы увидеть, как ваше приложение работает в кластере:
kubectl get all --namespace prod

В результате вы должны увидеть строки, похожие на следующие, которые показывают развертывание в производственной среде:

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

Вы также должны увидеть три запущенных модуля приложения.

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. Поздравляем!

Поздравляем! Вы успешно завершили лабораторную работу Understanding Skaffold и научились настраивать и использовать Skaffold для локальной разработки и развертывания приложений.

Что дальше:

Узнайте больше о компании Skaffold:

Уборка

  1. Выполните следующую команду, чтобы остановить локальный кластер:
minikube delete