Деплой в Kubernetes
Info
В этом разделе рассмотрен деплой приложений в Kubernetes с использованием GitVerse CI/CD.
Kubernetes — это мощная платформа для автоматизации развертывания, масштабирования и управления контейнеризованными приложениями.
В рамках GitVerse CI/CD деплой в Kubernetes позволяет автоматизировать процесс развертывания приложений, используя GitVerse-специфичные инструменты и практики.
Пример workflow
Требования
-
Собранный Docker-образ:
- ожидается, что образ уже опубликован в реестре;
- пример:
gitverse.ru/actions/gitverse_hello:kaniko_cli; - можно собрать через:
.gitverse/workflows/docker/cloud-hosted-runner/push-registries.yaml.
-
Доступ к Kubernetes-кластеру:
- файл конфигурации (kubeconfig) должен быть доступен как секрет: KUBE_CONFIG;
- конфиг должен содержать права на apply/delete для deployment и ingress.
-
Зависимости:
- скрипт
./distribution/dependencies/install_k8s_dependencies.shустанавливает kubectl и другие необходимые утилиты.
Пример установки kubectl вручную:
# install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
chmod +x kubectl
mkdir -p ~/.local/bin
mv ./kubectl ~/.local/bin/kubectl-
Манифесты:
-
используются простейшие манифесты без production-настроек:
-
gitverse-hello-deployment.yaml— базовый Deployment + Service;apiVersion: apps/v1 kind: Deployment metadata: name: gitverse-hello-deployment spec: replicas: 1 template: metadata: labels: app: gitverse-hello-app spec: containers: - name: gitverse-hello image: gitverse.ru/actions/gitverse_hello:kaniko_cli imagePullPolicy: Always ports: - containerPort: 80 selector: matchLabels: app: gitverse-hello-app --- apiVersion: v1 kind: Service metadata: name: gitverse-hello-service spec: selector: app: gitverse-hello-app type: ClusterIP ports: - port: 80 targetPort: 80 -
ingress-deployment.yaml— Ingress с указанием хоста и бэкенда;apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gitverse-hello-ingress labels: name: gitverse-hello-ingress spec: rules: - http: paths: - pathType: Prefix path: "/" backend: service: name: gitverse-hello-service port: number: 80 -
нет: liveness/readiness, limits/requests, HPA, nodeSelector и т.д;
-
подходят для демо и тестов, но не для продакшена.
-
-
Ingress:
- IP-адрес Ingress-контроллера должен быть указан в секрете:
KUBE_INGRESS_IP; - убедитесь, что Ingress-контроллер установлен и работает.
- IP-адрес Ingress-контроллера должен быть указан в секрете:
Workflow
name: Деплой приложения в Kubernetes (kubectl)
on:
workflow_dispatch:
jobs:
# Деплой приложения в Kubernetes через kubectl
deploy-k8s-kubectl:
name: Деплой в Kubernetes (kubectl)
runs-on: ubuntu-cloud-runner
steps:
- name: Клонировать репозиторий
uses: actions/checkout@v4
- name: Установить зависимости (kubectl)
shell: bash
run: |
echo "🛠️ Установка kubectl и других инструментов..."
bash ./distribution/dependencies/install_k8s_dependencies.sh
- name: Настроить kubeconfig
run: |
echo "🔐 Размещение kubeconfig..."
mkdir -p ~/.kube
echo "${{ secrets.KUBE_CONFIG }}" > ~/.kube/config
chmod 600 ~/.kube/config
- name: Проверить доступность кластера
run: |
echo "🔍 Проверка подключения к Kubernetes..."
kubectl get nodes
kubectl get ns
- name: Применить манифесты
run: |
echo "📦 Применение GitVerse Hello Deployment..."
kubectl apply -f ./distribution/k8s-manifest/gitverse-hello-deployment.yaml --force
echo "🌐 Применение Ingress..."
kubectl apply -f ./distribution/k8s-manifest/ingress-deployment.yaml --force
- name: Проверить доступность сервиса
run: |
echo "⏳ Ожидание запуска подов..."
sleep 15
echo "🔍 Проверка работы через Ingress..."
curl -f http://${{ secrets.KUBE_INGRESS_IP }} || exit 1
- name: Удалить манифесты
if: always()
run: |
echo "🛑 Удаление deployment и ingress..."
kubectl delete -f ./distribution/k8s-manifest/gitverse-hello-deployment.yaml --grace-period=5 || true
kubectl delete -f ./distribution/k8s-manifest/ingress-deployment.yaml --grace-period=5 || trueОписание шагов workflow
1. Клонирование репозитория.
- используется стандартный action
actions/checkout@v4для получения исходного кода проекта.
2. Установка зависимостей.
- выполняется скрипт
./distribution/dependencies/install_k8s_dependencies.shдля установки kubectl и других необходимых утилит; - этот шаг гарантирует наличие всех требуемых инструментов для работы с kubernetes.
3. Настройка kubeconfig.
- создается директория
~/.kubeдля хранения конфигурации; - конфигурация kubernetes извлекается из секрета
KUBE_CONFIGи записывается в файл; - устанавливаются права доступа 600 для защиты конфигурационного файла.
4. Проверка доступности кластера.
- команды
kubectl get nodesиkubectl get nsпроверяют подключение к кластеру; - это позволяет убедиться, что все настроено корректно перед применением манифестов.
5. Применение манифестов.
- сначала применяется манифест deployment:
gitverse-hello-deployment.yaml; - затем применяется манифест ingress:
ingress-deployment.yaml; - используется флаг
--forceдля принудительного обновления ресурсов.
6. Проверка доступности сервиса.
- ожидание 15 секунд для завершения разворачивания подов;
- проверка доступности приложения через ingress с использованием curl;
- если проверка не пройдена, workflow завершается ошибкой.
7. Удаление манифестов.
- при любом результате выполнения (успешно или с ошибкой) происходит очистка ресурсов;
- удаляются deployment и ingress с grace period 5 секунд;
- используется
|| trueдля предотвращения ошибок при удалении, если ресурсы уже удалены.