Π”Π΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ рассмотрСн Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² 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 для прСдотвращСния ошибок ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ, Ссли рСсурсы ΡƒΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹.

Π’Ρ‹ нашли Ρ‡Ρ‚ΠΎ искали?