ConfigMap Kubernetes YAML:值中的空格导致错误

3

由于某些奇怪而未知的原因,当我使用一个包含键值对的 ConfigMap 作为环境变量在 pod 中设置(使用 envFrom),我的 pods 就无法启动。

这是我的 YAML 文件中 ConfigMap 部分的内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: all-config
data:
  # DB configuration
  dbServer: "host.docker.internal"
  dbPort: "3306"

  # problematic config
  validationQuery: 'Select 1'

如果我注释掉validationQuery键值对,pod就会启动。如果我保留它,pod将无法启动。如果我删除空格,它就可以运行!这个行为非常奇怪,因为它归结为一个空格。
有什么想法可以解释这个失败的原因?用户们是如何绕过这个问题的?能否有人尝试复现此问题?

如果您切换到双引号,会发生什么?例如:"Select 1"。 - Hackerman
你有没有任何详细的错误信息可以与我们分享? - scniro
双引号不起作用了。尝试使用单引号是一个实验。我无法从实例中获取任何日志。 - Chad Van De Hey
1
@Hackerman 因为在该标量中没有需要转义的字符,所以我不知道任何解析器(除了我的 ruamel.yaml 模块在往返模式下)在加载值时会有单引号标量('Select 1')、双引号标量("Select 1")和纯标量(Select 1)之间的差异。您能详细说明一下为什么您认为改用双引号会有所不同吗?(在示例中唯一会产生差异的引号是围绕 3306 的引号,当它们被移除时会产生差异) - Anthon
1个回答

3

我真诚地认为,这与你的应用程序不喜欢带空格的环境变量有关。我自己尝试过,当我进入Pod/容器时,可以看到带有空格的环境变量完好无损。

PodSpec:

...
spec:
  containers:
  - command:
    - /bin/sleep
    - infinity
    env:
    - name: WHATEVER
      valueFrom:
        configMapKeyRef:
          key: myenv
          name: j
...

$ kubectl get cm j -o=yaml
apiVersion: v1
data:
  myenv: Select 1
kind: ConfigMap
metadata:
  creationTimestamp: 2018-10-10T20:44:02Z
  name: j
  namespace: default
  resourceVersion: "11111111"
  selfLink: /api/v1/namespaces/default/configmaps/j
  uid: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa

root@mypod-xxxxxxxxxx-xxxxx:/# echo $WHATEVER
Select 1
root@mypod-xxxxxxxxxx-xxxxx:/#

感谢您运行该测试!不幸的是,我可以保证该应用程序对该值没有问题,因为它在非 k8 的环境中作为环境变量工作。 - Chad Van De Hey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接