User Tools

Site Tools


универсальный_helm-чарт

This is an old revision of the document!


Helm - от основ до универсального чарта

Реклама

  • Нас ждет еще один, воспроизводимый в домашних условиях вебинар, на котором мы освоим “магический” синтаксис шаблонизатора из языка программирования Golang, который лежит в основе самого современного способа развертывания программного обеспечения - Kubernetes + Helm Charts + ArgoCD

Техническое задание

  • Освоить синтаксис написания Helm чартов
  • Написать универсальный чарт для развёртывание множества приложений
  • Установить ArgoCD и провести развертывание приложений в Kubernetes

Запись вебинара

  • Тэги: Kubernetes, Helm, ArgoCD

Шаг 1. Что у нас есть, для начала

Шаг 2. Разворачиваем первое приложение через манифесты

Шаг 3. Последовательно изучаем синтаксис Helm, решая возникающие задачи

kube1:~/webd-k8s# mkdir -p uni-webd-chart/templates/

mv -v my-webd-deployment.yaml uni-webd-chart/templates/
mv -v my-webd-service.yaml uni-webd-chart/templates/
  • Проверка, генерация манифеста и установка приложения
...
kube1:~/webd-k8s# helm upgrade -i my-gowebd uni-webd-chart/ -n my-ns --create-namespace
  • Подстановка переменных в .Values в шаблон (image.repository, image.tag, replicaCount), замена gowebd на httpd
  • Использование функции default (replicaCount и image.tag)
  • Деплой в один NS двух приложений и ипользование .Release.Name в назании объектов (Deployment, Service) и меток (можно показать отдельно)
kube1:~/webd-k8s# helm upgrade -i my-htwebd uni-webd-chart/ -n my-ns --create-namespace
  • Оператор if, функции hasKey, использование знака “-” (targetPort) для приложения pywebd
kube1:~/webd-k8s# helm upgrade -i my-pywebd uni-webd-chart/ -n my-ns --create-namespace
  • Включение через enabled, цикл range (host в ingress example) и знак “$” (.Release.Name)
kube1:~/webd-k8s# curl http://pywebd.corpX.un
  • Добавляем tls, общий env.yaml, [], tpl, quote
  • Добавляем Сertificate через cert-manager, все похоже на Ingress
  • Меняем запись А в DNS для приложения pywebd:ver1.1, функции eq, and (Service targetPort, loadBalancerIP) тестируем без Ingress и Сertificate
  • Функции toYaml, nindent, оператор with (env, volumes, volumeMounts в Deployment и ConfigMap, Secret для pywebd:ver1.2)

Итоговый чарт

kube1:~/webd-k8s# cat uni-webd-chart/Chart.yaml
apiVersion: v2
name: webd-chart
version: 0.1.0
kube1:~/webd-k8s# cat uni-webd-chart/values.yaml
#hostname: webd

#replicaCount: 2
#image:
#  repository: gitlab.corpX.un:5000/student/webd
#  tag: ver1.1

#env:
#  PYWEBD_DOC_ROOT: /var/www/
#  PYWEBD_PORT: 4443
#  APWEBD_HOSTNAME: "apwebd.corpX.un"
#  KEYCLOAK_HOSTNAME: "keycloak.corpX.un"
#  REALM_NAME: "corpX"

service:
  port: 80
#  targetPort: 4080
#  type: LoadBalancer
#  ip: 192.168.X.65

ingress:
  enabled: false
  className: nginx
  hosts:
    - hostTemplate: "{{ .Values.hostname }}.{{ .Values.domain }}"
    ##- host: webd.corpX.un
    ##- host: corpX.un
  tls: []
#  tls:
#    - secretName: webd-tls
#      hosts:
#        - "{{ .Values.hostname }}.{{ .Values.domain }}"
##        - webd.corpX.un
##        - corpX.un

certificate:
  enabled: false
  secretName: webd-tls
  dnsNames:
    - "{{ .Values.hostname }}.{{ .Values.domain }}"
    ##- webd.corpX.un
    ##- "*.corpX.un"
  issuerRef_name: freeipa-dns-clusterissuer
  issuerRef_kind: ClusterIssuer

volumes: []
#volumes:
#- name: secret-tls-volume
#  secret:
#    secretName: pywebd-tls

volumeMounts: []
#volumeMounts:
#- name: secret-tls-volume
#  subPath: tls.crt
#  mountPath: /etc/pywebd/pywebd.crt
#- name: secret-tls-volume
#  subPath: tls.key
#  mountPath: /etc/pywebd/pywebd.key
kube1:~/webd-k8s# cat uni-webd-chart/templates/my-webd-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-dep
spec:
  selector:
    matchLabels:
      app: {{ .Release.Name }}-lab
  replicas: {{ default 1 .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}-lab
    spec:
      containers:
      - name: my-webd
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}"
        {{- with .Values.env }}
        env:
        {{- range $key, $val := . }}
        - name: {{$key}}
          value: {{$val|quote}}
        {{- end}}
        {{- end}}
        {{- with .Values.volumeMounts }}
        volumeMounts:
        {{- toYaml . | nindent 8 }}
        {{- end }}
      {{- with .Values.volumes }}
      volumes:
      {{- toYaml . | nindent 6 }}
      {{- end }}
