Использование обеих упомянутых структур в манифестах kubernetes yaml вполне оправдано, и если вы посмотрите поближе, оно также станет довольно интуитивным:
Maps
(он же * 1006)*) используются при предоставлении набора key: value
пар. Обратите внимание, что ключи являются уникальными в одном таком наборе, например, вы предоставляете другой набор labels
в metadata
разделе вашего Deployment
определение. Элемент metadata
также имеет форму Dictionary
, поскольку содержит набор уникальных ключей (name
и labels
в данном конкретном случае).
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
type: front-end
Просто, чтобы привести еще один пример, давайте посмотрим на раздел spec
. Обратите внимание, что все три ключа, являющиеся потомками элемента spec
, а именно replicas
, selector
и template
, являются уникальными во всем наборе, и поэтому они имеют форму Dictionary
(илиMap
):
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
Lists
(он же Arrays
) используется, когда нам нужно предоставить List
(или Array
) объектов / элементовтот же тип , как в случае containers
в Deployment
определении:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
container
элемент является массивом, так как он может содержать множество объектов / элементов / элементов одного типа (вэто контейнеры), которые могут иметь такие же свойства. В разделе container
вы можете определить множество контейнеров, каждый из которых будет иметь свои уникальные name
, image
и ports
. -
знак обозначает один элемент или элемент массива . Обратите внимание, что структура внутри такого элемента элемента имеет вид Map
(Dictionary
) и, как и в предыдущих примерах, содержит набор уникальных ключей с соответствующими значениями.
Использование этихдве структуры достаточно гибкие, так как они могут быть вложены друг в друга, например, вы можете иметь Lists
из Dictionaries
(как в случае containers
), Dictionaries
, значения которых являются другими Dictionaries
, а также Dictionaries
содержащий Lists
, чтобы исчерпать все возможности (примером такого случая является spec
элемент, который является Dictionary
, который среди прочего содержит ключ containers
, который является списком (значение этого key
является list/array
из items
).
Что касается вашего конкретного вопроса:
почему ключ Containers имеет значение списка - name: memory-demo-ctr, а не простоукажите имя значения карты: memory-demo-ctr (почему мы предоставляем символ)?
Обратите внимание, что значение списка (элемент списка) для клавиши container
- это не только name
элемент, но вся структура на том же уровне отступа подcontainer
. Как я уже упоминал выше, один элемент списка обозначается знаком -
. В примере, размещенном в вашем вопросе, ключи name
и image
с соответствующими значениями принадлежат одному и тому же элементу / элементу list
(array
) и образуют другой вложенный dictionary
(map
). Таким образом, перед элементом -
должен стоять не элемент name
, а вся структура (в данном случае Dictionary/Map
) в элементе container
. Когда вы определяете другой контейнер (другой элемент списка контейнеров), он всегда начинается с другого символа -
, независимо от того, является ли первый элемент в нем name
. Например, вы можете построить свою структуру следующим образом, и она также будет правильной:
containers:
- name: nginx
image: nginx:1.7.9
- image: redis
name: redis
- command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
image: busybox
name: myapp-container
Элементы dictionary
(map
) не обязательно должны отображаться в том же порядке. Это просто соглашение, что name
обычно ставится первым. Я еще раз подчеркну: это не name
, image
и command
в приведенном выше примере, которые являются элементами списка, а всей структурой dictionary
(map
), которой предшествует-
символов, то есть:
первый:
- name: nginx
image: nginx:1.7.9
второй:
- image: redis
name: redis
и третий:
- command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
image: busybox
name: myapp-container
items
/ elements
из списка containers
(который в то же время является одним из keys
, принадлежащих словарю spec
). Да, значение этого key
равно list
, поэтому мы можем сказать, что весь элемент containers
является списком.
Я надеюсь, что он разъяснил использование обеих структур и объяснил различия между ними.