我认为最简单的 k8s 部署使用 configmap 值作为文件,但它拒绝工作,而是返回此错误消息:
The Pod "configmap-demo-pod" is invalid: spec.containers[0].volumeMounts[0].name: Not found: "the-thing"
这是我发现的淡化版本在文档中所以我完全不知道我错过了什么。
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
the-thing: |
hello
---
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- mountPath: "/"
name: the-thing
volumes:
- name: config
configMap:
name: demo
items:
- key: the-thing
path: "filename"
答案1
您已定义如下卷:
volumes:
- name: config
configMap:
name: demo
items:
- key: the-thing
path: "filename"
该卷名为config
,因为您有name: config
。它引用了一个ConfigMap
名为demo
,并且您(试图)明确仅包含一个名为 的键the-thing
。
将此卷装入容器中时,可以使用分配给该卷的名称来引用它。config
所以:
volumeMounts:
- name: config
mountPath: /some/path
您永远不会希望mountPath
这样做,/
因为那样会尝试将卷挂载到文件系统根目录的内容上,从而导致容器无法使用。
但是让我们稍微回顾一下。
给定一个ConfigMap
具有多个键的,如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
the-thing: |
hello
an-example: |
this is a test
我们可以揭露全部文件系统上的文件密钥如下:
apiVersion: v1
data:
an-example: |
this is a test
the-thing: |
hello
kind: ConfigMap
metadata:
name: demo
---
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- command:
- sleep
- inf
image: alpine
name: demo
volumeMounts:
- mountPath: /config
name: config
volumes:
- configMap:
name: demo
name: config
如果我们将它们部署到 Kubernetes 中,我们会发现:
$ kubectl exec -it configmap-demo-pod -- sh
/ # ls /config
an-example the-thing
/ # cat /config/the-thing
hello
/ # cat /config/an-example
this is a test
/ #
如果我们想要公开可用密钥的子集,我们可以修改卷定义以指定密钥列表和路径, 像这样:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command:
- sleep
- inf
volumeMounts:
- mountPath: "/config"
name: config
volumes:
- name: config
configMap:
name: demo
items:
- key: the-thing
path: another-thing
这里,items
提供了我们要公开的密钥列表,以及它们在文件系统中的对应名称。在此示例中,我们将密钥公开the-thing
为名为的文件another-thing
。使用此清单进行部署可获得:
$ kubectl exec -it configmap-demo-pod -- sh
/ # ls /config
another-thing
/ # cat /config/another-thing
hello
/ #
上述两个示例将 公开ConfigMap
为目录,并允许您访问所有可用密钥(第一个示例)或密钥子集(第二个示例)。还可以使用配置subPath
中的选项将特定密钥公开为文件系统中任意位置的文件volumeMount
,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command:
- sleep
- inf
volumeMounts:
- mountPath: "/etc/the-thing"
name: config
subPath: the-thing
volumes:
- name: config
configMap:
name: demo
部署后我们可以得到:
[lars@madhatter k8s]$ kubectl exec -it configmap-demo-pod -- sh
/ # cat /etc/the-thing
hello