Это продолжение второй части. На данный момент мы уже знаем некоторые объекты в Kubernetes и умеем пользоваться Helm. Что можно сделать дальше? Конечно, добавить больше автоматизации, секретов, хранилищ - много чего. Целью сегодняшней части будет являтся автоматизация и упрощение процесса упаковки описания приложения в helm chart.
Часть 3. Еще больше упрощаем deploy приложения
Попробуем упаковать наш helm chart стандартными средствами:
helm package helm-php-sample-app Successfully packaged chart and saved it to: .../php-sample-app-0.1.0.tgz
Теперь можно не пользоваться git для загрузки helm chart, а сохранять каждую версию в виде артефакта сборки (например, добавив эту сборку в GitHub Actions). Это действие мы и будем автоматизировать.
Сохраняем исходный код нашего helm chart в тот же репозиторий, что и код нашего тестового приложения PHP, чтобы получилась такая структура:
❯ tree -L 3 -a -I ".git"
.
├── .github
│ └── workflows
│ ├── helm-charts.yml
│ ├── main.yml
│ └── snyk-container-analysis.yml
├── README.md
├── charts
│ └── php-sample-app
│ ├── .helmignore
│ ├── Chart.yaml
│ ├── README.md
│ ├── templates
│ └── values.yaml
└── php-sample-app
├── Dockerfile
└── src
├── css
└── index.php
8 directories, 10 files
Возможно это и немного неправильно (для helm charts вероятнее лучше всего создать отдельный репозиторий), но для изучения этого будет достаточно.
А теперь попробуем настроить репозиторий для helm chart с помощью GitHub (GitHub Pages) в том же репозитории, где хранится наше приложение:
Создаем пустую ветку под названием “gh-pages” и удаляем из нее все файлы:
git checkout --orphan gh-pages git rm --cached -r .
Добавляем в ветку “gh-pages” файл README.md и по желанию - “_config.yml” в котором будет хранится конфигурация Jekyll для GitHub Pages:
theme: jekyll-theme-cayman
Отправляем изменения в ветке в репозиторий:
git commit -a -m "add branch for github pages" git push origin gh-pages
И переключаемся на основную ветку (в моем случае main):
git checkout main
В основной ветке (main) создаем файл GitHub Action (.github/workflows/release.yml) следующего содержания:
{% gist 2d6f6d85bef57d9a4c1a5601127505f1 %}
Если все сделали правильно, то после выполнения GitHub Actions мы сможем увидеть свежий релиз в разделе “Releases” на главной странице нашего репозитория.
Следующий шаг - проверить работу репозитория на кластере Kubernetes. Заходим на наш сервер с установленным Minikube и выполняем следующие команды:
Добавляем репозиторий с помощью Helm (NameSpace указывать не нужно):
# helm repo add YOUR_REPO_NAME https://GITHUB_USER.github.io/YOUR_REPO_NAME helm repo add php-sample-app https://g3rhard.github.io/php-sample-app helm repo update
Проверяем, что другие инсталляции были удалены:
helm uninstall -n developer php-sample-app ./helm-php-sample-app kubectl -n developer get pods
И устанавливаем наше приложение:
# helm install -n developer YOUR_APP_NAME REPO_NAME/APP_NAME helm install -n developer php-sample-app php-sample-app/php-sample-app
Проверяем развертывание приложения:
kubectl -n developer get pods kubectl -n developer get services NODE_PORT=$(kubectl get --namespace developer -o jsonpath="{.spec.ports[0].nodePort}" services php-sample-app) ./ngrok http $(minikube ip):$NODE_PORT
Теперь сборка новых версий у нас более-менее автоматизирована и пришло время проверить это.
Повышаем версию в файле charts/php-sample-app/Chart.yaml и отправляем изменения в репо (и дожидаемся выполнения GitHub Action):
-version: 0.3.0 +version: 0.3.1
Обновляем репозиторий на сервере с Minikube и проверяем получение новой версии:
helm repo update helm search repo php-sample-app NAME CHART VERSION APP VERSION DESCRIPTION php-sample-app/php-sample-app 0.3.1 0.3.0 A Helm chart for Kubernetes
Обновляем наше приложение:
helm upgrade -n developer php-sample-app php-sample-app/php-sample-app Release "php-sample-app" has been upgraded. Happy Helming! NAME: php-sample-app LAST DEPLOYED: Sun Jul 11 17:10:17 2021 NAMESPACE: developer STATUS: deployed REVISION: 2
That’s all.