wiki-js/DevOps/Helm/Learn-by-Krukov/03-video-spec.md

322 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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)