将值中包含双引号 (") 的变量从 K8s 部署传递到容器

Sal*_*ada 6 variables statsd kubernetes prometheus

我正在尝试将 statsd 导出器 ( https://github.com/prometheus/statsd_exporter ) 软件部署为 K8s 集群中的 docker 容器。但是,我希望一些参数是可配置的。为了做到这一点,我通过 K8s 部署以 yaml 格式将一些参数传递给容器。当这些参数不包含双引号字符 (") 时,一切正常。但是,如果引入的变量的所需值包含双引号,K8s 会以错误的方式解释它们(类似的内容在Pass json string to environment 中有描述)Envoy 的 k8s 部署中的变量)。我想设置的是--statsd.listen-tcp=":<port>"参数,我在 K8s 部署中使用commandargs

- name: statsd-exporter
  image: prom/statsd-exporter:v0.12.2
    ...
  command: ["/bin/statsd_exporter"]
  args: ['--log.level="debug"', '--statsd.listen-tcp=":9999"']
Run Code Online (Sandbox Code Playgroud)

当我在 K8s 中部署它并检查“正在运行”部署的内容时,一切似乎都是正确的:

command:
- /bin/statsd_exporter
args:
- --log.level="debug"
- --statsd.listen-tcp=":9999"
Run Code Online (Sandbox Code Playgroud)

但是,容器永远不会启动,并出现以下错误:

time="..." level=fatal msg="Unable to resolve \": lookup \": no such host" source="main.go:64"

我认为 K8s 试图“转义”双引号,并将它们传递给容器,将反斜杠添加到容器中,因此后者无法理解它们。我也曾尝试写args

args: ["--log.level=\"debug\"", "--statsd.listen-tcp=\":9999\""]
Run Code Online (Sandbox Code Playgroud)

同样的事情也会发生。我也尝试将它们作为 env 变量传递,并且总是发生同样的问题:双引号没有以正确的方式解析。

关于一些可能的解决方案的任何想法?

谢谢!

api*_*sim 2

根据源代码,statsd-exporter 使用kingpin进行命令行和标志解析器。如果我没记错的话,kingpin 并不要求值用双引号括起来。

我建议尝试:

- name: statsd-exporter
  image: prom/statsd-exporter:v0.12.2
    ...
  command: ["/bin/statsd_exporter"]
  args:
  - --log.level=debug
  - --statsd.listen-tcp=:9999
Run Code Online (Sandbox Code Playgroud)

原因是,根据此处的源代码,输入值statsd.listen-tcp被分为主机和端口,并且似乎每个错误消息的主机都获取双引号字符的值"