Перейти к содержанию

Как выкатить сервис в Kubernetes

Подробные примеры values.yaml и .gitlab-ci.yml вынесены в FAQ.


1. Требуемое состояние репозитория

  • Репозиторий с приложением
  • Рабочая сборка и Dockerfile для неё

2. Добавьте .helm/Chart.yaml

Создайте директорию .helm/ и файл Chart.yaml:

apiVersion: v2
name: my-service
version: 1.0.0
dependencies:
  - name: universal-chart
    repository: oci://cr.yandex/crp3ccidau046kdj8g9q/charts
    version: 0.1.7

Затем обновите зависимости:

# Авторизация в helm registry
echo $HELM_REGISTRY_KEY | base64 -d | helm registry login cr.yandex --username json_key --password-stdin

# Обновление зависимостей
helm dependency update .helm

3. Создайте .helm/values.yaml

Минимальный пример

universal-chart:
  global:
    env: stage

  services:
    main:
      enabled: true

      deployment:
        enabled: true
        name:
          _default: my-service
        port:
          _default: 8080
        replicaCount:
          _default: 1
          stage: 1
          preprod: 2
          production: 3
        resources:
          requests:
            memory:
              _default: "256Mi"
            cpu:
              _default: "200m"

      image:
        name:
          _default: cr.yandex/crp3ccidau046kdj8g9q/my-service
        pullPolicy:
          _default: IfNotPresent

      service:
        enabled: true
        port:
          _default: 8080
        targetPort:
          _default: 8080

      imagePullSecrets:
        enabled:
          _default: false
        name:
          _default: dockerhub

      envs: []
      secretEnvs: []
      volumes:
        _default: []

      commitSha: ""
      gitlabUri: ""
      gitlabJobUrl: ""
      owner: "my-team"

Примечания

  • global.env выбирает значения из карт _default|stage|preprod|production
  • VirtualService оформляется по заявке
  • Секреты и ConfigMap создаются внешними средствами

4. Несколько сервисов в одном репозитории

universal-chart:
  global:
    env: stage

  services:
    backend:
      enabled: true

      deployment:
        enabled: true
        name:
          _default: my-service
        port:
          _default: 8080
        replicaCount:
          _default: 1
          stage: 1
          preprod: 2
          production: 3
        resources:
          requests:
            memory:
              _default: "256Mi"
            cpu:
              _default: "200m"

      image:
        name:
          _default: cr.yandex/crp3ccidau046kdj8g9q/my-service
        pullPolicy:
          _default: IfNotPresent

      service:
        enabled: true
        port:
          _default: 8080
        targetPort:
          _default: 8080

      imagePullSecrets:
        enabled:
          _default: false
        name:
          _default: dockerhub

      envs: []
      secretEnvs: []
      volumes:
        _default: []

      commitSha: ""
      gitlabUri: ""
      gitlabJobUrl: ""
      owner: "my-team"

    main:
      enabled: true

      deployment:
        enabled: true
        name:
          _default: my-service
        port:
          _default: 80
        replicaCount:
          _default: 1
          stage: 1
          preprod: 2
          production: 3
        resources:
          requests:
            memory:
              _default: "256Mi"
            cpu:
              _default: "200m"

      image:
        name:
          _default: cr.yandex/crp3ccidau046kdj8g9q/my-service
        pullPolicy:
          _default: IfNotPresent

      service:
        enabled: true
        port:
          _default: 80
        targetPort:
          _default: 80

      imagePullSecrets:
        enabled:
          _default: false
        name:
          _default: dockerhub

      envs: []
      secretEnvs: []
      volumes:
        _default: []

      commitSha: ""
      gitlabUri: ""
      gitlabJobUrl: ""
      owner: "my-team" 

5. Переменные окружения

Простые переменные (envs)

envs:
  - name: DEBUG
    value:
      _default: "false"
      stage: "true"
  - name: DATABASE_POOL_SIZE
    value:
      _default: "10"
      production: "20"

Секретные переменные (secretEnvs)

