【问题标题】:K8 yaml : How to properly parse long string as an argumentK8 yaml:如何正确解析长字符串作为参数
【发布时间】:2021-07-14 01:43:16
【问题描述】:

听起来很简单,我只是想在运行时将下面的这 2 个命令作为参数附加到我的 pod 中。我通过进入 pod 并手动运行它们来测试这两个命令,它就像一个魅力。我只是想在 cronjob yaml 中注入这些命令并且一直在摸不着头脑。还没找到合适的方法。

命令 1

export TOKEN=`curl -H "Content-Type: application/json" -H "${API_VS_HD}" --request POST --data "{\"providerName\":\"local\",\"username\":\"admin\",\"password\":\"$PASSWORD\",\"deviceId\":\"$UUID\"}" https://$CONTROLLER_IP:444/admin/login --insecure | jq -r '.token'`

命令 2

curl -k -H "Content-Type: application/json" \
        -H "$API_VS_HD" \
        -H "Authorization: Bearer $TOKEN" \
        -X GET \
        https://$CONTROLLER_IP:444/admin/license/users

我的最终当前 cronjob.yaml 文件

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: device-cron-job
  namespace: device-purge
spec:
#Cron Time is set according to server time, ensure server time zone and set accordingly.
  schedule: "*/2 * * * *" # test
  jobTemplate:
    spec:
      template:
        spec:
          imagePullSecrets:
          - name: cron
          containers:
          - name: device-cron-pod
            image: harbor/ops5/private/:device-purge
            command: ["/bin/sh", "-c"]
            args:
             - export TOKEN="curl -H \"Content-Type: application/json\" -H \"${API_VS_HD}\" --request POST --data \"{\\\"providerName\\\":\\\"local\\\",\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"$PASSWORD\\\",\\\"deviceId\\\":\\\"$UUID\\\"}\" https://$CONTROLLER_IP:444/admin/login --insecure | jq -r '.token'";
             - command 2; # should be the curl command
            env:
            - name: AWS_REGION
              value: "us-east-1"
            - name: API_VS_HD
              value: "Accept:application/vnd.appgate.peer-v13+json"
            - name: CONTROLLER_IP
              value: "52.##.###.###"
            - name: UUID
              value: "d2b78ec2-####-###-###-#########"
            - name: PASSWORD
              valueFrom:
                secretKeyRef: 
                  name: password
                  key: password
            imagePullPolicy: Always
          restartPolicy: OnFailure
      backoffLimit: 3

没有附加我的第二个命令的当前错误:

error: error validating "cronjob.yaml": error validating data: ValidationError(CronJob.spec.jobTemplate.spec.template.spec.containers[0].args[0]): invalid type for io.k8s.api.core.v1.Container.args: got "map", expected "string"; if you choose to ignore these errors, turn validation off with --validate=false

【问题讨论】:

    标签: parsing kubernetes yaml


    【解决方案1】:

    你可以使用YAML multiline block scalars之类的东西

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: device-cron-job
      namespace: default
    spec:
    #Cron Time is set according to server time, ensure server time zone and set accordingly.
      schedule: "*/2 * * * *" # test
      jobTemplate:
        spec:
          template:
            spec:
              imagePullSecrets:
              - name: cron
              containers:
              - name: device-cron-pod
                image: harbor/ops5/private/:device-purge
                command: 
                 - "/bin/sh"
                 - -c
                 - |
                   export TOKEN=`curl -H "Content-Type: application/json" -H "${API_VS_HD}" --request POST --data "{\"providerName\":\"local\",\"username\":\"admin\",\"password\":\"$PASSWORD\",\"deviceId\":\"$UUID\"}" https://$CONTROLLER_IP:444/admin/login --insecure | jq -r '.token'`
                   curl -k -H "Content-Type: application/json" \
                   -H "$API_VS_HD" \
                   -H "Authorization: Bearer $TOKEN" \
                   -X GET \
                   https://$CONTROLLER_IP:444/admin/license/users
                env:
                - name: AWS_REGION
                  value: "us-east-1"
                - name: API_VS_HD
                  value: "Accept:application/vnd.appgate.peer-v13+json"
                - name: CONTROLLER_IP
                  value: "52.##.###.###"
                - name: UUID
                  value: "d2b78ec2-####-###-###-#########"
                - name: PASSWORD
                  valueFrom:
                    secretKeyRef: 
                      name: password
                      key: password
                imagePullPolicy: Always
              restartPolicy: OnFailure
          backoffLimit: 3
    

    否则期望是

    command: ["/bin/sh","-c"]
    args: ["command 1; command 2"]
    

    而不是

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

    因此 kubernetes 抛出错误 invalid type for io.k8s.api.core.v1.Container.args: got "map", expected "string";

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2011-02-18
      • 2018-10-15
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多