Автор статьи: Рустем Галиев

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. Записаться можно по ссылке.

Комментарии (1)


  1. ALexhha
    24.04.2024 12:20

    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 add ./argocd/values.yaml'
          sh 'git commit -m "update image tag to $TAG"'
          sh 'git push origin HEAD:QA'
       }
    }
    

    А в чем смысл запускать каждую команду в отдельном шеле ?