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

1. Цели

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

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

Вы будете:

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

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

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

  1. Откройте редактор Cloud Shell, перейдя по следующему URL-адресу:
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, и на следующие разделы YAML:

  • build
  • deploy
  • profiles

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

Подробнее о полном списке этапов Skaffold можно прочитать в документации Skaffold Pipeline Stages.

4. Построить

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

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

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

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

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

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

6. Профили

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

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

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

  1. Откройте следующий файл app > main.go на панели IDE. Это простое приложение на 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 в окне терминала, чтобы остановить вывод Skaffold.
  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 в окне терминала, чтобы остановить вывод Skaffold.

Вы должны увидеть три разных имени модуля, поскольку профиль 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