Файл _helpers.tpl содержит переиспользуемые шаблоны. Это ключ к DRY-подходу — определяем логику один раз, используем везде:
# templates/_helpers.tpl
{{/* Полное имя ресурса (с учётом release name) */}}
{{- define "platformx-service.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/* Стандартные labels по Kubernetes conventions */}}
{{- define "platformx-service.labels" -}}
helm.sh/chart: {{ include "platformx-service.chart" . }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
app.kubernetes.io/part-of: platformx
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{ include "platformx-service.selectorLabels" . }}
{{- end }}
{{/* Selector labels — минимальный набор для matchLabels */}}
{{- define "platformx-service.selectorLabels" -}}
app.kubernetes.io/name: {{ include "platformx-service.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/* ServiceAccount name */}}
{{- define "platformx-service.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "platformx-service.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
Файл values.yaml задаёт значения по умолчанию. Для каждого сервиса мы переопределяем только то, что отличается:
# values.yaml — значения по умолчанию
replicaCount: 2
image:
repository: registry.platformx.ru/services/api-gateway
tag: "latest"
pullPolicy: IfNotPresent
imagePullSecrets:
- name: registry-credentials
service:
type: ClusterIP
port: 80
targetPort: 8080
ingress:
enabled: false
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: api.platformx.ru
paths:
- path: /
pathType: Prefix
tls:
- secretName: api-tls
hosts:
- api.platformx.ru
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
targetMemoryUtilizationPercentage: 80
health:
enabled: true
livenessPath: /healthz
readinessPath: /readyz
livenessDelay: 15
readinessDelay: 5
env:
LOG_LEVEL: "info"
LOG_FORMAT: "json"
envFromSecret: {}
redis:
enabled: false
serviceAccount:
create: true
name: ""
podDisruptionBudget:
enabled: true
minAvailable: 1
Для конкретного сервиса — например, billing-service — создаётся минимальный файл переопределений:
# services/billing-service/values-prod.yaml
replicaCount: 4
image:
repository: registry.platformx.ru/services/billing-service
tag: "3.12.1"
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 2Gi
autoscaling:
minReplicas: 4
maxReplicas: 20
env:
LOG_LEVEL: "warn"
DB_HOST: "postgres-billing.prod.svc.cluster.local"
KAFKA_BROKERS: "kafka-0:9092,kafka-1:9092,kafka-2:9092"
envFromSecret:
DB_PASSWORD:
secretName: billing-db-credentials
key: password
STRIPE_API_KEY:
secretName: billing-stripe
key: api-key
redis:
enabled: true
architecture: standalone
auth:
password: "" # Из external-secrets
Оставить комментарий