Автор статьи: Рустем Галиев
IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM
Привет, Хабр!
В мире современной разработки программного обеспечения Kubernetes (K8s) стал неотъемлемой частью инфраструктуры, предоставляя масштабируемость и гибкость в развертывании контейнеризированных приложений. В этой статье мы рассмотрим эффективный способ деплоя приложений в среде Kubernetes, используя мощные инструменты: Jenkins, Helm 3 и ArgoCD.
Jenkins, с его широким спектром возможностей для автоматизации процессов сборки и развертывания, становится основой нашего пайплайна разработки. Helm 3, в свою очередь, предоставляет инструменты для управления пакетами Kubernetes (чарта), упрощая установку и обновление приложений. Наконец, ArgoCD позволяет автоматизировать процесс развертывания и управления приложениями в Kubernetes-кластере, предоставляя возможность контролировать состояние и версионирование приложений.
В этой статье мы рассмотрим каждый из этих инструментов и покажем, как объединить их в единую систему для создания надежного и автоматизированного процесса развертывания приложений в Kubernetes. Погрузимся в подробности и узнаем, как настроить пайплайн, который ускорит и облегчит процесс разработки и развертывания вашего приложения.
Helm — это популярный инструмент для упрощения управления приложениями в среде Kubernetes. Версия Helm 3 представляет собой значительное обновление по сравнению с предыдущими версиями и внесла ряд улучшений и новых возможностей.
Начнем с написания Helm3.
Наш чарт будет находиться в директории argocd нашего проекта.
Наш Chart будет состоять из Chart.yaml (информация о чарте), values (файл с переменными), templates (манифесты k8s)
Директория templates
Именно values.yaml мы будем обновлять в стейдже нашего пайплайна.
Указываем реестр с образами, куда мы его собираем и деплоим. Нам нужно будет только обновить тэг нашего образа.
Далее изменяем файл templates/deployment.yaml, в блоке spec находим описание нашего пода, там находим контейнер, а в нем образ и указываем переменные.
Мы это описываем в jenkinsfile. Сперва задаем тэг в блоке environment:
Затем обновляем его
В Jenkinsfile будет выглядеть так
environment {
def DATE_TIME = sh(script: "echo `date +%Y%m%d-%H%M`", returnStdout: true).trim()
TAG = "1.0.build-${BUILD_NUMBER}"
}
stages {
//beginning
stage('Update deployments at K8S QA') {
steps {
sh """yq e '(.. | select(has("tag"))).tag = "$TAG"' -i ./argocd/values.yaml"""
sh 'cat ./argocd/values.yaml'
sh 'git config --global --add safe.directory $(pwd)'
sh 'git config user.email "jenkins-ci@noreply.ibm.com"'
sh 'git config user.name "jenkins CI"'
sh 'git remote set-url origin https://${GITHUB_TOKEN}@github.com/zetzo/audi.git'
sh 'git status'
//sh 'git config http.postBuffer 524288000'
sh 'git add ./argocd/values.yaml'
sh 'git commit -m "update image tag to $TAG"'
sh 'git push origin HEAD:QA'
}
}
//end of block
}
Тестируем, пайплайн зеленый
Дальше переходим в ArgoCD. Добавляем репу:
Дальше application → New App
Создаем и видим - ArgoCD все видит и управляет:
В завершение напоминаю про бесплатный открытый урок, который пройдет сегодня в 20:00 — «Свой Serverless с помощью Knative». Участники поговорят про идею serverless, чем прекрасны (и ужасны) Serverless-фреймворки вроде AWS Lambda и Google Cloud Functions. Какие есть open source решения на рынке, и как работать с «функциональным» стеком на примере платформы Knative. Записаться можно по ссылке.
ALexhha
А в чем смысл запускать каждую команду в отдельном шеле ?