为什么 k8s 找不到我的 configmap 并将其挂载为文件?

为什么 k8s 找不到我的 configmap 并将其挂载为文件?

我认为最简单的 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

相关内容