kube1:~/webd-k8s# cat uni-webd-chart/templates/my-webd-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-svc
spec:
  selector:
    app: {{ .Release.Name }}-lab
  ports:
  - protocol: TCP
    port: {{ .Values.service.port }}
{{- if hasKey .Values.service "targetPort" }}
    targetPort: {{ .Values.service.targetPort }}
{{- end }}
  type: {{ .Values.service.type | default "ClusterIP" }}
{{- if and (hasKey .Values.service "ip") (eq .Values.service.type "LoadBalancer") }}
  loadBalancerIP: {{ .Values.service.ip }}
{{- end }}
kube1:~/webd-k8s# cat uni-webd-chart/templates/my-ingress.yaml
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Release.Name }}-ingress
spec:
  ingressClassName: {{ .Values.ingress.className }}
  rules:
  {{- range .Values.ingress.hosts }}
  {{- /*  - host: {{ .host }} */}}
  - host: {{ tpl .hostTemplate $ }}
    http:
      paths:
      - backend:
          service:
            name: {{ $.Release.Name }}-svc
            port:
              number: {{ default $.Values.service.port $.Values.service.targetPort}}
        path: /
        pathType: Prefix
  {{- end }}
  {{- if .Values.ingress.tls }}
  tls:
    {{- range .Values.ingress.tls }}
    - hosts:
        {{- range .hosts }}
        - {{ tpl . $ | quote }}
        {{- end }}
      secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
{{- end }}
kube1:~/webd-k8s# cat env.yaml
domain: corpX.un
kube1:~/webd-k8s# cat uni-webd-chart/templates/my-certificate.yaml
{{- if .Values.certificate.enabled -}}
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: {{ .Release.Name }}-cert
spec:
  secretName: {{ .Values.certificate.secretName }}
  dnsNames:
    {{- range .Values.certificate.dnsNames }}
    - {{ tpl . $ | quote }}
    {{- end }}
  issuerRef:
    name: {{ .Values.certificate.issuerRef_name }}
    kind: {{ .Values.certificate.issuerRef_kind }}
{{- end }}

Шаг 4. Используем персональный values файл для каждого приложения

kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/gowebd/values.yaml

kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/pywebd/values.yaml

kube1:~/webd-k8s# vim uni-webd-chart/values.yaml

Комментируем для документации, для демонстрации наследования можно оставить то, что часто используется по умолчанию

kube1:~/webd-k8s# cat apps/gowebd/values.yaml
hostname: gowebd

replicaCount: 2
image:
  repository: gitlab.corpX.un:5000/student/gowebd
  tag: ver1.1

ingress:
  enabled: true
  tls:
    - secretName: gowebd-tls
      hosts:
        - "{{ .Values.hostname }}.{{ .Values.domain }}"

certificate:
  enabled: true
  secretName: gowebd-tls
kube1:~/webd-k8s# helm template my-gowebd uni-webd-chart/ -f apps/gowebd/values.yaml -f env.yaml

kube1:~/webd-k8s# helm upgrade -i my-gowebd uni-webd-chart/ -f env.yaml -f apps/gowebd/values.yaml -n my-ns --create-namespace
kube1:~/webd-k8s# cat apps/pywebd/values.yaml
hostname: pywebd

image:
  repository: gitlab.corpX.un:5000/student/pywebd
  tag: ver1.2

env:
  PYWEBD_DOC_ROOT: /var/www2/
  PYWEBD_PORT: 4443

service:
#  port: 80
  port: 443
  targetPort: 4443
  type: LoadBalancer
  ip: 192.168.X.65

certificate:
  enabled: true
  secretName: pywebd-tls

volumes:
- name: secret-tls-volume
  secret:
    secretName: pywebd-tls

volumeMounts:
- name: secret-tls-volume
  subPath: tls.crt
  mountPath: /etc/pywebd/pywebd.crt
- name: secret-tls-volume
  subPath: tls.key
  mountPath: /etc/pywebd/pywebd.key
kube1:~/webd-k8s# cat apps/apwebd/values.yaml
hostname: apwebd

image:
  repository: gitlab.corpX.un:5000/student/apwebd
  tag: ver1.1

env:
  APWEBD_HOSTNAME: "apwebd.corpX.un"
  KEYCLOAK_HOSTNAME: "keycloak.corpX.un"
  REALM_NAME: "corpX"

ingress:
  enabled: true
  tls:
    - secretName: apwebd-tls
      hosts:
        - "{{ .Values.hostname }}.{{ .Values.domain }}"

certificate:
  enabled: true
  secretName: apwebd-tls

Шаг 5. Используем ArgoCD для развертывания приложений

Одно приложение

kube1:~/webd-k8s# cat argocd/application.yaml

Множество приложений

Подготовка к вебинару

  • Удаляем AppSet ArgoCD
  • Удаляем проект webd-k8s из GitLab
  • gowebd A → ingress
универсальный_helm-чарт.1769402456.txt.gz · Last modified: 2026/01/26 07:40 by val