HELM, который нужно знать, чтобы играть в K8S

Основная концепция

Helm похож на диспетчер пакетов в системе Linux, такой как yum / apt и т. Д., Который может быстро и легко развернуть ранее упакованные файлы yaml в кубернетах для упрощения управления и обслуживания.

  • Helm: клиентский инструмент под командной строкой, в основном используемый для создания / упаковки / выпуска диаграммы приложения kubernetes, которая была создана и управляема удаленным хранилищем диаграмм.
  • Tiller: серверная часть helm развернута в кубернетах. Tiller принимает запрос helm и генерирует файл развертывания кубернетов (helm, называемый release) в соответствии с диаграммой, а затем отправляет его в Kubernetes для создания приложения. Tiller также предоставляет ряд функций, таких как обновление выпуска, удаление и откат.
  • Диаграмма: программный пакет helm в формате tar, который содержит все изображения / зависимости / определения ресурсов, необходимые для запуска приложения, а также может содержать определения служб в кластере kubernetes.
  • Выпуск: экземпляр Chart, работающий в кластере в кубернетах. В одном кластере Chart можно установить несколько раз, и каждая установка будет генерировать новый выпуск.
  • Репозиторий: репозиторий для публикации и хранения диаграммы.

Проще говоря:

  • Роль helm: подобно команде yum в centos7, он управляет пакетами программного обеспечения, за исключением того, что helm управляет различными контейнерами, установленными на k8s.
  • Роль tiller: Как и хранилище программного обеспечения centos7, он просто похож на xxx.repo в каталоге /etc/yum.repos.d.

Двухкомпонентная архитектура

Три принципа работы

3.1 Chart install

  • Helm анализирует информацию о структуре диаграммы из указанного каталога или файла tar
  • Helm передает сформированную структуру диаграммы и информацию о значениях культиватору через протокол gRPC.
  • tiller генерирует выпуск на основе диаграммы и значений
  • tiller отправляет релиз в kubernetes через json для генерации релиза

3.2 Chart update

  • Helm анализирует информацию о структуре диаграммы из указанного каталога или файла tar
  • Helm передает сформированную структуру диаграммы и информацию о значениях культиватору через протокол gRPC.
  • tiller генерирует релиз и обновляет историю релиза с указанным именем
  • tiller отправляет информацию о выпуске в kubernetes для обновления выпуска

3.3 Chart Rollback

  • Helm передаст название выпущенной версии tiller
  • tiller находит историю по названию выпуска
  • tiller получает предыдущий выпуск из истории
  • tiller отправляет предыдущую версию в kubernetes для замены текущей версии

3.4 Зависимости обработки графиков

Когда Tiller обрабатывает диаграмму, он напрямую объединяет диаграмму и все диаграммы, от которых он зависит, в выпуск и одновременно передает его Kubernetes. Поэтому Tiller не несет ответственности за управление последовательностью запуска между зависимостями. Приложение в Chart должно иметь возможность обрабатывать зависимости самостоятельно.

Четыре установки и развертывания

Установка версии 4.1 v2

4.1.1 Установить helm

# На главном клиентском хосте, обычно это главный хост
wget https://get.helm.sh/helm-v2.14.2-linux-amd64.tar.gz
tar xf helm-v2.14.2-linux-amd64.tar.gz
mv helm /usr/local/bin/
helm version

4.1.2 Инициализация румпеля

  • Инициализация румпеля автоматически прочитает~/.kubeКаталог, поэтому вам необходимо убедиться, что файл конфигурации существует и аутентификация прошла успешно.
  • tiller настраивает rbac, создает новый rabc-config.yaml и применяет
# В: https://github.com/helm/helm/blob/master/docs/rbac.md Вы можете найти rbac-config.yaml
 
cat > rbac-config.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
EOF
 
kubectl apply -f rbac-config.yaml
  • Проявить зеркало
docker pull jessestuart/tiller:v2.14.2
 
yum install socat
 
# yum install socat
 
docker tag jessestuart/tiller:v2.14.2 gcr.io/kubernetes-helm/tiller:v2.14.2
 
helm init -i gcr.io/kubernetes-helm/tiller:v2.9.0
 
 # Нужно обратить внимание на параметры
 - Только для клиента: то есть не устанавливайте серверное приложение, которое может потребоваться в CI&CD, потому что обычно вы устанавливаете приложение в кластере k8s, тогда вам нужно только инициализировать клиент helm;
 --History-max: максимальная история. Когда вы устанавливаете приложение с помощью helm, helm создает запись об установке в пространстве имен, где она расположена. По мере увеличения количества обновлений эта запись будет увеличиваться;
 --Tiller-namespace: по умолчанию kube-system, вы также можете установить для него другое пространство имен;
  • Измените изображение
# По причинам, связанным с gfw, вы можете использовать это зеркало https://hub.docker.com/r/jessestuart/tiller/tags
kubectl edit deployment -n kube-system tiller-deploy
 
image: jessestuart/tiller:v2.14.0
  • Обработка исключений
Error: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached: Get https://kubernetes-charts.storage.googleapis.com/index.yaml: read tcp 10.2.8.44:49020->216.58.220.208:443: read: connection reset by peer
 
 Решение: заменить источник: репозиторий helm добавить стабильный https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
 
 Затем в helm init
 
 
 Примечание: румпель может работать на узле узла, загружать образ румпеля в узел узла и изменять тег
  • Посмотреть версию
