322 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Markdown
		
	
	
| ---
 | ||
| title: 03-video-spec
 | ||
| description: 
 | ||
| published: true
 | ||
| date: 2023-11-09T14:12:57.049Z
 | ||
| tags: helm
 | ||
| editor: markdown
 | ||
| dateCreated: 2023-11-09T10:06:13.204Z
 | ||
| ---
 | ||
| 
 | ||
| # Видео три
 | ||
| 
 | ||
| > Файлы для лабы:
 | ||
| [03-video-spec.zip](/attachments/03-video-spec.zip)
 | ||
| 
 | ||
| Продолжаем создавать свой чарт для приложения. 
 | ||
| 
 | ||
| ## Раздел spec deployment.
 | ||
| 
 | ||
| В values.yaml переносим replicaCount в раздел application и добавим
 | ||
| revisionHistoryLimit
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   reloader: false
 | ||
|   replicaCount: 1
 | ||
|   revisionHistoryLimit: 3
 | ||
| ```
 | ||
| 
 | ||
| В шаблоне deployment.yaml добавляем соответствующие шаблоны.
 | ||
| 
 | ||
| ```yaml
 | ||
| spec:
 | ||
|   replicas: {{ .Values.application.replicaCount }}
 | ||
|   revisionHistoryLimit: {{ .Values.application.revisionHistoryLimit }}
 | ||
| ```
 | ||
| 
 | ||
| За ним изменим раздел selector.matchLabels. Тут просто подставим
 | ||
| готовый именованный шаблон, при помощи которого определяем 
 | ||
| labels селектора подов.
 | ||
| 
 | ||
| Аналогичный шаблон, подставляем в разделе template.metadata.labels. 
 | ||
| 
 | ||
| ```yaml
 | ||
|   selector:
 | ||
|     matchLabels:
 | ||
|       {{- include "openresty-art.selectorLabels" . | nindent 6 }}
 | ||
|   template:
 | ||
|     metadata:
 | ||
|       labels:
 | ||
|         {{- include "openresty-art.selectorLabels" . | nindent 8 }}
 | ||
| ```
 | ||
| 
 | ||
| ### Аннотации пода.
 | ||
| 
 | ||
| Аннотации пода нам могут потребоваться например, для сбора метрик.
 | ||
| Хотя конкретно этот образ openresty такие метрики отдавать не умеет.
 | ||
| Но мы рассмотрим принцип добавления аннотаций.
 | ||
| 
 | ||
| В values.yaml переносим podAnnotations в раздел application. И
 | ||
| Оставляем его значение пустым. Т.е. по умолчанию аннотаций нет.
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   podAnnotations: {}
 | ||
| ```
 | ||
| 
 | ||
| В шаблоне deployment.yaml в template.metadata добавляем шаблон.
 | ||
| 
 | ||
| ```yaml
 | ||
| template:
 | ||
|     metadata:
 | ||
|       {{- with .Values.application.podAnnotations }}
 | ||
|       annotations:
 | ||
|         {{- toYaml . | nindent 8 }}
 | ||
|       {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| В этом шаблоне мы применяем структуру управления with, которая
 | ||
| устанавливает область видимости переменных.
 | ||
| 
 | ||
| Когда мы пишем путь к переменным, мы его обычно начинаем с 
 | ||
| символа точка (вершина пространства имён). Например: 
 | ||
| _.Values.application.podAnnotations_. Если предполагается, 
 | ||
| что в указанном узле много переменных, то можно "переместить" 
 | ||
| точку в конец podAnnotations.
 | ||
| 
 | ||
| Затем при помощи toYaml перенесём все как есть в итоговый
 | ||
| манифест. Т.е. не будем разрешать остальные переменные и их 
 | ||
| значения. Просто скопируем.
 | ||
| 
 | ||
| Предполагается, что my-values.yaml мы будем явно описывать 
 | ||
| аннотации. Например, вот так:
 | ||
| 
 | ||
| ```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
 | ||
