Деплой в Kubernetes

Info

В этом разделе рассмотрен деплой приложений в Kubernetes с использованием GitVerse CI/CD.

Kubernetes — это мощная платформа для автоматизации развертывания, масштабирования и управления контейнеризованными приложениями.

В рамках GitVerse CI/CD деплой в Kubernetes позволяет автоматизировать процесс развертывания приложений, используя GitVerse-специфичные инструменты и практики.

Пример workflow

Требования

  1. Собранный Docker-образ:

    • ожидается, что образ уже опубликован в реестре;
    • пример: gitverse.ru/actions/gitverse_hello:kaniko_cli;
    • можно собрать через: .gitverse/workflows/docker/cloud-hosted-runner/push-registries.yaml.
  2. Доступ к Kubernetes-кластеру:

    • файл конфигурации (kubeconfig) должен быть доступен как секрет: KUBE_CONFIG;
    • конфиг должен содержать права на apply/delete для deployment и ingress.
  3. Зависимости:

  • скрипт ./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
  1. Манифесты:

    • используются простейшие манифесты без 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 и т.д;

    • подходят для демо и тестов, но не для продакшена.

  2. Ingress:

    • IP-адрес Ingress-контроллера должен быть указан в секрете: KUBE_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 для предотвращения ошибок при удалении, если ресурсы уже удалены.