[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.2+unreleased", GitCommit:"d953c6875cfd4b351a1e8205081ea8aabad7e7d4", GitTreeState:"dirty"}

4.2 установка и развертывание helm3

Потому что многие зарубежные зеркальные сайты недоступны в Китае, напримерgcr.io , Рекомендуется использовать Aliyuan,https://developer.aliyun.com/hub。

AppHub — это полнофункциональный Helm Hub «China Station», размещенный во внутреннем общедоступном облаке. Его серверная часть разрабатывается и выполняется тремя инженерами из команды Alibaba Cloud Container Platform, которые используют 20% времени.

Важной обязанностью этого сайта является автоматическая синхронизация всех приложений, размещенных на официальном хабе Helm, со страной; в то же время он автоматически синхронизирует данные в файле Charts.gcr.io Подождите, пока все URL-адреса с проблемами доступа к сети будут заменены постоянными URL-адресами внутреннего зеркала.

В настоящее время helm3 не зависит от tiller, и имя выпуска можно повторно использовать между разными ns.

4.2.1 Установите helm

Helm3 не требует установки tiller. Загрузите двоичный файл Helm и распакуйте его прямо в $ PATH, чтобы использовать его.

cd /opt && wget https://cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com/helm-v3.0.0-alpha.1-linux-amd64.tar.gz
tar -xvf helm-v3.0.0-alpha.1-linux-amd64.tar.gz
mv linux-amd64 helm3
mv helm3/helm helm3/helm3
chown root.root helm3 -R
cat > /etc/profile.d/helm3.sh << EOF
export PATH=$PATH:/opt/helm3
EOF
source /etc/profile.d/helm3.sh
 
 
[root@master helm3]# helm3 version
version.BuildInfo{Version:"v3.0.0-alpha.1", GitCommit:"b9a54967f838723fe241172a6b94d18caf8bcdca", GitTreeState:"clean"}

4.2.2 Установить приложение с помощью helm3

helm repo add apphub https://apphub.aliyuncs.com
helm search guestbook
helm install guestbook apphub/guestbook

Пять использовать

5.1 Основные команды

http://hub.kubeapps.com/
 
 Завершение # Создать сценарий автоматического завершения для указанной оболочки (bash или zsh)
 create # Создать новую диаграмму с заданным именем
 delete # Удаляем выпуск указанного имени из Kubernetes
 dependency # Управлять зависимостями диаграммы
 fetch # Загрузите диаграмму из репозитория и (при желании) распакуйте ее в локальный каталог
 get # загрузить названный выпуск
 help # Список всей справочной информации
 history # Получить историю выпусков
 home # показать расположение HELM_HOME
 init # Инициализировать Helm на клиенте и сервере
 inspect # проверить детали диаграммы
 install # установить архив диаграмм
 lint # Проверить синтаксис диаграммы
 list # список выпусков
 package # Упаковать каталог диаграммы в файл диаграммы
 plugin # Добавить список или удалить плагин helm
 репо # Добавить список удалить обновление и индексировать репозиторий диаграмм
 reset # Удалить Tiller из кластера
 rollback # Откатить версию к предыдущей версии
 search # Искать ключевые слова в репозитории диаграмм
 serve # Запускать локальный сетевой сервер http
 status # Показать статус указанного выпуска
 template # шаблон локального рендеринга
 test # протестировать релиз
 upgrade # обновить выпуск
 verify # убедитесь, что диаграмма на заданном пути подписана и действительна
 version # Распечатать информацию о версии клиента / сервера
 dep # Анализировать диаграмму и скачивать зависимости
  • Укажите value.yaml для развертывания диаграммы
helm install --name els1 -f values.yaml stable/elasticsearch
  • Обновить диаграмму
helm upgrade --set mysqlRootPassword=passwd db-mysql stable/mysql
 
helm upgrade go2cloud-api-doc go2cloud-api-doc/ 
  • Откатить график
helm rollback db-mysql 1
  • Удалить выпуск
helm delete --purge db-mysql
  • Только визуализировать и выводить шаблон без установки
helm install/upgrade xxx --dry-run --debug

5.2 Организация файла диаграммы

myapp / # Каталог диаграмм
 ├── диаграммы # Другие диаграммы, от которых зависит эта диаграмма, всегда устанавливаются
 ├── Chart.yaml # Опишите соответствующую информацию этой диаграммы, включая имя, описание, версию и т. Д.
 ├── templates # Каталог шаблонов
 │ ├── deployment.yaml # файл шаблона контроллера развертывания Go
 │ ├── _helpers.tpl # Файлы, начинающиеся с _, не будут развернуты в k8s, их можно использовать для настройки общей информации
 │ ├── ingress.yaml # файл шаблона входящего трафика
 │ ├── NOTES.txt # Запишите некоторую информацию после развертывания в кластер, например: как использовать, перечислить значения по умолчанию
 │ ├── service.yaml # файл шаблона service Go
 │ └── tests
 │     └── test-connection.yaml
 └── values.yaml # Файл значений шаблона. Эти значения будут применены к шаблону GO во время установки для создания файла развертывания.

5.3 Создайте свою собственную диаграмму

  • Создайте свою собственную mychart
[root@master mychart]# helm create mychart
Creating mychart
[root@master mychart]# ls
mychart
[root@master mychart]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
 │ ├── deployment.yaml # Развертывание связанных ресурсов
 │ ├── _helpers.tpl # Помощник по шаблонам
 │ ├── ingress.yaml # ресурсы входа
 │ ├── NOTES.txt # Текст справки диаграммы, запустите helm install, чтобы показать его пользователю
│ ├── service.yaml # конечная точка службы
│   └── tests
│       └── test-connection.yaml
└── values.yaml
 
3 directories, 8 files
  • Удалите все файлы в шаблоне и создайте конфигурационную карту
rm -rf mychart/templates/*
 # Сначала мы создаем файл с именем mychart / templates / configmap.yaml:
 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
  • Монтажный тест

Поскольку созданный файл yaml находится в шаблоне, tiller читает этот файл и отправляет его в kubernetes.

[root@master mychart]# helm install ./mychart/
NAME:   enervated-dolphin
LAST DEPLOYED: Sun Jul 21 09:29:13 2019
NAMESPACE: default
STATUS: DEPLOYED
 
RESOURCES:
==> v1/ConfigMap
NAME               DATA  AGE
mychart-configmap  1     0s
 
[root@master mychart]# kubectl get cm mychart-configmap
NAME                DATA   AGE
mychart-configmap   1      2m6s
[root@master mychart]# kubectl describe cm mychart-configmap
Name:         mychart-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>
 
Data
====
myvalue:
----
this is my chart configmap
Events:  <none>
 
 
[root@master mychart]# helm get manifest enervated-dolphin
 
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "this is my chart configmap"

Вhelm get manifestКоманда для получения названия выпуска (enervated-dolphin) и распечатки всех ресурсов Kubernetes, загруженных на сервер. Каждый файл отмечен значком---Он начинается с начала документа YAML, а затем автоматически сгенерированная строка комментария сообщает нам документ YAML, сгенерированный файлом шаблона.

Отсюда мы видим, что данные YAML — это именно то, что у нас есть в нашемconfigmap.yamlОформлено в документе.

Теперь мы можем удалить наш релиз:helm delete enervated-dolphin

[root@master mychart]# helm delete enervated-dolphin
release "enervated-dolphin" deleted

5.4 Добавить шаблон вызова

жесткий кодname:Обычно считается плохой практикой становиться ресурсом. Название должно быть единственной версией. Так что мы можем захотеть создать поле имени, вставив название выпуска.

Подсказка:Имя: Из-за ограничений системы DNS это поле ограничено 63 символами. Таким образом, название версии ограничено 53 символами. Kubernetes 1.3 и более ранние версии ограничены 24 символами (т. Е. 14-значными именами).

Измените предыдущую конфигурационную карту следующим образом

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"

name:Теперь это значение изменилось на{{.Release.Name}}-configmap

Инструкции по шаблону включены в{{ с участием }}В блоке.

Инструкции по шаблону{{.Release.Name}}Введите название выпуска в шаблон. Значение, переданное в шаблон, можно рассматривать как объект пространства имен, где точка (.) Разделяет каждый элемент пространства имен.

Первая маленькая точка перед Release означает, что мы начинаем с верхнего пространства имен этой области (мы немного поговорим о области видимости). Итак, мы можем понять это так.Release.Name:«Начиная с пространства имен верхнего уровня, найдите объект Release, а затем найдите имяNameОбъект ».

Объект Release является одним из встроенных объектов Helm, и мы представим его более подробно позже. Но пока этого достаточно, чтобы показать, что это покажет название выпуска, которое нам присвоил Тиллер.

Теперь, когда мы установим наши ресурсы, мы сразу увидим результат использования этой директивы шаблона:

[root@master mychart]# helm install ./mychart/
NAME:   famous-peahen
LAST DEPLOYED: Sun Jul 21 09:42:05 2019
NAMESPACE: default
STATUS: DEPLOYED
 
RESOURCES:
==> v1/ConfigMap
NAME                    DATA  AGE
famous-peahen-confgmap  1     0s
 
 
[root@master mychart]# helm get manifest famous-peahen
 
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: famous-peahen-confgmap
data:
  myvalue: "this is my chart configmap"

Мы видели базовый шаблон: файл YAML встраивает инструкции шаблона через. В следующей части мы углубимся в шаблоны. Но прежде чем продолжить, есть быстрый трюк, позволяющий ускорить создание шаблонов: если вы хотите протестировать отрисовку шаблона, но на самом деле ничего не устанавливаете, вы можете использоватьhelm install --debug --dry-run ./mychart. Это отправит диаграмму на сервер Tiller, который отобразит шаблон. Но вместо того, чтобы устанавливать диаграмму, она возвращает отрисованный шаблон, чтобы можно было увидеть результат:

5.5 Встроенные объекты

внутренние переменные руля

Объект передается из шаблонизатора в шаблон. Ваш код может передавать объекты (мы объясним вwith с участием rangeСм. Пример использования предложения). Есть даже несколько способов создания новых объектов в шаблоне, как мы увидим позже.tupleФункция такая же.

Объекты могут быть очень простыми, с одним значением. Или они могут содержать другие объекты или функции. Например,ReleaseОбъект содержит несколько объектов (например,Release.Name) А такжеFilesУ объекта есть несколько функций.

В предыдущем разделе мы использовали{{.Release.Name}}Вставьте название выпуска в шаблон.ReleaseОдин из объектов верхнего уровня, к которому можно получить доступ в шаблоне.

  • Release: Этот объект описывает сам выпуск. В нем несколько объектов:
  • Release.Name: Название выпуска
  • Release.Time: Время выпуска
  • Release.Namespace: Пространство имен Release (если не указано в списке)
  • Release.Service: Название службы выпуска (всегдаTiller)。
  • Release.Revision: Номер редакции этого выпуска. Начинается с 1, каждыеhelm upgradeДобавляйте по одному.
  • Release.IsUpgrade: Если текущая операция — обновление или откат, установите для нее значениеtrue
  • Release.IsInstall: Если текущая операция — установка, установите ее наtrue
  • Values:Из values.yamlЗначение файла и файла, предоставленного пользователем в шаблоне. По умолчанию значение пусто.
  • ChartChart.yamlСодержание файла. Здесь будут доступны любые данные Chart.yaml. Например, {{.Chart.Name}} — {{. Chart.Version}} распечатает mychart-0.1.0. В руководстве по диаграммеCharts GuideСписок доступных полей
  • Files: Это обеспечивает доступ ко всем обычным файлам на диаграмме. Хотя вы не можете использовать его для доступа к шаблону, вы можете использовать его для доступа к другим файлам в диаграмме. См. Раздел «Доступ к файлам».
  • Files.GetЭто функция для получения файлов по имени (.Files.Get config.ini
  • Files.GetBytesЭто функция для получения содержимого файла в виде массива байтов вместо строки. Это полезно для таких вещей, как изображения.
  • Capabilities: Здесь представлена ​​информация о функциях, поддерживаемых кластером Kubernetes.
  • Capabilities.APIVersionsЭто набор информации о версии.
  • Capabilities.APIVersions.Has $versionУказывает, следует ли включить версию в кластере (batch/v1)。
  • Capabilities.KubeVersionПредоставляет метод поиска версии Kubernetes. Он имеет следующие значения: Major, Minor, GitVersion, GitCommit, GitTreeState, BuildDate, GoVersion, Compiler и Platform.
  • Capabilities.TillerVersionПредоставляет метод поиска версии Tiller. Он имеет следующие значения: SemVer, GitCommit и GitTreeState.
  • Template: Содержит информацию о текущем выполняемом шаблоне
  • Name: Путь к файлу пространства имен текущего шаблона (например,mychart/templates/mytemplate.yaml
  • BasePath: Путь в пространстве имен текущего каталога шаблонов диаграммы (например, mychart / templates).

Эти значения можно использовать в любом шаблоне верхнего уровня. Как мы увидим позже, это не означает, что они будут везде.

Встроенные значения всегда начинаются с заглавной буквы. Это соответствует соглашению об именах Go. Когда вы создаете собственное имя, вы можете использовать соглашения, которые подходят вашей команде. Некоторые команды, такие как команда Kubernetes Chart, предпочитают использовать только инициалы и строчные буквы, чтобы различать локальные имена и встроенные имена. В этом руководстве мы следуем этому соглашению.

5.6 файл значений

В предыдущем разделе мы рассмотрели встроенные объекты, предоставляемые шаблоном Helm. Один из четырех встроенных объектов — Values. Этот объект предоставляет доступ к значению переданного графика. Его содержание поступает из четырех источников:

  • в диаграммеvalues.yamlфайл
  • Если это дочерняя диаграмма, из родительской диаграммыvalues.yamlфайл
  • Файл значений передается в файл через флаг -f установки helm или обновления helm (helm install -f myvals.yaml ./mychart
  • Проходят--set(Например,helm install --set foo=bar ./mychart

Приведенный выше список упорядочен в определенном порядке: values.yaml По умолчанию родительская диаграмма может переопределять уровень по умолчанию, а значение диаграммы values.yaml может быть перезаписано файлом значений, предоставленным пользователем, и файл может быть: -set параметр переопределения.

Файл значений — это чистый файл YAML. Мы редактируемmychart/values.yaml, А затем отредактируйте нашConfigMapШаблон.

Удаляем default values.yaml, мы устанавливаем только один параметр:

# Редактировать values.yaml
domain: anchnet.com
 
 # Цитата в шаблоне
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  domain: {{.Values.domain}}

Обратите внимание, что мы получаем значение domain` в последней строке {{.Values.domain}}.

[root@master mychart]# helm install --dry-run --debug ./mychart
'''
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: exciting-manta-confgmap
data:
  myvalue: "this is my chart configmap"
  domain: anchnet.com
  • Вручную используйте —set, чтобы указать

Так какdomainПо умолчаниюvalues.yamlУстановить в файле какanchnet.com, Это значение, отображаемое в шаблоне. Мы можем легко добавить его в нашу команду установки helm--setДобавьте логотип на обложку:

helm install --dry-run --debug --set domain=51idc.com ./mychart 
'''
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: foppish-mule-confgmap
data:
  myvalue: "this is my chart configmap"
  domain: 51idc.com

Так как--setЧем по умолчаниюvalues.yamlФайл имеет более высокий приоритет

  • Удалить ключ по умолчанию

Если вам нужно удалить ключ из значения по умолчанию, вы можете переопределить значение ключа как null, и в этом случае Helm удалит ключ из слияния переопределенных значений.

helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null

5.7 Шаблонные функции и конвейеры

  • Функция шаблона

Пока что мы уже знаем, как поместить информацию в шаблон. Но эта информация помещается в шаблон без изменений. Иногда мы хотим преобразовать эти данные, чтобы сделать их более полезными для нас.

Начнем с передовой практики: при вставке строк из объекта .values ​​в шаблон мы заключаем эти строки в кавычки. Мы можем сделать это, вызвав функцию в директиве шаблона цитаты:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{quote .Values.favorite.drink}}
  food: {{quote .Values.favorite.food}}

Функции шаблона следуют синтаксисуfunctionName arg1 arg2.... В приведенном выше фрагменте кодаquote .Values.favorite.drinkВызовите функцию цитаты и передайте ей параметр.

Helm имеет более 60 доступных функций. Некоторые из них созданы на языке шаблонов Go.Go template languageОпределяется сам по себе. Большинство других — это библиотека шаблонов Sprig.Sprig template libraryчасть. Мы многое увидим по мере объяснения примеров.

Хотя мы рассматриваем язык шаблонов Helm как специфичный для Helm, на самом деле он представляет собой комбинацию языка шаблонов Go, некоторых дополнительных функций и различных оболочек для предоставления определенных объектов шаблонам. Многие ресурсы по шаблонам Go могут быть полезны при понимании шаблонов.

  • трубопровод

Одна из сильных сторон языка шаблонов — это концепция конвейера. Используя концепцию UNIX, конвейер представляет собой инструмент для связывания серии команд шаблона для компактного выражения серии преобразований. Другими словами, конвейер — это эффективный способ последовательно выполнять несколько задач. Давайте перепишем приведенный выше пример с трубами.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | quote}}
  food: {{.Values.favorite.food | quote}}

В этом примере нет вызоваquote ARGUMENT, Мы изменили порядок. Мы используем каналы (|) для отправки «параметров» функции:.Values.favorite.drink | quote. Используя конвейеры, мы можем связать несколько функций вместе:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | quote}}
  food: {{.Values.favorite.food | upper | quote}}

Изменение порядка — обычная практика в шаблонах. ты увидишь.val | quoteЧемquote .valЭто чаще встречается. Тоже практика.

При оценке шаблон даст следующие результаты:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: trendsetting-p-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

Обратите внимание, что наш оригиналpizzaТеперь преобразован в"PIZZA"

Когда есть такие параметры конвейера, первая оценка (.Values.favorite.drink) Результат будет отправлен как последний параметр функции. Мы можем изменить приведенный выше пример напитка, чтобы проиллюстрировать функцию с двумя параметрами.repeat COUNT STRING

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | repeat 5 | quote}}
  food: {{.Values.favorite.food | upper | quote}}

Функция повторения вернет заданную строку и заданное количество раз, поэтому мы получим такой вывод:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: melting-porcup-configmap
data:
  myvalue: "Hello World"
  drink: "coffeecoffeecoffeecoffeecoffee"
  food: "PIZZA"
  • Использовать функцию по умолчанию

Часто используется функцияdefaultdefault DEFAULT_VALUE GIVEN_VALUE. Эта функция позволяет указать значение по умолчанию внутри шаблона в случае, если значение не указано. Давайте воспользуемся им, чтобы изменить приведенный выше пример напитка:

drink: {{.Values.favorite.drink | default "tea" | quote}}

Если мы побежим как обычно, то получим кофе:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: virtuous-mink-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

Теперь мы удалим избранные настройки напитков values.yaml из следующих мест:

favorite:
  #drink: coffee
  food: pizza

Перезапустить сейчасhelm install --dry-run --debug ./mychartЭтот YAML будет сгенерирован:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: fair-worm-configmap
data:
  myvalue: "Hello World"
  drink: "tea"
  food: "PIZZA"

В реальной диаграмме все статические значения по умолчанию должны существовать в values.yaml и не должны повторяться с командой по умолчанию (в противном случае они будут избыточными). Однако команда по умолчанию подходит для вычисляемых значений, поскольку вычисленные значения не могут быть объявлены в values.yaml. Например:

drink: {{.Values.favorite.drink | default (printf "%s-tea" (include "fullname" .)) }}

В некоторых местахifУсловия могут быть лучше, чем этоdefault Более подходящий. Мы увидим это в следующем разделе.

Функции шаблонов и конвейеры — мощные способы преобразования информации и вставки ее в YAML. Но иногда вам нужно добавить логику шаблона, которая сложнее, чем вставка строк. В следующем разделе мы рассмотрим структуру управления, предоставляемую языком шаблонов.

  • Операторская функция

Для шаблонов операторы (eq, ne, lt, gt, and, or и т. Д.) Являются реализованными функциями. В конвейере операторы могут использовать круглые скобки (( с участием )) Группировка.

Поместите оператор перед объявлением, а затем его параметры, как при использовании функции. Чтобы использовать несколько операторов вместе, разделите каждую функцию скобками.

{{/* include the body of this if statement when the variable .Values.fooString xists and is set to "foo" */}}
{{if and .Values.fooString (eq .Values.fooString "foo") }}
    {{...}}
{{end}}
 
 
{{/* do not include the body of this if statement because unset variables evaluate o false and .Values.setVariable was negated with the not function. */}}
{{if or .Values.anUnsetVariable (not .Values.aSetVariable) }}
   {{...}}
{{end}}