| 
 | ||
| ```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.
 | ||
| По умолчанию, массив пустой.
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   imagePullSecrets: []
 | ||
| ```
 | ||
| 
 | ||
| В шаблоне deployment.yaml добавим следующую конструкцию.
 | ||
| 
 | ||
| ```yaml
 | ||
|     spec:
 | ||
|       {{- with .Values.application.imagePullSecrets }}
 | ||
|       imagePullSecrets:
 | ||
|         {{- toYaml . | nindent 8 }}
 | ||
|       {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| При помощи with меняем область видимости. И при помощи toYaml
 | ||
| преобразуем все что там есть в yaml. По умолчанию у нас там 
 | ||
| пустой массив. Поэтому в итоговый манифест не подставиться.
 | ||
| 
 | ||
| Но если в my-values.yaml мы добавим указание имени сикрета,
 | ||
| то секция будет сформирована.
 | ||
| 
 | ||
| ```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
 | ||
| 
 | ||
| ```yaml
 | ||
|     spec:
 | ||
|       imagePullSecrets:
 | ||
|         - name: pullSecretName
 | ||
| ```
 | ||
| 
 | ||
| Удалим imagePullSecrets из my-values.yaml, поскольку мы 
 | ||
| предполагаем использование публичного docker registry.
 | ||
| 
 | ||
| ### Container
 | ||
| 
 | ||
| В первую очередь определим: name, image и imagePullPolicy.
 | ||
| 
 | ||
| В values.yaml добавим в раздел application значения по
 | ||
| умолчанию:
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   image:
 | ||
|     repository: openresty/openresty
 | ||
|     tag: "centos-rpm"
 | ||
|     pullPolicy: IfNotPresent
 | ||
| ```
 | ||
| 
 | ||
| В deployment.yaml добавим соответствующие шаблоны.
 | ||
| 
 | ||
| ```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 добавим следующие
 | ||
| строки:
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   probe:
 | ||
|     readinessProbe:
 | ||
|       httpGet:
 | ||
|         path: /
 | ||
|         port: http
 | ||
|     livenessProbe:
 | ||
|       httpGet:
 | ||
|         path: /
 | ||
|         port: http
 | ||
| ```
 | ||
| 
 | ||
| В deployment.yaml вместо определения проб:
 | ||
| 
 | ||
| ```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 добавим немного изменённое определение проб.
 | ||
| 
 | ||
| ```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.
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   resources: {}
 | ||
| ```
 | ||
| 
 | ||
| По умолчанию у нас нет ограничений.
 | ||
| 
 | ||
| В файле deployment.yaml добавим соответствующий шаблон.
 | ||
| 
 | ||
| ```yaml
 | ||
|       containers:
 | ||
|         - name: {{ .Chart.Name }}
 | ||
|           {{- with .Values.application.resources }}
 | ||
|           resources:
 | ||
|             {{- toYaml . | nindent 10 }}
 | ||
|           {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| Проверим, что по умолчанию ресурсы не добавляются в манифест.
 | ||
| 
 | ||
|     helm template app ./openresty-art > app.yaml
 | ||
| 
 | ||
| Добавим в файл my-values.yaml определение ресурсов:
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   resources:
 | ||
|     limits:
 | ||
|       cpu: "0.2"
 | ||
|       memory: "400Mi"
 | ||
|     requests:
 | ||
|       cpu: "0.1"
 | ||
|       memory: "200Mi"
 | ||
| ```
 | ||
| 
 | ||
| Проверим, что ресурсы корректно подставляются.
 | ||
| 
 | ||
| На этом подготовка шаблона deployment.yaml завершена.
 | ||
| 
 | ||
| ## Видео
 | ||
| 
 | ||
| [<img src="https://img.youtube.com/vi/OWJYAhMuyJg/maxresdefault.jpg" width="50%">](https://youtu.be/OWJYAhMuyJg)
 |