407 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			407 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Markdown
		
	
	
| ---
 | ||
| title: 02-video-app-metadata
 | ||
| description: 
 | ||
| published: true
 | ||
| date: 2023-11-09T10:02:36.449Z
 | ||
| tags: 
 | ||
| editor: markdown
 | ||
| dateCreated: 2023-11-08T10:42:51.395Z
 | ||
| ---
 | ||
| 
 | ||
| # Видео два. Создание чарта и metadata.
 | ||
| 
 | ||
| > Файлы для лабы:
 | ||
| [02-video-app-metadata.zip](/attachments/02-video-app-metadata.zip)
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| Создаём чарт приложения.
 | ||
| 
 | ||
| `cd helm/02-video-app-metadata`
 | ||
| `helm create openresty-art`
 | ||
| 
 | ||
| ## Структура чарта
 | ||
| 
 | ||
| [Документация](https://helm.sh/docs/topics/charts/)
 | ||
| 
 | ||
| > **Chart.yaml** - это основной конфигуруционный файл, в нем мы описываем параметры
 | ||
| > **values.yaml** - это конфигурационный файл с параметрами по умолчанию для чарта
 | ||
| > **templates/** - тут будут находится шаблоны чарта
 | ||
| > **version** - версия чарта
 | ||
| > **appVersion** - версия приложения, которое находится в чарте
 | ||
| > **kubeVersion** - ограничение версии кубернетис, на котором запустится чарт
 | ||
| {.is-info}
 | ||
| 
 | ||
| > Так как создали чарт с автоматическим заполнением, поэтому нужно заранее знать, что в нашем чарте нужно. Нужна ли папка tests, нужен ли ingress и так далее.
 | ||
| {.is-warning}
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| Редактируем содержимое файла Chart.yaml.
 | ||
| 
 | ||
| ```yaml
 | ||
| apiVersion: v2
 | ||
| name: openresty-art
 | ||
| description: My vision of openresty application
 | ||
| type: application
 | ||
| version: 0.1.0
 | ||
| appVersion: "1.19.9.1-centos-rpm"
 | ||
| kubeVersion: ">= 1.19.0"
 | ||
| ```
 | ||
| 
 | ||
| Из директории templates удаляем не нужные файлы.
 | ||
| 
 | ||
| ```
 | ||
| cd openresty-art/templates
 | ||
| rm -rf {tests,hpa.yaml,serviceaccount.yaml}
 | ||
| ```
 | ||
| 
 | ||
| Переименовываем и переносим автоматически созданные файлы. Мы их потом удалим, но по ходу правки будем 
 | ||
| заимствовать из них некоторые шаблоны.
 | ||
|    
 | ||
| ``` 
 | ||
| mkdir ../../old-templates
 | ||
| mv deployment.yaml ../../old-templates/deployment-orig.yaml 
 | ||
| mv service.yaml ../../old-templates/service-orig.yaml 
 | ||
| mv ingress.yaml ../../old-templates/ingress-orig.yaml
 | ||
| ```
 | ||
| 
 | ||
| Скопируем манифесты нашего приложения в директорию templates
 | ||
| 
 | ||
|     cp ../../../base-application/* .
 | ||
| 
 | ||
| Теперь мы готовы начинать превращать наше приложение в Helm chart.
 | ||
| 
 | ||
| ## Файл _helpers.tpl
 | ||
| 
 | ||
| > **{{- или -}}** это функция trim, которая удаляет лишние пробелы перед или после шаблона, в зависимости от того, где стоит
 | ||
| > **{{/*** - это комментарий
 | ||
| > **define** - присвоение имени. Заканчивается с помощью оператора end. Так же могут быть условия if, else.
 | ||
| > **trunc 63** - обрезает длину имени до 64 знаков
 | ||
| > **trunc 63 | trimSuffix "-"** - допустим значение до будет qwerty-123, то после этой команды останется qwerty
 | ||
| > **nindent 4** - это отступ, который будет сформирован при запуске чарта
 | ||
| {.is-info}
 | ||
| 
 | ||
| 
 | ||
| Команда helm create создала шаблон _helpers.tpl, в который поместила вспомогательные (условно) функции. 
 | ||
| _helpers.tpl - итого получается, что это локальная библиотека шаблонов, которые мы можем использовать.
 | ||
| Эти функции мы можем использовать в наших шаблонах.
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- define "openresty-art.chart" -}}
 | ||
| {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
 | ||
| {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| [define](https://pkg.go.dev/text/template#hdr-Nested_template_definitions) определяет вложенные шаблоны.
 | ||
| 
 | ||
| В дальнейшем в любых файлах нашего чарта мы можем обратиться к такому шаблону при помощи include. Например:
 | ||
| 
 | ||
| ```yaml
 | ||
| Тут будет что то вставлено: {{ include "openresty-art.chart" . }}
 | ||
| ```
 | ||
| 
 | ||
| После обработки, в данном месте будет подставлено содержимое вложенного шаблона:
 | ||
| 
 | ||
| ```yaml
 | ||
| Тут будет что то вставлено: {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
 | ||
| ```
 | ||
| 
 | ||
| Итого в файле определено:
 | ||
| * **openresty-art.name** - имя чарта.
 | ||
| * **openresty-art.fullname** - имя приложения.
 | ||
| * **openresty-art.chart** - имя чарта с версией.
 | ||
| * **openresty-art.labels** - общий набор labels, которые можно подставлять в metadata манифестов.
 | ||
| * **openresty-art.selectorLabels** - набор labels, которые можно использовать в селекторах. Например, в селекторах service.
 | ||
| * **openresty-art.serviceAccountName** - имя SeviceAccount. При условии, что оно определено в файле values.
 | ||
| 
 | ||
| ## Редактируем файл deployment.yaml - metadata
 | ||
| 
 | ||
| На данном этапе будем формировать шаблон для деплоймента. 
 | ||
| 
 | ||
| Рекомендую разделить в редакторе окно на две части. В левую поместить файл deployment.yaml, в правую - 
 | ||
| deployment-orig.yaml.
 | ||
| 
 | ||
| Начнём с раздела metadata.
 | ||
| 
 | ||
| ```yaml
 | ||
| kind: Deployment
 | ||
| apiVersion: apps/v1
 | ||
| metadata:
 | ||
|   name: {{ include "openresty-art.fullname" . }}
 | ||
| ```
 | ||
| 
 | ||
| В данном месте будет генерироваться имя деплоймента. 
 | ||
| При помощи [include](https://helm.sh/docs/chart_template_guide/named_templates/#the-include-function),
 | ||
| подставляется следующий шаблон:
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- if .Values.fullnameOverride }}
 | ||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| {{- $name := default .Chart.Name .Values.nameOverride }}
 | ||
| {{- if contains $name .Release.Name }}
 | ||
| {{- .Release.Name | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
 | ||
| {{- end }}
 | ||
| {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| Попробуем разобраться, что тут написано.
 | ||
| 
 | ||
| Для начала следует понять, к каким встроенным объектам мы можем обращаться в шаблонах helm.
 | ||
| 
 | ||
| ### Встроенные объекты
 | ||
| 
 | ||
| [Документация](https://helm.sh/docs/chart_template_guide/builtin_objects/)
 | ||
| 
 | ||
| * **Release** - описывает сам релиз.
 | ||
| * **Values** - значение из файла values.yaml (параметры по умолчанию).
 | ||
| * **Files** - доступ к файлам в чарте (кроме файлов шаблонов).
 | ||
| * **Capabilities** - информация о кластере kubernetes.
 | ||
| * **Template** - информация о текущем файле шаблона.
 | ||
| 
 | ||
| Разберем приведенный выше шаблон построчно.
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- if .Values.fullnameOverride }}
 | ||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| ```
 | ||
| 
 | ||
| Оператор [if](https://pkg.go.dev/text/template#hdr-Actions) проверяет pipeline. Если pipeline возвращает 0 или
 | ||
| пустой объект - тогда условие = false. Иначе true.
 | ||
| 
 | ||
| В нашем случае используется встроенный объект Values. В файле values.yaml берется параметр объекта fullnameOverride. 
 | ||
| Ниже выдержка из файла values.yaml
 | ||
| 
 | ||
| ```yaml
 | ||
| nameOverride: ""
 | ||
| fullnameOverride: ""
 | ||
| ```
 | ||
| 
 | ||
| Значение не определено, значит указанный блок выполняться не будет. Если бы значение было определено, то сработал бы
 | ||
| шаблон
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
 | ||
| ```
 | ||
| 
 | ||
| В шаблонах, как и в командной строке shell в Linux, можно использовать pipeline. Когда результат работы одной программы, 
 | ||
| выдаваемый на стандартный вывод, передаётся другой программе на стандартный ввод. В данном примере значение объекта
 | ||
| fullnameOverride из файла values.yaml передаётся функции [trunc](https://helm.sh/docs/chart_template_guide/function_list/#trunc). 
 | ||
| Которая обрезает строку на 63-м символе. Значение поля name в манифесте kubernetes не должно превышать 64 символа.
 | ||
| 
 | ||
| Результирующее значение передаётся функции [trimSuffix](https://helm.sh/docs/chart_template_guide/function_list/#trimsuffix),
 | ||
| которая убирает суффиксы после символа "-" (включая сам символ).
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- if .Values.fullnameOverride }}
 | ||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| {{- $name := default .Chart.Name .Values.nameOverride }}
 | ||
| ```
 | ||
| 
 | ||
| Если значение if false, тогда работает блок после "{{- else }}".
 | ||
| 
 | ||
| В нашем случае, определяется внутренняя переменная "$name". Функция [default](https://helm.sh/docs/chart_template_guide/function_list/#default)
 | ||
| говорит, что если не определён .Values.nameOverride, тогда использовать .Chart.Name.
 | ||
| 
 | ||
| .Chart.Name - это встроенный объект, содержащий имя чарта.
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- if .Values.fullnameOverride }}
 | ||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| {{- $name := default .Chart.Name .Values.nameOverride }}
 | ||
| {{- if contains $name .Release.Name }}
 | ||
| {{- .Release.Name | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| ```
 | ||
| 
 | ||
| Следующий оператор if вызывает функцию [contains](https://helm.sh/docs/chart_template_guide/function_list/#contains),
 | ||
| которая проверяет, содержит ли вторая строка первую?
 | ||
| 
 | ||
| Если истина, шаблон выведет содержимое .Release.Name. Обрежет его на 63-м символе. Удалит суффикс.
 | ||
| 
 | ||
| Иначе
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- if .Values.fullnameOverride }}
 | ||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| {{- $name := default .Chart.Name .Values.nameOverride }}
 | ||
| {{- if contains $name .Release.Name }}
 | ||
| {{- .Release.Name | trunc 63 | trimSuffix "-" }}
 | ||
| {{- else }}
 | ||
| {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
 | ||
| {{- end }}
 | ||
| {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| Будет подставлен результат работы функции printf. Обрезанный и без суффикса.
 | ||
| 
 | ||
| В итоге мы получаем имя деплоймента.
 | ||
| 
 | ||
| ```yaml
 | ||
| kind: Deployment
 | ||
| apiVersion: apps/v1
 | ||
| metadata:
 | ||
|   name: {{ include "openresty-art.fullname" . }}
 | ||
| ```
 | ||
| 
 | ||
| ## Labels
 | ||
| 
 | ||
| Следующий объект раздела metadata - это метки. Для их формирования в файле _helpers.tpl определен макрос.
 | ||
| 
 | ||
| ```yaml
 | ||
| kind: Deployment
 | ||
| apiVersion: apps/v1
 | ||
| metadata:
 | ||
|   name: {{ include "openresty-art.fullname" . }}
 | ||
|   labels:
 | ||
|     {{- include "openresty-art.labels" . | nindent 4 }}
 | ||
| ```
 | ||
| 
 | ||
| openresty-art.labels формирует метки.
 | ||
| 
 | ||
| ```yaml
 | ||
| {{- define "openresty-art.labels" -}}
 | ||
| helm.sh/chart: {{ include "openresty-art.chart" . }}
 | ||
| {{ include "openresty-art.selectorLabels" . }}
 | ||
| {{- if .Chart.AppVersion }}
 | ||
| app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
 | ||
| {{- end }}
 | ||
| app.kubernetes.io/managed-by: {{ .Release.Service }}
 | ||
| {{- end }}
 | ||
| 
 | ||
| {{- define "openresty-art.selectorLabels" -}}
 | ||
| app.kubernetes.io/name: {{ include "openresty-art.name" . }}
 | ||
| app.kubernetes.io/instance: {{ .Release.Name }}
 | ||
| {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| Данное определение использует функции и способы, которые мы разобрали в предыдущем макросе. Поэтому подробно разбирать
 | ||
| эту конструкцию мы не будем. Единственная новая функция - это [quote](https://helm.sh/docs/chart_template_guide/function_list/#quote-and-squote).
 | ||
| Она помещает строку в двойные кавычки.
 | ||
| 
 | ||
| ```yaml
 | ||
|   labels:
 | ||
|     {{- include "openresty-art.labels" . | nindent 4 }}
 | ||
| ```
 | ||
| 
 | ||
| В этом месте подставляются метки, сгенерированные макросом. И сдвигаются ([nindent](https://helm.sh/docs/chart_template_guide/function_list/#nindent))
 | ||
| на 4 символа относительно начала строки. Последнее необходимо для того, что бы соблюсти синтаксис yaml файла.
 | ||
| 
 | ||
| ## Annotations
 | ||
| 
 | ||
| Мы предполагаем использовать reloader.stakater.com, который перезапускает приложение, в случае изменения ConfigMap или 
 | ||
| Secret. Но, есть вероятность, что в вашем кластере это приложение не установлено. Эту возможность надо предусмотреть.
 | ||
| 
 | ||
| В файле values.yaml добавим объект application, в который мы будем помещать все параметры деплоймента. Там же
 | ||
| добавим объект reloader и присвоим ему значение по умолчанию false.
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   reloader: false
 | ||
| ```
 | ||
| 
 | ||
| В файле deployment.yaml воспользуемся этим параметром.
 | ||
| 
 | ||
| ```yaml
 | ||
| kind: Deployment
 | ||
| apiVersion: apps/v1
 | ||
| metadata:
 | ||
|   name: {{ include "openresty-art.fullname" . }}
 | ||
|   labels:
 | ||
|     {{- include "openresty-art.labels" . | nindent 4 }}
 | ||
|   {{- if .Values.application.reloader }}
 | ||
|   annotations:
 | ||
|     reloader.stakater.com/auto: "true"
 | ||
|     configmap.reloader.stakater.com/reload: {{ include "penresty-art.fullname" . }}-conf,{{ include "penresty-art.fullname" . }}-html
 | ||
|   {{- end }}
 | ||
| ```
 | ||
| 
 | ||
| Это конечно не идеальный вариант. Так мы отключили возможность вставлять другие аннотации в определение деплоймента.
 | ||
| Но на данном этапе это не важно.
 | ||
| 
 | ||
| ```yaml
 | ||
| {{ include "mytestapp.fullname" . }}-conf,{{ include "mytestapp.fullname" . }}-html
 | ||
| ```
 | ||
| 
 | ||
| Так мы ссылаемся на ConfigMap-ы. Шаблоны которых мы определим позднее.
 | ||
| 
 | ||
| ## Проверка работы шаблонов
 | ||
| 
 | ||
| Проверим, работаю ли наши шаблоны. Для этого воспользуемся командой [template](https://helm.sh/docs/helm/helm_template/).
 | ||
| 
 | ||
| Перейдём в директорию, в которой находится наш чарт.
 | ||
| 
 | ||
|     cd ../..
 | ||
|     helm template app ./openresty-art --debug > app.yaml
 | ||
| 
 | ||
| Эта команда заставляет helm преобразовать шаблоны и выдать на стандартный вывод итоговый набор манифестов. Дополнительный
 | ||
| парамер --debug, заставляет программу выводить отладочную информацию, которая будет полезной в случае обнаружения
 | ||
| ошибок в шаблонах.
 | ||
| 
 | ||
| В результате формируется файл с манифестами app.yaml. Откройте его и посмотрите начало определения деплоймента.
 | ||
| 
 | ||
| ```yaml
 | ||
| ---
 | ||
| # Source: openresty-art/templates/deployment.yaml
 | ||
| kind: Deployment
 | ||
| apiVersion: apps/v1
 | ||
| metadata:
 | ||
|   name: app-openresty-art
 | ||
|   labels:
 | ||
|     helm.sh/chart: openresty-art-0.1.0
 | ||
|     app.kubernetes.io/name: openresty-art
 | ||
|     app.kubernetes.io/instance: app
 | ||
|     app.kubernetes.io/version: "1.19.9.1-centos-rpm"
 | ||
|     app.kubernetes.io/managed-by: Helm
 | ||
| ```
 | ||
| 
 | ||
| Мы видим результат преобразования наших шаблонов. Сформировано имя приложения, раздел labels. А вот секция с
 | ||
| аннотациями отсутствует. Почему? Потому, что в файле values.yaml в нашем черте задано значение по умолчанию:
 | ||
| 
 | ||
| ```yaml
 | ||
| application:
 | ||
|   reloader: false
 | ||
| ```
 | ||
| 
 | ||
| ### Переопределение параметров по умолчанию.
 | ||
| 
 | ||
| Изменить параметры по умолчанию, определённые в чарте можно двумя способами:
 | ||
| 
 | ||
| 1. При помощи параметра --set
 | ||
| 2. Создав и применив собственный yaml файл с переопределёнными параметрами.
 | ||
| 
 | ||
| Файл my-values.yaml
 | ||
| 
 | ||
| ```yaml
 | ||
| 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
 | ||
| ```
 | ||
| 
 | ||
| ### Работа с приложением.
 | ||
| 
 | ||
| Установим приложение.
 | ||
| 
 | ||
|     helm install app ./openresty-art --namespace app -f my-values.yaml
 | ||
|     helm list --namespace app
 | ||
| 
 | ||
| Удалим приложение.
 | ||
| 
 | ||
|     helm uninstall app --namespace app
 | ||
| 
 | ||
| ## Видео
 | ||
| 
 | ||
| [<img src="https://img.youtube.com/vi/HgI_5kMhbhY/maxresdefault.jpg" width="50%">](https://youtu.be/HgI_5kMhbhY)
 |