Теперь мы можем перейти от функций и конвейеров к управлению потоком, условиям, циклам и модификаторам диапазона.

5.8 Управление процессом

5.8.1 Управление процессом

Структуры управления (называемые «действиями» на языке шаблонов) предоставляют авторам шаблонов возможность управлять процессом создания шаблона. Язык шаблонов Helm предоставляет следующие управляющие структуры:

  • if/elseИспользуется для создания условных блоков
  • withНазначенный диапазон
  • range, Он обеспечивает цикл «для каждого» стиля

Кроме того, он также предоставляет некоторые операции для объявления и использования именованных сегментов шаблона:

  • defineОбъявить новый именованный шаблон в шаблоне
  • templateИмпортировать именованный шаблон
  • blockОбъявлена ​​специальная заполняемая область шаблона

В этом разделе мы поговорим оifwith с участием range. Другой контент описан в разделе «Именованные шаблоны» далее в этом руководстве.

5.8.2 if/else

Первая структура управления, которую мы рассмотрим, предназначена для условного включения текстовых блоков в шаблон. Это блок if / else.

Основная структура условия следующая:

{{if PIPELINE}}
  # Do something
{{else if OTHER PIPELINE}}
  # Do something else
{{else}}
  # Default case
{{end}}

Обратите внимание, что сейчас мы говорим о каналах, а не о значениях. Причина в том, чтобы прояснить, что структура управления может выполнять весь конвейер, а не только оценивать значение.

