Это старая версия документа!
Helm - менеджер пакетов для k8s. Позволяет обернуть приложения в пакеты и работать с ними
Charts - собсна пакеты, включают в себя все что нужно приложению для запуска в k8s. Позволяет работать с приложением как с цельным пакетом а не набором отдельных манифестов
Есть функционал для добавления логики после подготовки манифестов но перед применением
По сути сводится к баш скрипту, через который прогоняется текстовый поток всех манифестов, в нем с-но можно делать правки
Вызывается параметр в команде запуска хельма
helm install my-chart ./mychart --post-renderer ./post-render.sh
Зависимости можно описать в «Chart.yaml» или «requirements.yaml», указав название, версию, репозиторий нужных чартов. Тогда хельм будет автоматически их все тянуть
Для работы с ними есть команды «helm dependency [list, update, build]«
Есть стандартный порядок, можно им управлять с помощью хуков
Задается аннотацией прямо в манифесте, так же у хуков есть «вес», в рамках одного и того же шага
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: ... annotations: "helm.sh/hook": pre-install "helm.sh/hook-weight": "-2"
Чарт - предварительно настроенный шаблон ресурсов
Релиз - чарт, развернутый с помощью Helm в k8s
helm install <release name> <chart name> # Тест итогового манифеста helm install --dry-run test-release ./helm-chart # Переопределение параметров при запуске (можно указать файлом) helm install -n kubectl-ns --set certificateSecretStore.enabled=false my-app ./helm-chart helm install -n kubectl-ns -f ./my-app-values.yaml my-app ./helm-chart
# Просто переменная metadata: name: {{ .Release.Name }}-certificate-secret-store --- # Вставляем шаблон "helm-chart.labels" и передаем вывод через шаблонную ф-ю "nident" # в данном случае она добавляет пробелы (4шт) metadata: labels: {{- include "helm-chart.labels" . | nindent 4 }} --- #
Есть ф-я «toYaml», пока неясно как но видимо в чем то помогает
spec: ... template: ... spec: containers: - name: {{ .Release.Name }}-app image: {{ .Values.deployment.image }} ports: - name: {{ .Values.clusterip.targetPort }} containerPort: {{ .Values.deployment.containerPort }} resources: {{- toYaml .Values.deployment.resources | nindent 10 }} {{- if .Values.lockboxSecretStore.enabled }} env: {{- range .Values.lockboxSecretStore.externalSecret.data }} - name: {{ .secretKey }} valueFrom: secretKeyRef: name: {{ $.Release.Name }}-lockbox-secret key: {{ .secretKey }} {{- end }} {{- end }}
values.yaml в данном случае такой
clusterip: port: 80 targetPort: http deployment: replicaCount: 1 image: "" containerPort: 8080 resources: requests: cpu: "150m" memory: "400Mi" limits: cpu: "250m" memory: "600Mi"
Включение/Отключение частей кода с помощью переменных
Объявляем нужные переменные в «values.yaml», значение по умолчанию «true»
lockboxSecretStore: enabled: true certificateSecretStore: enabled: true
Затем в манифесте проверка переменных, ветвление
{{- if .Values.certificateSecretStore.enabled -}} apiVersion: external-secrets.io/v1beta1 kind: SecretStore ... {{- end }}
При запуске, переменную можно переопределить
helm install --dry-run --set certificateSecretStore.enabled=false test-release ./helm-chart
Для циклов используется оператор «range»
lockboxSecretStore: enabled: true externalSecret: secretId: "" data: - secretKey: JDBC_URL property: JDBC_URL - secretKey: DB_USERNAME property: DB_USERNAME - secretKey: DB_PASSWORD property: DB_PASSWORD
spec: ... data: {{- range .Values.lockboxSecretStore.externalSecret.data }} - secretKey: {{ .secretKey }} remoteRef: key: {{ $.Values.lockboxSecretStore.externalSecret.secretId }} property: {{ .property }} {{- end }}
Знак $ - операторы «range» и «with» создают свою область видимости (точка указывает на текущую область). Чтобы получить значения из «values.yaml» нужно задать корневую область видимости, что и делает этот параметр