Kubernetes cronJob使用带有标头的CURL调用REST API时由于curl6失败:无法解析主机

问题描述

如何使用kubernetes在cronJob中触发restAPI [POST具有身份验证和参数的标头]。创建cron并尝试运行它时,出现以下错误

curl: (7) Failed to connect to localhost port 8080: Connection refused

当我用实际主机而不是本地主机替换主机时,它仍然给我错误

 curl: (6) Could not resolve host : xxxHostName

我可以使用命令提示符以及POSTMAN来卷发

以下是我要运行的cronJob

apiVersion: batch/v1beta1
kind: CronJob
Metadata:
  name: e2em-rule-violation-job  
spec:
  schedule: "*/3 * * * *"
  concurrencyPolicy: Allow
  FailedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: e2em-rule-violation-job 
            image: curlimages/curl:7.72.0
            args:
            - /bin/sh
            - -ec
            - "curl -H \"Authorization: Basic c3lzdGVtOm1hbmFnZQ==\" -H \"InternalUser: true\" -X POST  \"http://localhost:8080/myIntegration/rest/executeScheduledTask\""
          restartPolicy: OnFailure

以下是空试,成功,但创建后乔布斯失败

W1006 13:35:34.443357   18304 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: batch/v1beta1
kind: CronJob
Metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"batch/v1beta1","kind":"CronJob","Metadata":{"annotations":{},"name":"e2em-rule-violation-job","namespace":"default"},"spec":{"concurrencyPolicy":"Allow","FailedJobsHistoryLimit":1,"jobTemplate":{"spec":{"template":{"spec":{"containers":[{"args":["/bin/sh","-ec","curl -H \"Authorization: Basic c3lzdGVtOm1hbmFnZQ==\" -H \"InternalUser: true\" -X POST  \"http://localhost:8080/myIntegration/rest/executeScheduledTask\""],"image":"curlimages/curl:7.72.0","name":"e2em-rule-violation-job"}],"restartPolicy":"OnFailure"}}}},"schedule":"*/3 * * * *","successfulJobsHistoryLimit":3}}
  name: e2em-rule-violation-job
  namespace: default
spec:
  concurrencyPolicy: Allow
  FailedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - args:
            - /bin/sh
            - -ec
            - 'curl -H "Authorization: Basic c3lzdGVtOm1hbmFnZQ==" -H "InternalUser:
              true" -X POST  "http://localhost:8080/myIntegration/rest/executeScheduledTask"'
            image: curlimages/curl:7.72.0
            name: e2em-rule-violation-job
          restartPolicy: OnFailure
  schedule: '*/3 * * * *'
  successfulJobsHistoryLimit: 3

解决方法

"curl -H \"Authorization: Basic c3lzdGVtOm1hbmFnZQ==\" -H \"InternalUser: true\" -X POST  \"http://localhost:8080/myIntegration/rest/executeScheduledTask\""

您遇到的问题是上述卷曲。看,您正在尝试卷曲不存在的地址。运行cronjob后会发生什么事?

  1. k8s创建cronjob e2em-rule-violation-job
  2. cronjob e2em-rule-violation-job创建POD
  3. curl命令正在尝试从此POD中完全运行

您的POD不知道localhost:8080是什么。与您的应用程序的运行位置相比,您的pod绝对有另一个本地成本。此地址未公开,您的pod无法访问它。另外,image: curlimages/curl:7.72.0 dockerfile没有暴露8080端口。

您可以做的测试是

  1. 使用curl pod创建正常部署,假设NEWCURLPOD
  2. 连接到NEWCURLPOD并执行您要运行的初始命令。示例:kubectl exec -ti {NEWCURLPOD} -n {PROPER_NAMESPACE} -- curl blablabla

如果那不起作用-检查dns。 如果您的应用程序在同一群集中运行-您应正确公开其服务以达到目标,但请确保它不是localhost:8080

干跑..

以下是空运行,但成功,但乔布斯在空运行时失败 已创建

空运行时-它仅检查和预览对象,而不应该在那里执行curl-结果您会看到它成功完成。