Если значение следующее, конвейер оценивается как ложный.

  • Логическое значение false
  • Число ноль
  • Пустая строка
  • Один nil(Пусто или ноль)
  • Пустая коллекция (mapslicetupledictarray

В других случаях значение условия равноtrueЭтот конвейер выполнен.

Мы добавляем простое условие в ConfigMap. Если для напитка установлен кофе, мы добавим еще один параметр:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | default "tea" | quote}}
  food: {{.Values.favorite.food | upper | quote}}
  {{if and .Values.favorite.drink (eq .Values.favorite.drink "coffee") }}mug: true{{ end }}

Заметка.Values.favorite.drinkОн должен быть определен, иначе будет выдана ошибка при сравнении с «кофе». Поскольку мы закомментировали предыдущий примерdrink:coffee, Поэтому вывод не должен содержатьmug:trueЛоготип. Но если мы добавим строку обратноvalues.yamlВ файле вывод должен быть следующим:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eyewitness-elk-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  mug: true

5.8.3 Управляющие пространства

Глядя на условия, мы должны быстро проверить метод управления пространством в шаблоне. Давайте посмотрим на предыдущий пример и отформатируем его в более читаемый формат:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | default "tea" | quote}}
  food: {{.Values.favorite.food | upper | quote}}
  {{if eq .Values.favorite.drink "coffee"}}
    mug: true
  {{end}}

