Знакомство с Kubernetes. Часть 17: Введение в YAML
Sep 24, 2018 07:03 · 685 words · 4 minute read
В предыдущих статьях цикла мы создавали объекты в кластере Kubernetes
несколькими способами - исключительно с помощью командной строки или с использованием манифестов в формате JSON или YAML. В этой статье подробнее остановимся на описании манифестов с помощью YAML-синтаксиса - как наиболее удобного (на мой взгляд).
YAML (Yet Another Markup Language или YAML Ain’t Markup Language) - расшифровка зависит от вашего восприятия - это простой для понимания человеком, структурированный формат описания конфигурации.
Использование YAML для описания k8s-манифестов предоставляет целый ряд преимуществ, например:
- удобство - больше не нужно добавлять все параметры в командной строке при создании объекта в кластере;
- поддержка: YAML-файлы могут храниться в системе контроля версий, благодаря чему легко можно отслеживать их изменения;
- гибкость: с помощью YAML-манифестов можно создавать гораздо более сложные структуры, чем только в командной строке.
По сути, YAML - это надмножество (superset) JSON, следовательно любой валидный (правильный) JSON-файл также является валидным файлом YAML. То есть, если вы ничего не слышали о YAML-формате, но хорошо знаете JSON - у вас уже есть все необходимое для старта. Ни в коем случае не призываю целиком и полностью отказываться от JSON - могут быть ситуации, когда он более удобен.
К счастью, для создания корректного описания манифеста в YAML-формате достаточно знать только два типа структур:
- списки (lists);
- мапы (maps).
Этого достаточно. Конечно, это могут быть мапы списков (или списки мап), но наличия этих двух структур вполне хватит.
Начнем со знакомства с мапами (maps). Мапы позволяют связывать (маппить) пары ключ-значение - это именно то, что нужно при описании конфигурационных файлов. Например, у вас может быть файл конфигурации, который выглядит следующим образом:
---
apiVersion: v1
kind: Pod
Здесь первая линия (три дефиса) - это разделитель (нужен, если вы планируете использовать несколько разных структур в одном файле), далее описаны два ключа (apiVersion
и kind
) и их значения (v1
и Pod
соответственно).
В формате JSON это выглядело бы так:
{
"apiVersion": "v1",
"kind": "Pod"
}
Можно описывать более сложные структуры, у которых значением для определенного ключа может быть еще одна мапа:
---
apiVersion: v1
kind: Pod
metadata:
name: test-site
labels:
app: web
Как видим, у ключа metadata
значением будут еще две мапы (с ключами name
и labels
), а у ключа labels
, в свою очередь, значением будет мапа с ключом app
. Можно создавать такие структуры любого уровня вложенности - все зависит от ваших потребностей.
YAML-процессор “понимает” связанность этих элементов благодаря форматированию - обратите внимание на отступы. В этом примере для отступов используются 2 пробела, но на самом деле количество пробелов не имеет значения - главное соблюдать уровни отступов. Например, ключи name
и labels
находятся на одном уровне отступов, следовательно процессор будет считать, что они являются значением для ключа одной и той же мапы; точно также YAML-процессор знает, что app
- это значение для ключа labels
.
Небольшой совет: не стоит использовать в YAML-файле в качестве отступов табуляцию.
Итак, если второй пример преобразовать в JSON, то получим следующее:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "test-site",
"labels": {
"app": "web"
}
}
}
Что касается YAML-списков, то по сути это просто перечисление объектов, например:
args
- sleep
- "1000"
- message
- "Hello world!"
Как видно из примера, можно указать любое количество элементов в списке (главное, чтобы каждый новый элемент находится в отдельной строке и начинался с дефиса). В JSON это будет выглядеть так:
{
"args": ["sleep", "1000", "message", "Hello world!"]
}
Ну и конечно же элементами списка могут быть мапы:
---
apiVersion: v1
kind: Pod
metadata:
name: test-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: test
image: ealebed/test:v1
ports:
- containerPort: 88
Эквивалент в JSON-формате:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "test-site",
"labels": {
"app": "web"
}
},
"spec": {
"containers": [{
"name": "front-end",
"image": "nginx",
"ports": [{
"containerPort": "80"
}]
},
{
"name": "test",
"image": "ealebed/test:v1",
"ports": [{
"containerPort": "88"
}]
}]
}
}
Используя описанный в YAML-файле манифест, можно создать в Kubernetes
объект под (Pod
). Для этого нужно выполнить команду:
kubectl create -f pod.yaml
pod "test-site" created
Подробнее о подах и их описании в YAML-формате мы уже говорили в этой статье, кроме того дополнительную информацию можно найти в официальной документации.
Что касается YAML-формата, то всю необходимую информацию можно найти здесь.