Compare commits

..

6 Commits

3 changed files with 324 additions and 3 deletions

View File

@ -2,7 +2,7 @@
title: 02-video-app-metadata
description:
published: true
date: 2023-11-08T16:10:25.856Z
date: 2023-11-09T10:02:30.373Z
tags:
editor: markdown
dateCreated: 2023-11-08T10:42:51.395Z
@ -78,6 +78,8 @@ mv ingress.yaml ../../old-templates/ingress-orig.yaml
> **{{/*** - это комментарий
> **define** - присвоение имени. Заканчивается с помощью оператора end. Так же могут быть условия if, else.
> **trunc 63** - обрезает длину имени до 64 знаков
> **trunc 63 | trimSuffix "-"** - допустим значение до будет qwerty-123, то после этой команды останется qwerty
> **nindent 4** - это отступ, который будет сформирован при запуске чарта
{.is-info}
@ -383,8 +385,6 @@ fullnameOverride: "art"
application:
reloader: true
```
```
helm template app ./openresty-art --set "application.reloader=true" --debug > app.yaml
helm template app ./openresty-art -f my-values.yaml > app.yaml

View File

@ -0,0 +1,321 @@
---
title: 03-video-spec
description:
published: true
date: 2023-11-09T10:29:33.228Z
tags: helm
editor: markdown
dateCreated: 2023-11-09T10:06:13.204Z
---
# Видео три
> Файлы для лабы:
[final-version.zip](/attachments/final-version.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)

Binary file not shown.