Сначала это выглядело хорошо. Но если запустить его через шаблонизатор, мы получим неверный результат:

$ helm install --dry-run --debug ./mychart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/k8s.io/helm/_scratch/mychart
Error: YAML parse error on mychart/templates/configmap.yaml: error converting YAML to JSON: yaml: line 9: did not find expected key

что случилось? Из-за пробела выше мы создали неверный YAML.

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eyewitness-elk-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
    mug: true

кружка имеет неправильный отступ. Давайте просто сделаем отступ для этой строки и выполним заново:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | default "tea" | quote}}
  food: {{.Values.favorite.food | upper | quote}}
  {{if eq .Values.favorite.drink "coffee"}}
  mug: true
  {{end}}

Когда мы отправляем эту информацию, мы получаем действующий YAML, но он все равно выглядит немного интересным:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: telling-chimp-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
 
  mug: true

Обратите внимание, что мы получили несколько пустых строк в YAML. Зачем? Когда шаблонизатор запущен, он удалит{{ с участием }}Пустое содержимое, но оставшиеся пустые оставьте как есть.

Отступы в YAML строгие, поэтому управление пробелами становится очень важным. К счастью, в шаблонах Helm есть несколько инструментов, которые могут нам помочь.

Во-первых, вы можете изменить синтаксис фигурных скобок в объявлении шаблона специальными символами, чтобы указать механизму шаблонов заполнить пробелы.{{-(Добавлены дефисы и пробелы) означает, что сетку нужно переместить влево, а-}}Означает, что нужно удалить нужное место. нота! Новые строки — это тоже пробелы!

удостовериться -Между ним и другими инструкциями есть пробел.-3Это означает «удалите левый пробел и выведите 3», и-3Это означает «печать -3».

Используя этот синтаксис, мы можем изменить наш шаблон, чтобы избавиться от этих новых строк:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | default "tea" | quote}}
  food: {{.Values.favorite.food | upper | quote}}
  {{- if eq .Values.favorite.drink "coffee"}}
  mug: true
  {{- end}}

Чтобы прояснить это, давайте скорректируем содержимое выше и заменим пробелы на*, Согласно этому правилу, все пробелы будут удалены. Один в конце строки*Указывает, что символ новой строки будет удален

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | default "tea" | quote}}
  food: {{.Values.favorite.food | upper | quote}}*
**{{- if eq .Values.favorite.drink "coffee"}}
  mug: true*
**{{- end}}

Помня об этом, мы можем запустить наш шаблон через Helm и увидеть результат:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: clunky-cat-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  mug: true

Осторожно используйте модификатор chomping. Это может легко вызвать несчастный случай:

  food: {{.Values.favorite.food | upper | quote}}
  {{- if eq .Values.favorite.drink "coffee" -}}
  mug: true
  {{- end -}}

В результате будет получена еда: кружка «ПИЦЦА»: верно, потому что разрывы строк с обеих сторон удалены.

Дополнительные сведения об управлении пространством в шаблонах см. В официальной документации по шаблону Go.Official Go template documentation

Наконец, иногда проще указать системе шаблонов, как делать отступ, чем пытаться понять интервал в инструкциях шаблона. Поэтому иногда вы можете найтиindentФункция ({{indent 2 "mug:true"}}) Было бы полезно.

