在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
答案 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
的形式,因为它包含一组唯一的键(在这种情况下为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
。 -
符号表示数组的一个元素或项目。请注意,此类element元素内部的结构是Map
(Dictionary
),如前面的示例一样,它包含唯一键集和相应的值。
这两个结构的使用非常灵活,因为它们可以相互嵌套在一起,例如您可以拥有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
符号表示。在您的问题键中发布的示例中,键name
和container
及其各自的值属于-
(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
,dictionary
和map
,它们是列表项,而是整个{{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
元素是一个列表。
我希望它能阐明这两种结构的用法并解释它们之间的区别。