Пожалуй один из самых недооцененных аспектов Kubernetes, это CI/CD конвейер, который используются для релизов k8s.
Возможно именно благородя простоте и надежности сборочного процесса, который построен, в основном на bash-скриптах и инструкциях make, проект, который давно перевалил за 2 миллиона строчек кода, можно собрать из исходников, протестировать и выпустить в релиз, выполнив один таргет в Makefile.
git clone https://github.com/kubernetes/kubernetes.git
make -f build/root/Makefile all WHAT=cmd/kubelet kube-proxy kube-apiserver kube-controller-manager kube-scheduler kubectl GOFLAGS=-v
В качестве примера сборочного конвейера будем использовать один из самых популярных CI инструментов – Jenkins.
При этом благородя тому, что вся сборочная логика и тесты предусмотрительно были вынесены в скрипты и make-файлы, можно не привязываться к какому-то конкретному фреймворку для непрерывной интеграции. Вместо Jenkns можно использовать любой другой инструмент.
Jenkinsfile
pipeline {
agent any
stages {
stage('Build') {
steps {
/// Клонируем репозиторий кубернетес
git 'https://github.com/kubernetes/kubernetes.git'
/// Чтобы не было конфликтов, перед запуском сборки убеждаемся что директория _output очищена
sh "make -f build/root/Makefile clean"
/// Выбираем для сборки только основные компоненты кубернетес
sh "make -f build/root/Makefile all WHAT=cmd/kubelet kube-proxy kube-apiserver kube-controller-manager kube-scheduler kubectl GOFLAGS=-v"
}
}
}
/// В блоке post можно указывать условия которые будут всегда выполнятся после завершения задания jenkins
/// В данном случае мы инструктируем jenkins сохранять все файлы в целевой директории
post {
always {
archiveArtifacts artifacts: '_output/local/go/bin/**/*.*'
}
}
}
Параметры для отладки и сборки внутри контейнеров можно просмотреть вызвав один из тергетов в Makefile
make -f build/root/Makefile help
Универсальных рецептов – не существует, но подходы к непрерывной интеграции, которые использовали разработчики Kubernetes, определенно заслуживают внимания и изучения.
В следующей части мы будем оптимизировать релиз-процесс Kubernetes. Попробуем сделать его еще быстрее, надежнее и эффективнее.