5.8.4 Использование с для изменения области действия

Следующая структура управления, на которую стоит обратить внимание:with. Он контролирует объем переменных. Отзыв,.Ссылка на текущую область видимости. следовательно,.ValuesСообщите шаблону, что нужно искать в текущей областиValuesОбъект.

Его синтаксис с подобен простому оператору if:

{{with PIPELINE}}
  # restricted scope
{{end}}

Объем может быть изменен. с может разрешить текущий диапазон (.) Устанавливается на конкретный объект. Например, мы использовали.Values.favorites. Давайте перепишем нашу ConfigMap, чтобы изменить.Сфера до точки.Values.favorites

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  {{- with .Values.favorite}}
  drink: {{.drink | default "tea" | quote}}
  food: {{.food | upper | quote}}
  {{- end}}

Обратите внимание, что теперь мы можем процитировать.drink с участием .foodНет необходимости ограничивать это. Это потому чтоwithНастройка декларации.Указывает.Values.favorite. В{{end}}Задний.Сбросить предыдущий диапазон.

Но обратите внимание! В пределах ограниченной области доступ к другим объектам из родительской области в настоящее время невозможен. Например, следующее сообщение об ошибке:

  {{- with .Values.favorite}}
  drink: {{.drink | default "tea" | quote}}
  food: {{.food | upper | quote}}
  release: {{.Release.Name}}
  {{- end}}

Это приведет к ошибке, потому что Release.Name отсутствует в.В пределах. Однако, если мы поменяем местами последние две строки, все будет работать, как ожидалось, потому что после этого диапазон сбрасывается.

  {{- with .Values.favorite}}
  drink: {{.drink | default "tea" | quote}}
  food: {{.food | upper | quote}}
  {{- end}}
  release: {{.Release.Name}}

Взглянемrange, Давайте взглянем на переменные шаблона, которые позволяют решить вышеуказанный круг проблем.

5.8.5 ЦиклrangeДействие

Многие языки программирования поддерживают использованиеforЦикл,foreachЦиркуляция или аналогичный функциональный механизм циркуляции. На языке шаблонов Helm для обхода коллекции можно использоватьrangeОператор.

Во-первых, позвольте нам в нашемvalues.yamlДобавьте в файл список ингредиентов для пиццы:

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

Теперь у нас есть список pizzaToppings (в шаблоне он называется slice). Мы можем изменить наш шаблон и распечатать этот список на нашей ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  {{- with .Values.favorite}}
  drink: {{.drink | default "tea" | quote}}
  food: {{.food | upper | quote}}
  {{- end}}
  toppings: |-
    {{- range .Values.pizzaToppings}}
    - {{. | title | quote}}
    {{- end}}

Давайте посмотрим внимательнееtoppings:список. Функция диапазона будет перебирать список pizzaToppings. Но теперь произошло кое-что интересное.withОбъем наборов.rangeОператор такой же. Каждый раз, проходя петлю,.Все устанавливаются на вершину текущей пиццы. Это в первый раз.Установите грибы. Вторая итерация установлена ​​наcheese,Так далее и тому подобное.

Можем отправить прямо в конвейер.Значение, поэтому, когда мы делаем{{. | title | quote}}, Он отправит.В заголовок (функция регистра заголовка), а затем отправитьquote. Если мы запустим этот шаблон, результат будет:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: edgy-dragonfly-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  toppings: |-
    - "Mushrooms"
    - "Cheese"
    - "Peppers"
    - "Onions"

В этом примере мы столкнулись с некоторыми сложностями. Вtoppings: |-Строка объявляет многострочную строку. Так что наш список начинок на самом деле не является списком YAML. Это очень большая струна. Почему мы это делаем? Поскольку данные в ConfigMapsdataОн состоит из пар ключ / значение, где ключ и значение представляют собой простые строки. Чтобы разобраться в этой ситуации, проверьтеДокументация Kubernetes ConfigMap.. Но для нас эта деталь не важна.

В ЯМЛ|-Знак указывает на многострочную строку. Это может быть полезным методом встраивания больших блоков данных в инвентарь, как показано здесь.

Иногда бывает полезно быстро создать список в шаблоне, а затем перебирать список. В шаблоне Helm есть функция, которая упрощает это:tuple. В информатике кортеж — это коллекция, подобная списку фиксированного размера, но с произвольными типами данных. Это примерно показывает, как используются кортежи.

  sizes: |-
    {{- range tuple "small" "medium" "large"}}
    - {{.}}
    {{- end}}
  sizes: |-
    - small
    - medium
    - large

Помимо списка и кортежа,rangeЕго также можно использовать для просмотра коллекций с ключами и значениями (например,mapИлиdict). Мы увидим, как это сделать, когда представим переменные шаблона в следующем разделе.

5.9 Переменные

Мы узнали о функциях, конвейерах, объектах и ​​управляющих структурах и можем найти одно из самых основных применений во многих языках программирования: переменные. В шаблоне они используются реже. Мы увидим, как их использовать, чтобы упростить код и лучше его использовать.with с участием range

В предыдущем примере мы увидели сбой этого кода:

  {{- with .Values.favorite}}
  drink: {{.drink | default "tea" | quote}}
  food: {{.food | upper | quote}}
  release: {{.Release.Name}}
  {{- end}}

Release.NameНе здесьwithВ рамках блока. Один из способов решить проблему с областью видимости — назначить объекты переменным, к которым можно получить доступ независимо от текущей области.

В шаблонах Helm переменная — это именованная ссылка на другой объект. Следует этой форме$name. Переменным присваивается специальный оператор присваивания::=. Мы можем использовать переменные, чтобы переписать Release.Name выше.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite}}
  drink: {{.drink | default "tea" | quote}}
  food: {{.food | upper | quote}}
  release: {{$relname}}
  {{- end}}

Обратите внимание, что прежде чем мы начнемwithПеред блоком присваиваем$relname :=.Release.Name. сейчас на withВнутри блока$relnameПеременная по-прежнему указывает на название публикации.

Дадим такой результат:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: viable-badger-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  release: viable-badger

Переменная вrangeОсобенно полезно в шлейфе. Их можно использовать для объектов, подобных списку, для захвата как индекса, так и значения:

toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings}}
      {{$index}}: {{ $topping }}
    {{- end}}

