Как выкатить сервис в 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 управляются сторонними средствами