在安装的版本上引入 运行 helm 测试套件的延迟

introducing delay for running helm test suite over installed release

我正在使用 helm charts 将多个 REST 服务部署到 k8s 中,spring 在部署的容器中启动。

但是,为了能够进行最后阶段的测试,我需要引入某种智能活性探测器 - 即目标应用程序实际上 运行 正确地位于给定容器内。

这可以通过简单的 return 命令的成功 return 代码轻松证明,但是,这就是诀窍 - 命令需要在特定版本部署后延迟执行,以便为应用程序留出时间bootstrap.

这是我想出的测试套件:

apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "chart.fullname" . }}-test"
  labels:
  {{- include "chart.fullname" . | nindent 4 }}
  annotations:
    "helm.sh/hook": test-success
spec:
  containers:
    - name: test-curl
      image: curl
      command: ['curl']
      args: [' -X POST -i -H "Accept: application/json" -H "Content-Type:application/json" -d ''{"foo":["bar"]}'' {{ include "chart.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

关键问题是这个测试会在服务还没有真正启动时执行,所以无论如何都会失败。

是否有某种机制或变通方法来引入此测试的执行延迟?

想到在单独的测试容器中设置一些睡眠步骤,但我不确定这是否适用于这种情况

curl 支持通过 --retry 标志重试请求。您可以将此标志作为命令参数传递。您可以从此线程检查更多可配置的重试选项:

感谢@Emruz Hossain,我找到了解决方案:

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{ .Release.Name }}-test"
  labels:
    app: {{ .Release.Name }}
    release: {{ .Release.Name }}
  annotations:
    "helm.sh/hook": test-success
spec:
  ttlSecondsAfterFinished: 0
  template:
    spec:
      containers:
        - name: test-curl
          image: target-image:1.2.3
          imagePullPolicy: "IfNotPresent"
          command:
            - /bin/bash
            - -ec
            - |
              curl --connect-timeout 5 --max-time 10 --retry 5 --retry-delay 5 --retry-max-time 30 --retry-all-errors http://{{ .Release.Name }}:{{ .Values.service.port }}/v1/rest -X POST -H "content-type: application/json" -d "{\"foo\":[\"bar\"]}"
      restartPolicy: Never

需要 k8s api 服务器 1.20+(由于 this) and curl 7.71+ (due to this