нота,rangeСначала переменная, затем оператор присваивания, затем список. Это присвоит целочисленный индекс (начиная с нуля) для$index, Значение для$topping. Его запуск даст:

  toppings: |-
      0: mushrooms
      1: cheese
      2: peppers
      3: onions

Для структур данных, которые имеют как ключи, так и значения, мы можем использоватьrangeЧтобы получить и то, и другое. Например, мы можем.Values.favoriteЦиркулируйте так:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  {{- range $key, $val := .Values.favorite}}
  {{$key}}: {{ $val | quote }}
  {{- end}}

Теперь в первой итерации$key Да drink$val Да coffee,второй раз,$keyЕда,$valБудет пицца. Выполнение приведенного выше кода приведет к следующему:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eager-rabbit-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza"

Переменные обычно не являются «глобальными». Их область действия — это блок, в котором они расположены. Раньше мы присваивали значения на верхнем уровне шаблона.$relname. Эта переменная будет работать в рамках всего шаблона. Но в нашем последнем примере$key с участием $valТолько в этом{{range...}}{{end}}Работает в рамках блока.

Однако всегда есть глобальная переменная.$Переменная — эта переменная всегда указывает на корневой контекст. Это очень полезно, когда вы просматриваете диапазон, в котором вам нужно знать название выпуска диаграммы.

например:

{{- range .Values.tlsSecrets}}
apiVersion: v1
kind: Secret
metadata:
  name: {{.name}}
  labels:
    # Many helm templates would use `.` below, but that will not work,
    # however `$` will work here
    app.kubernetes.io/name: {{template "fullname" $}}
    # I cannot reference .Chart.Name, but I can do $.Chart.Name
    helm.sh/chart: "{{$.Chart.Name}}-{{ $.Chart.Version }}"
    app.kubernetes.io/instance: "{{$.Release.Name}}"
    app.kubernetes.io/managed-by: "{{$.Release.Service}}"
type: kubernetes.io/tls
data:
  tls.crt: {{.certificate}}
  tls.key: {{.key}}
---
{{- end}}

Пока что мы рассмотрели только один шаблон, объявленный в одном файле. Но одной из мощных функций языка шаблонов Helm является его способность объявлять несколько шаблонов и использовать их вместе. Мы обсудим это в следующем разделе.

5.10 Шаблон именования

Пришло время создать более одного шаблона. В этом разделе мы увидим, как определять именованные шаблоны в одном файле, а затем использовать их в другом месте. Именованный шаблон (иногда называемый частичным или подшаблоном) — это шаблон, который ограничен файлом и которому присвоено имя. У нас есть два метода создания и несколько различных способов использования.

В разделе «Управление потоком» мы представили три действия для шаблонов объявлений и управления:definetemplate,с участием block. В этом разделе мы представим эти три действия и представим одноincludeФункция иtemplateПодобные функции.

При именовании шаблонов следует обратить внимание на одну важную деталь: имя шаблона является глобальным. Если объявлены два шаблона с одинаковым именем, последний загруженный является эффективным шаблоном. Поскольку шаблоны в поддиаграмме компилируются вместе с шаблоном верхнего уровня, будьте осторожны, чтобы назвать шаблон именем конкретной диаграммы.

Общее соглашение об именах — добавить имя диаграммы к каждому определенному шаблону:{{define "mychart.labels"}}. Используя конкретное имя диаграммы в качестве префикса, мы можем избежать любых конфликтов, которые могут возникнуть из-за двух разных диаграмм с одним и тем же шаблоном имени.

5.10.1 частичные и_файл

До сих пор мы использовали один файл, и один файл содержит один шаблон. Но язык шаблонов Helm позволяет создавать указанные встроенные шаблоны, к которым можно получить доступ по имени.

Прежде чем мы начнем писать эти шаблоны, стоит упомянуть некоторые соглашения об именах файлов:

  • Большинство документовtemplates/Считается, что содержит манифесты Kubernetes
  • NOTES.txtЭто исключение
  • Имя подчеркнуто (_) Предполагается, что не имеет внутреннего манифеста. Эти файлы не отображают определения объектов Kubernetes, но могут использоваться везде в других шаблонах диаграмм для вызова.

Эти файлы используются для хранения частичных и вспомогательных программ. Фактически, когда мы впервые создали mychart, мы увидели файл с именем_helpers.tpl. Этот файл является расположением по умолчанию для частичных файлов шаблона.

5.10.2 Использованиеdefine с участием templateОбъявить и использовать шаблоны

Шесть реальных боев

6.1 Создание диаграмм

  • Go2cloud-api-doc, созданный с помощью slate, будет преобразован в диаграммы с помощью helm для облегчения последующего развертывания.
helm create go2cloud-api-doc
 
[root@master go2cloud-api-doc]# tree 
.
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── NOTES.txt
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
 
3 directories, 8 files
 
 
 # Настроить развертывание
