为什么 pod yaml 文件中的容器对象具有 "list value" 而不是 "map value"

why container object in pod yaml file has "list value" rather than a "map value"

在 kubernetes 的 pod 创建 yaml 文件或部署 yaml 文件中,为什么 Containers key 有一个列表值 - 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

容器中有列表值,因为一个 pod 可以由多个容器组成。

pod 代表了 kubernetes 中最小的构建块。 您总是在容器容器上部署和操作,而不是单独部署容器。

关于pods的关键是,当一个pod包含多个容器时,所有容器总是运行在一个工作节点上,它永远不会跨越多个工作节点。

Pod 能够运行连接多个容器。这就是 containers 对象是列表而不是映射的原因。

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

如果containers 是一个映射对象,则不能将配置文件写入一个pod 中的运行 个多个容器。希望这个回答能解决你的疑惑。

kubernetes yaml manifests中使用这两个结构是非常合理的,如果你仔细观察,它也变得非常直观:

Maps(又名 Dictionaries用于提供一组 key: value 对。 请注意,密钥在一个这样的集合,例如您在 Deployment 定义的 metadata 部分提供了不同的 labels 集。 metadata 元素也是 Dictionary 的形式,因为它包含一组唯一键(在这种特殊情况下为 namelabels)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
    type: front-end

再举一个例子,让我们看一下spec部分。请注意,作为 spec 元素子元素的所有三个键,即 replicasselectortemplate,在整个集合中都是唯一的,这就是它们在一个集合中的原因Dictionary(或 Map)的形式:

spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx

Lists(又名Arrays用于当我们需要提供objects/elements的List(或Array)时与 Deployment 定义中的 containers 相同类型

containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

container 元素是一个数组,因为它可能包含许多 objects/elements/相同类型的项目(在本例中为容器),它们可以具有相同的属性。在 container 部分,您可以定义许多容器,每个容器都有其独特的 nameimageports-符号表示数组的一个元素或项目。请注意,此类元素元素内部的结构是 MapDictionary),并且如前面的示例一样,它包含 一组具有相应值的唯一键

这两种结构的使用非常灵活,因为它们可以相互嵌套,例如你可以有一个 DictionariesLists (在 containers 的情况下), Dictionaries 哪些值是其他 Dictionaries 以及 Dictionaries 包含Lists,穷尽所有可能性(这种情况的例子是 spec 元素,它是一个 Dictionary 其中包含 containers 键,它是一个列表(这个 [= 的值58=] 是 itemslist/array


关于您的具体问题:

why Containers key has a list value - name: memory-demo-ctr rather than we can simply provide the map value name: memory-demo-ctr (why we're providing - symbol)?

请注意,container 键的列表值(列表项)不仅是 name 元素,而且是 container 下同一缩进级别的整个结构。正如我在上面已经提到的,一个列表项由 - 符号表示。在您的问题中发布的示例中,键 nameimage 及其各自的值属于 list (array) 的相同 element/item 并且它们形成另一个嵌套 dictionary (map)。所以它不是 name 元素前面必须有 - 字符,而是 container 元素下的整个结构(在本例中为 Dictionary/Map )。当您定义另一个容器(容器列表的另一项)时,它总是以另一个 - 字符开头,无论其中的第一个元素是否为 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 通常放在第一个只是一个约定。 我再强调一下:这些不是上面例子中的nameimagecommand,而是整个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/elementscontainers 列表(同时是属于 spec 字典的 keys 之一)。是的,这个 key 的值是一个 list 所以我们可以说整个 containers 元素是一个列表。

我希望它阐明了这两种结构的用法并解释了它们之间的区别。