为什么 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
的形式,因为它包含一组唯一键(在这种特殊情况下为 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
)用于当我们需要提供objects/elements的List
(或Array
)时与 Deployment
定义中的 containers
相同类型:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
container
元素是一个数组,因为它可能包含许多 objects/elements/相同类型的项目(在本例中为容器),它们可以具有相同的属性。在 container
部分,您可以定义许多容器,每个容器都有其独特的 name
、image
和 ports
。 -
符号表示数组的一个元素或项目。请注意,此类元素元素内部的结构是 Map
(Dictionary
),并且如前面的示例一样,它包含 一组具有相应值的唯一键 。
这两种结构的使用非常灵活,因为它们可以相互嵌套,例如你可以有一个 Dictionaries
的 Lists
(在 containers
的情况下), Dictionaries
哪些值是其他 Dictionaries
以及 Dictionaries
包含Lists
,穷尽所有可能性(这种情况的例子是 spec
元素,它是一个 Dictionary
其中包含 containers
键,它是一个列表(这个 [= 的值58=] 是 items
的 list/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
下同一缩进级别的整个结构。正如我在上面已经提到的,一个列表项由 -
符号表示。在您的问题中发布的示例中,键 name
和 image
及其各自的值属于 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
通常放在第一个只是一个约定。 我再强调一下:这些不是上面例子中的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
列表(同时是属于 spec
字典的 keys
之一)。是的,这个 key
的值是一个 list
所以我们可以说整个 containers
元素是一个列表。
我希望它阐明了这两种结构的用法并解释了它们之间的区别。
在 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
的形式,因为它包含一组唯一键(在这种特殊情况下为 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
)用于当我们需要提供objects/elements的List
(或Array
)时与 Deployment
定义中的 containers
相同类型:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
container
元素是一个数组,因为它可能包含许多 objects/elements/相同类型的项目(在本例中为容器),它们可以具有相同的属性。在 container
部分,您可以定义许多容器,每个容器都有其独特的 name
、image
和 ports
。 -
符号表示数组的一个元素或项目。请注意,此类元素元素内部的结构是 Map
(Dictionary
),并且如前面的示例一样,它包含 一组具有相应值的唯一键 。
这两种结构的使用非常灵活,因为它们可以相互嵌套,例如你可以有一个 Dictionaries
的 Lists
(在 containers
的情况下), Dictionaries
哪些值是其他 Dictionaries
以及 Dictionaries
包含Lists
,穷尽所有可能性(这种情况的例子是 spec
元素,它是一个 Dictionary
其中包含 containers
键,它是一个列表(这个 [= 的值58=] 是 items
的 list/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
下同一缩进级别的整个结构。正如我在上面已经提到的,一个列表项由 -
符号表示。在您的问题中发布的示例中,键 name
和 image
及其各自的值属于 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
通常放在第一个只是一个约定。 我再强调一下:这些不是上面例子中的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
列表(同时是属于 spec
字典的 keys
之一)。是的,这个 key
的值是一个 list
所以我们可以说整个 containers
元素是一个列表。
我希望它阐明了这两种结构的用法并解释了它们之间的区别。