[root@master go2cloud_api_doc_charts]# egrep "^$|^#" -v go2cloud-api-doc/templates/deployment.yaml  
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "go2cloud-api-doc.fullname" . }}
  labels:
{{ include "go2cloud-api-doc.labels" . | indent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "go2cloud-api-doc.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "go2cloud-api-doc.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      imagePullSecrets: 
        - name: {{ .Values.imagePullSecrets }}
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: {{ .Values.service.port }}
              protocol: TCP
          livenessProbe:
            {{- toYaml .Values.livenessProbe | nindent 12  }}
          readinessProbe:
            {{- toYaml .Values.readinessProbe | nindent 12  }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}
 
 
 # Настроить сервис
[root@master go2cloud_api_doc_charts]# egrep "^$|^#" -v go2cloud-api-doc/templates/service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: {{ include "go2cloud-api-doc.fullname" . }}
  labels:
{{ include "go2cloud-api-doc.labels" . | indent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.port }}
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}      
  selector:
    app.kubernetes.io/name: {{ include "go2cloud-api-doc.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
 
 
 # Настроить значения
[root@master go2cloud_api_doc_charts]# egrep "^$|^#|^[[:space:]]+#" -v go2cloud-api-doc/values.yaml
replicaCount: 1
image:
  repository: 10.234.2.218/go2cloud/go2cloud-api-doc
  tag: latest
  pullPolicy: Always
imagePullSecrets: registry-secret
nameOverride: ""
fullnameOverride: ""
service:
  type: NodePort
  port: 4567
  nodePort: 30567
ingress:
  enabled: false
  annotations: {}
  hosts:
    - host: chart-example.local
      paths: []
  tls: []
resources: 
  requests:
    cpu: 1000m
    memory: 1280Mi
  limits:
    cpu: 1000m
    memory: 1280Mi
livenessProbe:
  tcpSocket:
    port: 4567
  initialDelaySeconds: 10
  failureThreshold: 2 
  timeoutSeconds: 10
readinessProbe:
  httpGet:
    path: /#introduction
    port: http
  initialDelaySeconds: 5
  failureThreshold: 2 
  timeoutSeconds: 30
nodeSelector: {}
tolerations: []
affinity: {}
 
[root@master go2cloud_api_doc_charts]# egrep "^$|^#|^[[:space:]]+#" -v go2cloud-api-doc/Chart.yaml 
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: go2cloud-api-doc
version: 0.1.0
 
 
 # Развертывание
[root@master go2cloud_api_doc_charts]# helm install -n go2cloud-api-doc -f go2cloud-api-doc/values.yaml go2cloud-api-doc/                  
NAME:   go2cloud-api-doc
LAST DEPLOYED: Wed Jul 31 14:34:21 2019
NAMESPACE: default
STATUS: DEPLOYED
 
RESOURCES:
==> v1/Deployment
NAME              READY  UP-TO-DATE  AVAILABLE  AGE
go2cloud-api-doc  0/1    1           0          0s
 
==> v1/Pod(related)
NAME                               READY  STATUS             RESTARTS  AGE
go2cloud-api-doc-7cfb7bb795-clrz8  0/1    ContainerCreating  0         0s
 
==> v1/Service
NAME              TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)         AGE
go2cloud-api-doc  NodePort  10.96.228.251  <none>       4567:30567/TCP  0s
 
 
NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services go2cloud-api-doc)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT
 
[root@master go2cloud_api_doc_charts]# helm ls go2cloud-api-doc
NAME                    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
go2cloud-api-doc        1               Wed Jul 31 14:34:21 2019        DEPLOYED        go2cloud-api-doc-0.1.0  1.0             default  
 
[root@master go2cloud_api_doc_charts]# kubectl get deployment go2cloud-api-doc
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
go2cloud-api-doc   0/1     1            0           10m
 
[root@master go2cloud_api_doc_charts]# kubectl get pods |grep go2cloud-api-doc
go2cloud-api-doc-7cfb7bb795-clrz8                         0/1     CrashLoopBackOff   7          10m
 
[root@master go2cloud_api_doc_charts]# kubectl get svc go2cloud-api-doc
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
go2cloud-api-doc   NodePort   10.96.228.251   <none>        4567:30567/TCP   10m
 
 
 
 # Бейл
[root@master go2cloud_api_doc_charts]# helm package ./go2cloud-api-doc/
Successfully packaged chart and saved it to: /data/go2cloud_api_doc_charts/go2cloud-api-doc-0.1.0.tgz
[root@master go2cloud_api_doc_charts]# tree 
.
├── go2cloud-api-doc
│   ├── charts
│   ├── Chart.yaml
│   ├── templates
│   │   ├── deployment.yaml
│   │   ├── _helpers.tpl
│   │   ├── NOTES.txt
│   │   ├── service.yaml
│   │   └── tests
│   │       └── test-connection.yaml
│   └── values.yaml
└── go2cloud-api-doc-0.1.0.tgz
 
4 directories, 8 files
 
 
 # Количество копий обновления
helm upgrade go2cloud-api-doc --set replicaCount=2 go2cloud-api-doc/

6.2 Настроить minior

Храните созданные диаграммы на minio и развертывайте minior в k8s

  • Создайте локальный каталог диаграмм
mkdir minio-chart
  • Упакуйте измененный файл диаграммы
helm package redis
  • Скопируйте пакет в созданный локальный каталог диаграммы
cp redis-8.0.5.tgz /root/minio-chart/
  • Обновите индекс индекса в каталоге / root / minio-chart /
helm repo index minio-chart/ --url http://10.234.2.204:31311/minio/common-helm-repo/
  • Загрузите index.yaml и пакет диаграмм в minio
mc cp index.yaml minio/common-helm-repo/
mc cp redis-8.0.5.tgz minio/common-helm-repo/
  • Загрузите созданные графики в minio
helm repo add monocular https://helm.github.io/monocular
helm install -n monocular monocular/monocular
 
mc cp go2cloud-api-doc-0.1.0.tgz minio/common-helm-repo


можно найти в${HOME}/.mc/config.jsonПросмотр ключевой информации в формате.

  • проверка

6.3 Выгрузка на общий рулевой склад

Созданный пакет диаграмм может быть загружен на склад руля, может быть размещен в вашем собственном частном складе, перенаправлен в: kubeapps / Monocular / minior и т. Д., Вы можете использовать команду helm для установки одним щелчком мыши.

Выгрузка в общедоступные облачные хранилища, такие как Apphub, в настоящее время созданный Alibaba в Китае. В нынешней облачной экосистеме многие зрелые программы с открытым исходным кодом были преобразованы в Helm Charts, что делает его очень удобным для пользователей для загрузки и использования, например Nginx, Apache, Elasticsearch, Redis и др. Однако до выпуска центра приложений Open Cloud Native Application Center (Helm Charts China Station) отечественным пользователям было сложно загружать и использовать эти диаграммы напрямую. Теперь AppHub не только синхронизирует все приложения в официальном Helm Hub в режиме реального времени для внутренних пользователей, но также автоматически заменяет все недоступные зеркальные URL-адреса в этих диаграммах (например, gcr.io, quay.io и т. Д.), Что наконец позволяет отечественным разработчикам пройти helm install становится возможным приложение «установка в один клик».

Для конкретной отправки ваших собственных графиков, пожалуйста, обратитесь к:https://github.com/cloudnativeapp/charts/pulls?spm=a2c6h.13155457.1383030.1.3347b579urlAo7

Это грифельная диаграмма, которую я загрузил,Slate helps you create beautiful, intelligent, responsive API documentation.

https://developer.aliyun.com/hub/detail?spm=a2c6h.12873679.0.0.61731107C921or&name=slate&version=v2.3.1#/?_k=ayosl1

Приветствуются лайки.

Семь ссылок по теме

Нажмите, чтобы увидеть больше

Kubernetes

Эта статья впервые была опубликована на MOOC.com, укажите источник для перепечатки, спасибо за сотрудничество

OF: KaliArch
ссылка: http://www.imooc.com/article/291355
Источник: Mukenet
Эта статья впервые была опубликована на MOOC.com, укажите источник для перепечатки, спасибо за сотрудничество

Источник: https://russianblogs.com/article/18281209526/

Was this helpful?

0 / 0