почему контейнерный объект в файле pod yaml имеет «значение списка», а не «значение карты» - PullRequest
0 голосов
/ 08 ноября 2019

В файлах yaml для создания модулей или в файлах yaml для развертывания в kubernetes, почему ключ Containers имеет значение списка - name: memory-demo-ctr, а не мы можем просто предоставить значение карты name: memory-demo-ctr (почему мы предоставляем символ -)?

Я пытался смотреть через Интернет, но не мог найти решение.

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Pod способен запускать несколько контейнеров. По этой причине containers объект является списком, а не картой.

kind: Pod
...
spec:
  containers:
  - name: busybox
    image: busybox:latest
  - name: nginx
    image: nginx:1.7.9
  - name: redis
    image: redis:latest

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

0 голосов
/ 08 ноября 2019

Использование обеих упомянутых структур в манифестах 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 является списком.

Я надеюсь, что он разъяснил использование обеих структур и объяснил различия между ними.

0 голосов
/ 08 ноября 2019

У вас есть значение списка в контейнерах, поскольку модуль может состоять из нескольких контейнеров.

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

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

...