9.4 KiB
		
	
	
	
	
			
		
		
	
	| title | description | published | date | tags | editor | dateCreated | 
|---|---|---|---|---|---|---|
| 03-video-spec | true | 2023-11-09T14:12:51.136Z | helm | markdown | 2023-11-09T10:06:13.204Z | 
Видео три
Файлы для лабы: 03-video-spec.zip
Продолжаем создавать свой чарт для приложения.
Раздел 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 завершена.