secretEnvs:
  - name: DB_PASSWORD
    secretName:
      _default: ya-pg-secret
    secretKey: password
  - name: API_KEY
    secretName:
      _default: api-secret
    secretKey: key

Volumes — монтирование ConfigMap/Secret

volumes:
  _default:
    - name: config
      mountPath:
        _default: /etc/app/config
      readOnly:
        _default: true
      configMap:
        name:
          _default: app-config
        items:
          - key: config.yaml
            path:
              _default: config.yaml

6. Проверка что всё сделано корректно

helm template my-release .helm -f .helm/values.yaml --set universal-chart.global.env=stage

Убедитесь, что получились корректные манифесты для Deployment и Service.


7. Создайте .gitlab-ci.yml

include:
  - project: 'generic/common-ci'
    file: '/common-security-scan.yaml'
  - project: 'generic/common-ci'
    file: '/universal-pipeline.yaml'
    ref: apps-business

variables:
  SERVICE_NAME: my-service
  DOCKERFILE_PATH: ./Dockerfile
  BUILD_ARGS: ""
  CI_TRIGGER_SOURCE: app

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

    - if: '$CI_COMMIT_BRANCH == "stage"'
      variables:
        STAND: stage
        NAMESPACE: my-service-stage
        RELEASE_NAME: ${SERVICE_NAME}
        CHART_NAME: ${SERVICE_NAME}
        CHART_VERSION: "0.0.1-stage"
        K8S_HUSTLER_BRANCH: universal-chart-stage
        HELM_SET_ARGS: >-
          --set universal-chart.services.main.image.name.stage=${IMAGE_NAME}
          --set universal-chart.global.env=stage
          --set universal-chart.services.main.commitSha=${CI_COMMIT_SHA}
          --set universal-chart.services.main.gitlabUri=${CI_PROJECT_URL}
          --set universal-chart.services.main.gitlabJobUrl=${CI_JOB_URL}
          --set universal-chart.services.main.owner=${CI_PROJECT_NAMESPACE}

    - if: '$CI_COMMIT_BRANCH == "master"'
      variables:
        STAND: preprod
        NAMESPACE: my-service-preprod
        RELEASE_NAME: ${SERVICE_NAME}
        CHART_NAME: ${SERVICE_NAME}
        CHART_VERSION: "0.0.1-preprod"
        K8S_HUSTLER_BRANCH: universal-chart-preprod
        HELM_SET_ARGS: >-
          --set universal-chart.services.main.image.name.preprod=${IMAGE_NAME}
          --set universal-chart.global.env=preprod
          --set universal-chart.services.main.commitSha=${CI_COMMIT_SHA}
          --set universal-chart.services.main.gitlabUri=${CI_PROJECT_URL}
          --set universal-chart.services.main.gitlabJobUrl=${CI_JOB_URL}
          --set universal-chart.services.main.owner=${CI_PROJECT_NAMESPACE}

    - if: '$CI_COMMIT_TAG'
      variables:
        STAND: production
        NAMESPACE: my-service-prod
        RELEASE_NAME: ${SERVICE_NAME}
        CHART_NAME: ${SERVICE_NAME}
        CHART_VERSION: "0.0.1-prod"
        K8S_HUSTLER_BRANCH: universal-chart-production
        HELM_SET_ARGS: >-
          --set universal-chart.services.main.image.name.production=${IMAGE_NAME}
          --set universal-chart.global.env=production
          --set universal-chart.services.main.commitSha=${CI_COMMIT_SHA}
          --set universal-chart.services.main.gitlabUri=${CI_PROJECT_URL}
          --set universal-chart.services.main.gitlabJobUrl=${CI_JOB_URL}
          --set universal-chart.services.main.owner=${CI_PROJECT_NAMESPACE}
    - when: never

8. Виртуальный сервис (маршрутизация)

  • Для настройки входящего трафика оформите заявку

9. Полезное

  • Детальные примеры values.yaml и .gitlab-ci.yml — в FAQ
  • Актуальная версия Universal chart : 0.1.7
  • Секреты и ConfigMap управляются сторонними средствами