带有 -c 参数 returns 的 Kubernetes /bin/bash - :无效选项

Kubernetes /bin/bash with -c argument returns - : invalid option

我的 values.yaml 中有这个定义,提供给 job.yaml

command: ["/bin/bash"]
args: ["-c", "cd /opt/nonrtric/ric-common/ansible/; cat group_vars/all"]

但是,在 pod 初始化后,我收到此错误: /bin/bash: - : invalid option

如果我尝试这个语法:

command: ["/bin/sh", "-c"]
args: 
   - >
   cd /opt/nonrtric/ric-common/ansible/ &&
   cat group_vars/all

我收到此错误:Error: failed to start container "ric-register-avro": Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "/bin/sh -c": stat /bin/sh -c: no such file or directory: unknown

镜像中同时提供了sh和bash,为CentOS 7

job.yaml

---
apiVersion: batch/v1
kind: Job
metadata:
  name: ric-register-avro
spec:
  backoffLimit: 0
  template:
    spec:
      containers:
        - image: "{{ .Values.ric_register_avro_job.image }}"
          name: "{{ .Values.ric_register_avro_job.name }}"
          command: {{ .Values.ric_register_avro_job.containers.command }}
          args: {{ .Values.ric_register_avro_job.containers.args }}
          volumeMounts:
          - name: all-file
            mountPath: "/opt/nonrtric/ric-common/ansible/group_vars/"
            readOnly: true
            subPath: all
      volumes:
        - name: all-file
          configMap:
            name: ric-register-avro--configmap
      restartPolicy: Never

values.yaml

global:
  name: ric-register-avro
  namespace: foo-bar

ric_register_avro_job:
  name: ric-register-avro
  all_file:
    rest_api_url: http://10.230.227.13/foo
    auth_username: foo
    auth_password: bar
  backoffLimit: 0
  completions: 1
  image: 10.0.0.1:5000/5gc/ric-app
  containers:
    name: ric-register-avro
    command: ["/bin/bash"]
    args: ["-c cd /opt/nonrtric/ric-common/ansible/; cat group_vars/all"]
  restartPolicy: Never

我用这个:

command: ["/bin/sh"]
args: ["-c", "my-command"]

尝试这个简单的工作我没有问题:

apiVersion: batch/v1
kind: Job
metadata:
  name: foo
spec:
  template:
    spec:
      containers:
      - name: foo
        image: centos:7
        command: ["/bin/sh"]
        args: ["-c", "echo 'hello world'"]
      restartPolicy: Never

在您的 Helm 图表中,您使用模板语法直接指定 command:args:

command: {{ .Values.ric_register_avro_job.containers.command }}
args: {{ .Values.ric_register_avro_job.containers.args }}

但是,{{ ... }} 块的输出始终是一个字符串。如果模板中的值是其他类型,如列表,它将使用一些默认的 Go 规则转换为字符串,这在 Kubernetes 上下文中不是特别有用。

Helm 包含两个文档简单的转换函数 toJsontoYaml,可以在此处提供帮助。有效的 JSON 也是有效的 YAML,因此一种简单的方法是将两部分都转换为 JSON

command: {{ toJson .Values.ric_register_avro_job.containers.command }}
args: {{ toJson .Values.ric_register_avro_job.containers.args }}

或者,如果您希望它看起来更像普通的 YAML,

          command:
{{ .Values.ric_register_avro_job.containers.command | toYaml | indent 12 }}
          args:
{{ .Values.ric_register_avro_job.containers.args | toYaml | indent 12 }}

或者,就此而言,如果您通过 Helm 值传递完整的容器描述,则足以

        containers:
          - name: ric_register_avro_job
{{ .Values.ric_register_avro_job.containers | toYaml | indent 10 }}

在所有这些情况下,我都将模板构造从第一列开始,然后使用 indent 函数正确缩进 YAML 块。仔细检查缩进并调整 indent 参数。

您还可以使用 helm template,使用与安装图表时相同的 -f 选项,仔细检查结果是否正确。

(实际上,我可能会将您显示的许多选项直接放入图表模板中,而不是将它们作为值进行配置。例如,容器名称不需要进行配置,而且我' d 通常会修复命令。对于这个非常具体的示例,您还可以在 shell 包装器中设置容器的 workingDir: 而不是 运行 cd。)