Знакомство с Kubernetes. Часть 17: Введение в YAML

Sep 24, 2018 07:03 · 685 words · 4 minute read kubernetes

В предыдущих статьях цикла мы создавали объекты в кластере 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-формата, то всю необходимую информацию можно найти здесь.

tweet Share