为什么pod yaml文件中的容器对象具有“列表值”而不是“地图值”

时间:2019-11-08 10:12:08

标签: kubernetes yaml containers kubernetes-pod

在pod创建yaml文件或kubernetes中的部署yaml文件中,为什么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 :(得分:0)

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

吊舱代表kubernetes中最小的构建基块。 不必单独部署容器,而是始终在容器吊舱中部署和操作。

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

答案 1 :(得分:0)

Pod能够运行多个容器。这就是containers对象是列表而不是地图的原因。

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

如果containers是一个映射对象,则不能编写配置文件来运行容器中的多个容器。我希望这个答案能解决您的疑问。

答案 2 :(得分:0)

kubernetes yaml清单中使用上述两个结构是很合理的,如果仔细研究,它也会变得很直观:

Maps(又名Dictionaries在提供一组key: value对时使用。请注意,这些密钥在一组这样的密钥中是唯一的,例如您在labels定义的metadata部分中提供了不同的Deployment集。 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当我们需要提供List(或Array)相同类型的对象/元素时使用类似于containers定义中的Deployment

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

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

这两个结构的使用非常灵活,因为它们可以相互嵌套在一起,例如您可以拥有Lists的{​​{1}}(例如Dictionaries),containers,其中的值是其他Dictionaries以及Dictionaries Dictionaries,以尽一切可能(这种情况的示例是Lists元素,它是一个spec,其中包含Dictionary键,该键是一个列表(此{{ 1}}是containers的{​​{1}}。


关于您的具体问题:

  

为什么Containers键具有列表值-名称:memory-demo-ctr而不是   比我们可以简单地提供映射值名称:memory-demo-ctr(为什么   我们提供-符号)?

请注意,key键的列表值(列表项)不仅是list/array元素,而且是items下相同缩进级别的整个结构。如上所述,一个列表项用container符号表示。在您的问题键中发布的示例中,键namecontainer及其各自的值属于-name)的相同元素/项目,它们形成另一个嵌套的{ {1}}(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 dictionarymap,它们是列表项,而是整个{{1} }(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元素是一个列表。

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