Перейти к основному содержанию
Только для версии чарта 2.xВозможность additionalManifests доступна только в Helm-чарте v2.x, построенном на подчартах.
Параметр additionalManifests позволяет развертывать произвольные объекты Kubernetes вместе с чартом ClickStack. Используйте его для ресурсов, для которых в чарте нет встроенных шаблонов, например NetworkPolicy, HorizontalPodAutoscaler, ServiceAccount, PodMonitor, пользовательских объектов Входной шлюз и любых других объектов Kubernetes API.

Как это работает

Каждый элемент в additionalManifests — это полное описание ресурса Kubernetes. Чарт:
  1. Перебирает каждый элемент в списке
  2. Преобразует элемент в YAML (toYaml)
  3. Вычисляет шаблонные выражения в этом YAML с помощью Helm tpl
Шаблонные выражения могут ссылаться на:
  • .Release.Name, .Release.Namespace
  • include "clickstack.fullname" . и другие вспомогательные функции чарта
  • .Values.*
additionalManifests:
  - apiVersion: v1
    kind: ConfigMap
    metadata:
      name: '{{ include "clickstack.fullname" . }}-custom'
    data:
      release: '{{ .Release.Name }}'

Ограничения файла значений

additionalManifests настраивается в файле значений, а файлы значений разбираются как YAML до выполнения tpl.
  • Любые {{ ... }} в файле значений должны находиться внутри строки в кавычках
  • Структурные блоки шаблона не являются допустимым YAML в файле значений (например, {{- include ... | nindent ... }} сам по себе)
  • Для нестроковых полей (например, числовых портов) используйте литеральные значения или именованные порты
  • Если вам нужна структурная шаблонизация, используйте шаблон обёрточного чарта вместо обычного файла значений
# Допустимо в values.yaml
name: '{{ include "clickstack.fullname" . }}-app'

# Недопустимо в values.yaml (выражение Template без кавычек)
name: {{ include "clickstack.fullname" . }}-app

# Недопустимо в values.yaml (структурный блок Template)
labels:
  {{- include "clickstack.labels" . | nindent 2 }}

Доступные вспомогательные функции чарта

Эти вспомогательные функции определены в templates/_helpers.tpl:
Вспомогательная функцияОписаниеИспользование в файле значений
clickstack.nameИмя чарта (усечено до 63 символов)Безопасно использовать в скалярах в кавычках
clickstack.fullnameИмя с учётом имени релизаБезопасно использовать в скалярах в кавычках
clickstack.chartИмя чарта + версияБезопасно использовать в скалярах в кавычках
clickstack.selectorLabelsБлок меток селектораТолько для шаблонов обёрточного чарта
clickstack.labelsСтандартный блок метокТолько для шаблонов обёрточного чарта
clickstack.mongodb.fullnameИмя CR MongoDBБезопасно использовать в скалярах в кавычках
clickstack.clickhouse.fullnameИмя CR ClickHouseБезопасно использовать в скалярах в кавычках
clickstack.otel.fullnameИмя OTel collectorБезопасно использовать в скалярах в кавычках

Примеры

ServiceAccount

additionalManifests:
  - apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: '{{ include "clickstack.fullname" . }}'
      namespace: '{{ .Release.Namespace }}'
      labels:
        app.kubernetes.io/name: '{{ include "clickstack.name" . }}'
        app.kubernetes.io/instance: '{{ .Release.Name }}'
      annotations:
        eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/my-role"

NetworkPolicy

Ограничьте входящий трафик для подов HyperDX:
additionalManifests:
  - apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: '{{ include "clickstack.fullname" . }}-allow-ingress'
    spec:
      podSelector:
        matchLabels:
          app.kubernetes.io/name: '{{ include "clickstack.name" . }}'
          app.kubernetes.io/instance: '{{ .Release.Name }}'
      policyTypes:
        - Ingress
      ingress:
        - from:
            - namespaceSelector:
                matchLabels:
                  kubernetes.io/metadata.name: ingress-nginx
          ports:
            - protocol: TCP
              port: 3000
            - protocol: TCP
              port: 8000

HorizontalPodAutoscaler

additionalManifests:
  - apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: '{{ include "clickstack.fullname" . }}-hpa'
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: '{{ include "clickstack.fullname" . }}-app'
      minReplicas: 2
      maxReplicas: 10
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 75

PodMonitor (Prometheus Operator)

additionalManifests:
  - apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      name: '{{ include "clickstack.fullname" . }}'
      labels:
        release: prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: '{{ include "clickstack.name" . }}'
          app.kubernetes.io/instance: '{{ .Release.Name }}'
      podMetricsEndpoints:
        - port: app
          interval: 30s

Входной шлюз AWS ALB

При использовании AWS Load Balancer Controller отключите встроенный в чарт входной шлюз nginx и определите пользовательский входной шлюз ALB:
hyperdx:
  ingress:
    enabled: false

additionalManifests:
  - apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: '{{ include "clickstack.fullname" . }}-alb'
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/target-type: ip
        alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:us-east-1:123456789:certificate/abc-123"
        alb.ingress.kubernetes.io/listen-ports: '[{\"HTTPS\":443}]'
        alb.ingress.kubernetes.io/ssl-redirect: "443"
        alb.ingress.kubernetes.io/group.name: clickstack
        alb.ingress.kubernetes.io/healthcheck-path: /api/health
    spec:
      ingressClassName: alb
      rules:
        - host: clickstack.example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: '{{ include "clickstack.fullname" . }}-app'
                    port:
                      name: app
Полный пример настройки ALB, включая входной шлюз для внутреннего OTel collector и HPA, см. в примере значений ALB.

TargetGroupBinding

Для сценариев с ALB, в которых требуются явные ресурсы TargetGroupBinding:
additionalManifests:
  - apiVersion: elbv2.k8s.aws/v1beta1
    kind: TargetGroupBinding
    metadata:
      name: '{{ include "clickstack.fullname" . }}-tgb'
    spec:
      serviceRef:
        name: '{{ include "clickstack.fullname" . }}-app'
        port: app
      targetGroupARN: "arn:aws:elasticloadbalancing:us-east-1:123456789:targetgroup/my-tg/abc123"
      targetType: ip

Дополнительно: шаблоны обёрточного чарта

Если вам нужны структурные вспомогательные конструкции, такие как include "clickstack.labels" . | nindent 4, рендерьте их через шаблон обёрточного чарта (templates/*.yaml), а не размещайте такие блоки напрямую в файлах значений. Пример фрагмента шаблона обёрточного чарта:
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ include "clickstack.fullname" . }}-extra
  labels:
    {{- include "clickstack.labels" . | nindent 4 }}
data:
  appPort: "{{ .Values.hyperdx.ports.app }}"

Советы

Хуки Helm

Каждая запись additionalManifests обрабатывается как отдельный YAML-документ. Вы можете добавить аннотации hook Helm, чтобы управлять порядком установки и обновления:
additionalManifests:
  - apiVersion: batch/v1
    kind: Job
    metadata:
      name: post-install-job
      annotations:
        helm.sh/hook: post-install
        helm.sh/hook-delete-policy: hook-succeeded
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: migrate
              image: my-migration-image:latest
              command: ["./migrate.sh"]

Порядок CRD

Если ваши дополнительные манифесты включают пользовательские ресурсы (например, PodMonitor), CRD должны уже существовать в кластере до установки или обновления.

Объединение нескольких ресурсов

additionalManifests — это список. Элементы обрабатываются по порядку, и каждый из них становится отдельным YAML-документом.

Следующие шаги

Последнее изменение 10 июня 2026 г.