【问题标题】:Mounted ConfigMap volume is not served entirely未完全提供已安装的 ConfigMap 卷
【发布时间】:2018-11-21 08:34:26
【问题描述】:

在 wwwroot/config/config.json 中有外部配置的 ASP.NET Core SPA

config.json 的内容:

{
  "termsAndConditionsLink": "https://some-dev-url.with/legal/terms/"
}

当文件没有被 ConfigMap 覆盖时,它可以正常工作,我可以获取文件的全部内容。

curl https://dev-app.com/config/config.json
{
  "termsAndConditionsLink": "https://some-dev-url.with/legal/terms/"
}

当 ConfigMap 数据通过 Volume 挂载到该路径时,并没有完全返回。

curl https://dev-app.com/config/config.json
{
  "termsAndCon

文件存在于 pod 中:

pwd
/app/wwwroot/config

ls -la
total 12
drwxrwxrwx 3 root root 4096 Nov 20 08:48 .
drwxr-xr-x 6 root root 4096 Nov 20 08:46 ..
drwxr-xr-x 2 root root 4096 Nov 20 08:48 ..2018_11_20_08_48_02.390652870
lrwxrwxrwx 1 root root   31 Nov 20 08:48 ..data ->         ..2018_11_20_08_48_02.390652870
lrwxrwxrwx 1 root root   18 Nov 20 08:48 config.json -> ..data/config.json

cat config.json
{
  "termsAndConditionsLink": "https://some-dev-url.with/legal/terms/"
}

ConfigMap.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: my-config
data:
  config.json: |-
    {
      "termsAndConditionsLink": "https://some-dev-url.with/legal/terms/"
    }

Deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-app
  labels:
    ...
spec:
  template:
    metadata:
      labels:
        ...
    spec:
      containers:
        ...
          volumeMounts:
            - name: my-volume
              mountPath: /app/wwwroot/config
      volumes:
        - name: my-volume
          configMap:
            name: my-config

【问题讨论】:

    标签: kubernetes google-kubernetes-engine configmap


    【解决方案1】:

    您的意思是,当从 ConfigMap 将卷挂载到该位置时,/app/wwwroot/config 目录中的任何其他文件都消失了?

    你试过projected卷:

    volumes:
      - name: my-volume
        projected:
          sources:
          - configMap:
              name: my-config
    

    编辑: 对于那些可能遇到此类问题并且没有阅读帖子下方消息的人 - 在与 @edbighead 交换消息后,另一个建议是在部署中使用 subPath让配置目录可写,因为 ConfigMap 卷挂载是只读的:

    mountPath: /app/wwwroot/config/config.json 
    subPath: config.json
    

    这显然 解决了问题

    【讨论】:

    • 这个目录下只有一个文件,原来的/app/wwwroot/config/config.json,当被configmap覆盖(在不同环境下使用相同的图像但不同的配置)时,它并不完全由kestrel提供,而是只有前 15 个字符。
    • @edbighead - 我显然没有仔细阅读整个问题,您提供的详细信息水平很高。这是一种奇怪的行为。请注意,它可能是 16 个字符,算上一个换行符。也许它只是在问题中,但 ConfigMap 的内容与原始 config.json 中的内容相同。当 ConfigMap 完全不同时,您会看到什么?此外,可能值得尝试在部署中使用 mountPath: /app/wwwroot/config/config.json 并添加 subPath: config.json - 这将使 config 目录可写,因为 ConfigMap 卷挂载是只读的。
    • 谢谢,指定子路径解决了这个问题。不过,这仍然是非常奇怪的行为。
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2020-09-07
    • 2014-01-09
    • 2013-05-20
    • 2016-03-25
    相关资源
    最近更新 更多