Видео три. Основы Helm

Продолжаем создавать свой чарт для приложения.

Раздел spec deployment.

В values.yaml переносим replicaCount в раздел application и добавим revisionHistoryLimit

application:
  reloader: false
  replicaCount: 1
  revisionHistoryLimit: 3

В шаблоне deployment.yaml добавляем соответствующие шаблоны.

spec:
  replicas: {{ .Values.application.replicaCount }}
  revisionHistoryLimit: {{ .Values.application.revisionHistoryLimit }}

За ним изменим раздел selector.matchLabels. Тут просто подставим готовый именованный шаблон, при помощи которого определяем labels селектора подов.

Аналогичный шаблон, подставляем в разделе template.metadata.labels.

  selector:
    matchLabels:
      {{- include "openresty-art.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "openresty-art.selectorLabels" . | nindent 8 }}

Аннотации пода.

Аннотации пода нам могут потребоваться например, для сбора метрик. Хотя конкретно этот образ openresty такие метрики отдавать не умеет. Но мы рассмотрим принцип добавления аннотаций.

В values.yaml переносим podAnnotations в раздел application. И Оставляем его значение пустым. Т.е. по умолчанию аннотаций нет.

application:
  podAnnotations: {}

В шаблоне deployment.yaml в template.metadata добавляем шаблон.

template:
    metadata:
      {{- with .Values.application.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

В этом шаблоне мы применяем структуру управления with, которая устанавливает область видимости переменных.

Когда мы пишем путь к переменным, мы его обычно начинаем с символа точка (вершина пространства имён). Например: .Values.application.podAnnotations. Если предполагается, что в указанном узле много переменных, то можно "переместить" точку в конец podAnnotations.

Затем при помощи toYaml перенесём все как есть в итоговый манифест. Т.е. не будем разрешать остальные переменные и их значения. Просто скопируем.

Предполагается, что my-values.yaml мы будем явно описывать аннотации. Например, вот так:

application:
  podAnnotations:
    prometheus.io/scrape: "true"
    prometheus.io/path: "/metrics"
    prometheus.io/port: "80"

Посмотрим, что получилось.

helm template app ./openresty-art -f my-values.yaml > app.yaml
spec:
  replicas: 1
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: openresty-art
      app.kubernetes.io/instance: app
  template:
    metadata:
      labels:
        app.kubernetes.io/name: openresty-art
        app.kubernetes.io/instance: app
      annotations:
        prometheus.io/path: /metrics
        prometheus.io/port: "80"
        prometheus.io/scrape: "true"

Спецификация контейнера.

Займёмся spec.template.spec.containers.

imagePullSecrets

На всякий случай добавим возможность указать imagePullSecrets.

В values.yaml переносим в раздел application imagePullSecrets. По умолчанию, массив пустой.

application:
  imagePullSecrets: []

В шаблоне deployment.yaml добавим следующую конструкцию.

    spec:
      {{- with .Values.application.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}

При помощи with меняем область видимости. И при помощи toYaml преобразуем все что там есть в yaml. По умолчанию у нас там пустой массив. Поэтому в итоговый манифест не подставиться.

Но если в my-values.yaml мы добавим указание имени сикрета, то секция будет сформирована.

application:
  reloader: true
  podAnnotations:
    prometheus.io/scrape: "true"
    prometheus.io/path: "/metrics"
    prometheus.io/port: "80"
  imagePullSecrets:
    - name: pullSecretName

Проверим, что получилось.

helm template app ./openresty-art -f my-values.yaml > app.yaml
    spec:
      imagePullSecrets:
        - name: pullSecretName

Удалим imagePullSecrets из my-values.yaml, поскольку мы предполагаем использование публичного docker registry.

Container

В первую очередь определим: name, image и imagePullPolicy.

В values.yaml добавим в раздел application значения по умолчанию:

application:
  image:
    repository: openresty/openresty
    tag: "centos-rpm"
    pullPolicy: IfNotPresent

В deployment.yaml добавим соответствующие шаблоны.

      containers:
        - name: {{ include "openresty-art.fullname" . }}
          image: "{{ .Values.application.image.repository }}:{{ .Values.application.image.tag | default "centos-rpm" }}"
          imagePullPolicy: {{ .Values.application.image.pullPolicy }}

Из интересного тут только установка значения по умолчанию в шаблоне {{ .Values.application.image.tag | default "centos-rpm" }}

Если tag не определен, будет подставлено значение "centos-rpm".

Проконтролируем правильность создания шаблона.

 helm template app ./openresty-art -f my-values.yaml > app.yaml

Пробы

В созданном helm create шаблоне пробы не обёрнуты в шаблон. Это не хорошо. Мы должны дать возможность администратору, устанавливающему наш чарт управлять пробами.

Поэтому в values.yaml, раздел application добавим следующие строки:

application:
  probe:
    readinessProbe:
      httpGet:
        path: /
        port: http
    livenessProbe:
      httpGet:
        path: /
        port: http

В deployment.yaml вместо определения проб:

      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.application.image.repository }}:{{ .Values.application.image.tag | default "centos-rpm" }}"
          imagePullPolicy: {{ .Values.application.image.pullPolicy }}
          ports:
            - containerPort: 80
              name: http
          {{- with .Values.application.probe }}
          {{- toYaml . | nindent 10 }}
          {{- end }}

В my-values.yaml добавим немного изменённое определение проб.

  probe:
    readinessProbe:
      httpGet:
        path: /index.html
        port: http
      initialDelaySeconds: 5
      periodSeconds: 15
    livenessProbe:
      httpGet:
        path: /index.html
        port: http
      initialDelaySeconds: 5
      periodSeconds: 15
      timeoutSeconds: 5

Проконтролируем правильность генерации проб.

helm template app ./openresty-art -f my-values.yaml > app.yaml

Ресурсы

В файле values.yaml переносим resources в раздел application.

application:
  resources: {}

По умолчанию у нас нет ограничений.

В файле deployment.yaml добавим соответствующий шаблон.

      containers:
        - name: {{ .Chart.Name }}
          {{- with .Values.application.resources }}
          resources:
            {{- toYaml . | nindent 10 }}
          {{- end }}

Проверим, что по умолчанию ресурсы не добавляются в манифест.

helm template app ./openresty-art > app.yaml

Добавим в файл my-values.yaml определение ресурсов:

application:
  resources:
    limits:
      cpu: "0.2"
      memory: "400Mi"
    requests:
      cpu: "0.1"
      memory: "200Mi"

Проверим, что ресурсы корректно подставляются.

На этом подготовка шаблона deployment.yaml завершена.