kubernetes 如何将动态参数传递给运行作业的舵形图

mbjcgjjk  于 2023-01-25  发布在  Kubernetes
关注(0)|答案(8)|浏览(155)

我想允许我们的开发人员将动态参数传递给helm模板(Kubernetes作业)。

Args:
        --arg1
        value1
        --arg2
        value2
        --sql-cmd
        select * from db

如果我使用Docker容器运行一个任务,而不使用Kubernetes,我将传递如下参数:

docker run my-image --arg1 value1 --arg2 value2 --sql-cmd "select * from db"

有没有什么方法可以模板化一个舵图中的参数,使任意数量的参数都可以传递给一个模板。
例如。

cat values.yaml
...
arguments: --arg1 value1 --arg2 value2 --sql-cmd "select * from db"
...

cat values.yaml
...
arguments: --arg3 value3
...

我尝试过几种方法,但都不成功,下面是一个例子:

Args:          
      {{  range .Values.arguments }}
        {{ . }}
      {{ end }}
z4iuyo4d

z4iuyo4d1#

是的。在values.yaml中,你需要给予它一个数组,而不是一个空格分隔的字符串。

cat values.yaml
...
arguments: ['--arg3', 'value3', '--arg2', 'value2']
...

cat values.yaml
...
arguments:
- --arg3
- value3
- --arg2
- value2
...

然后你就像你在模板中提到的那样去做:

args:          
      {{  range .Values.arguments }}
        - {{ . }}
      {{ end }}

如果你想覆盖命令行上的参数,你可以像这样用--set传递一个数组:

--set arguments={--arg1, value1, --arg2, value2, --arg3, value3, ....}
ha5z0ras

ha5z0ras2#

在值文件中,将参数定义为:

extraArgs:
  argument1: value1
  argument2: value2
  booleanArg1:

在模板中执行以下操作:

args:
{{- range $key, $value := .Values.extraArgs }}
    {{- if $value }}
    - --{{ $key }}={{ $value }}
    {{- else }}
    - --{{ $key }}
    {{- end }}
{{- end }}
zyfwsgd6

zyfwsgd63#

Rico的答案需要改进。使用前面的示例,我收到了如下错误:
templates/deployment.yaml: error converting YAML to JSON: yaml
failed to get versionedObject: unable to convert unstructured object to apps/v1beta2, Kind=Deployment: cannot restore slice from string
这是我在元素中使用昏迷的工作设置:(列表的垂直格式更易读)

cat values.yaml
...
arguments: [
    "--arg3,", 
    "value3,",
    "--arg2,",
    "value2,",
]
...

模板中的代码应该可以做到:

args: [
{{  range .Values.arguments }}
{{ . }}
{{ end }}
          ]
brccelvz

brccelvz4#

由于一些限制,我不得不使用splitdelimiter,因此在我的示例中:
deployment.yaml

{{- if .Values.deployment.args }}
        args:
        {{- range (split " " .Values.deployment.args) }}
        - {{ . }}
        {{- end }}
        {{- end }}

使用--set时:

helm install --set deployment.args="--inspect server.js" ...

结果:

- args:
    - --inspect
    - server.js
kwvwclae

kwvwclae5#

在这种情况下,参数格式需要保持一致。下面是我的案例,它工作得很好。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.app.name }}
  labels:
    app: {{ .Values.app.name }}
    instance: test
spec:
  replicas: {{ .Values.master.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.app.name }}
      instance: test
  template:
    metadata:
      labels:
        app: {{ .Values.app.name }}
        instance: test
    spec:
      imagePullSecrets:
        - name: gcr-pull-secret
      containers:
        - name: {{ .Values.app.name }}
          image: {{ .Values.app.image }}
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          args:
              [
               "--users={{int .Values.cmd.users}}",
               "--spawn-rate={{int .Values.cmd.rate}}",
               "--host={{.Values.cmd.host}}",
               "--logfile={{.Values.cmd.logfile}}",
               "--{{.Values.cmd.role}}"]
          ports:
            - containerPort: {{ .Values.container.port }}
          resources:
            requests:
              memory: {{ .Values.container.requests.memory }}
              cpu: {{ .Values.container.requests.cpu }}
            limits:
              memory: {{ .Values.container.limits.memory }}
              cpu: {{ .Values.container.limits.cpu }}

不幸的是,以下混合参数格式在容器构造中不起作用-

mycommand -ArgA valA --ArgB valB --ArgBool1 -ArgBool2 --ArgC=valC

上述命令的正确格式应为-

mycommand --ArgA=valA --ArgB=valB --ArgC=valC --ArgBool1 --ArgBool2

这可以通过以下构造来实现-

#Dockerfile last line 
ENTRYPOINT [mycommand]

#deployment.yaml
containers:
  - name: {{ .Values.app.name }}
    image: {{ .Values.app.image }}
    args: [
      "--ArgA={{ .Values.cmd.ArgA }}",
      "--ArgB={{ .Values.cmd.ArgB }}",
      "--ArgC={{ .Values.cmd.ArgC }}",
      "--{{ .Values.cmd.ArgBool1 }}",
      "--{{ .Values.cmd.ArgBool2 }}" ]

#values.yaml
cmd:
   ArgA: valA
   ArgB: valB
   ArgC: valC
   ArgBool1: "ArgBool1"
   ArgBool2: "ArgBool2"
vsnjm48y

vsnjm48y6#

helm install --name "airflow" stable/airflow --set secrets.database=mydatabase,secrets.password=mypassword
这就是我们要讨论的舵形图:https://github.com/helm/charts/tree/master/stable/airflow现在我想覆盖helm chart secrets.database和secrets.password中的默认值,所以我使用--set参数,然后它是用逗号分隔的key=value对。
helm install --name "<name for your chart>" <chart> --set key0=value0,key1=value1,key2=value2,key3=value3

l5tcr1uw

l5tcr1uw7#

你试过这个吗?

{{  range .Values.arguments }}
{{ . | quote }}
{{ end }}
zmeyuzjn

zmeyuzjn8#

Acid R的键/值解决方案是唯一对我有效的。
最后我得到了这个:
values.yaml

arguments: 
  url1: 'http://something1.example.com'
  url2: 'http://something2.example.com'
  url3: 'http://something3.example.com'
  url4: 'http://something3.example.com'

在我的模板中:

args: 
          {{- range $key, $value := .Values.arguments }}
            - --url={{ $value }}
          {{- end }}

相关问题