如何让 Tekton Task 的命令执行等到前一个 Task 的 spun up pod 准备好接受请求
How can I make a Tekton Task's command execution wait until the previous Task's spun up pod is ready for requests
我有一个 OpenShift/Tekton 管道,它在 Task A
中将应用程序部署到测试环境。在 Task B
中,应用程序的测试套件是 运行。如果所有测试都通过,则应用程序将部署到 Task C
.
中的另一个环境
问题是 Task A
的 pod 已部署(使用 oc apply -f <deployment>
),并且在 pod 实际准备好接收请求之前,Task B
启动 运行测试套件,所有测试都失败(因为它无法到达测试用例中定义的端点)。
在开始执行 Task B
之前,是否有一种优雅的方法来确保来自 Task A
的 pod 已准备好接收请求?我见过的一种解决方案是对健康端点执行 HTTP GET 请求,直到获得 HTTP 200 响应。我们有相当多的应用程序不公开 HTTP 端点,那么是否有更“通用”的方法来确保 pod 准备就绪?例如,我可以在 Task A
的日志中查询特定记录吗?有一条日志语句始终显示 pod 何时准备好接收流量。
如果有任何兴趣,这里是 Task A
的定义:
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: create-and-deploy-integration-server
spec:
params:
- name: release-name
type: string
description: The release name of the application
- name: image-name
type: string
description: The name of the container image to use
- name: namespace
type: string
description: The namespace (OCP project) the application resides in
- name: commit-id
type: string
description: The commit hash identifier for the current HEAD commit
steps:
- name: create-is-manifest
image: image-registry.openshift-image-registry.svc:5000/openshift/origin-cli
script: |
echo "Creating IntegrationServer manifest"
cat << EOF > integrationserver.yaml
apiVersion: appconnect.ibm.com/v1beta1
kind: IntegrationServer
metadata:
name: $(params.release-name)
namespace: $(params.namespace)
spec:
license:
accept: true
license: L-KSBM-BZWEAT
use: CloudPakForIntegrationNonProduction
pod:
containers:
runtime:
image: image-registry.openshift-image-registry.svc:5000/$(params.namespace)/$(params.image-name)-$(params.commit-id)
imagePullPolicy: Always
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 300m
memory: 300Mi
adminServerSecure: true
router:
timeout: 120s
designerFlowsOperationMode: disabled
service:
endpointType: http
version: 11.0.0.11-r2
replicas: 1
barURL: ''
EOF
- name: deploy-is-manifest
image: image-registry.openshift-image-registry.svc:5000/openshift/origin-cli
script: |
echo "Applying IntegrationServer manifest to OpenShift cluster"
oc apply -f integrationserver.yaml
在执行 oc apply
的 步骤 之后,您可以添加一个步骤来等待部署变得“可用”。这是针对 kubectl
但应该与 oc
:
相同的工作方式
kubectl wait --for=condition=available --timeout=60s deployment/myapp
然后下一个任务可以依赖这个任务 runAfter: ["create-and-deploy-integration-server"]
我有一个 OpenShift/Tekton 管道,它在 Task A
中将应用程序部署到测试环境。在 Task B
中,应用程序的测试套件是 运行。如果所有测试都通过,则应用程序将部署到 Task C
.
问题是 Task A
的 pod 已部署(使用 oc apply -f <deployment>
),并且在 pod 实际准备好接收请求之前,Task B
启动 运行测试套件,所有测试都失败(因为它无法到达测试用例中定义的端点)。
在开始执行 Task B
之前,是否有一种优雅的方法来确保来自 Task A
的 pod 已准备好接收请求?我见过的一种解决方案是对健康端点执行 HTTP GET 请求,直到获得 HTTP 200 响应。我们有相当多的应用程序不公开 HTTP 端点,那么是否有更“通用”的方法来确保 pod 准备就绪?例如,我可以在 Task A
的日志中查询特定记录吗?有一条日志语句始终显示 pod 何时准备好接收流量。
如果有任何兴趣,这里是 Task A
的定义:
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: create-and-deploy-integration-server
spec:
params:
- name: release-name
type: string
description: The release name of the application
- name: image-name
type: string
description: The name of the container image to use
- name: namespace
type: string
description: The namespace (OCP project) the application resides in
- name: commit-id
type: string
description: The commit hash identifier for the current HEAD commit
steps:
- name: create-is-manifest
image: image-registry.openshift-image-registry.svc:5000/openshift/origin-cli
script: |
echo "Creating IntegrationServer manifest"
cat << EOF > integrationserver.yaml
apiVersion: appconnect.ibm.com/v1beta1
kind: IntegrationServer
metadata:
name: $(params.release-name)
namespace: $(params.namespace)
spec:
license:
accept: true
license: L-KSBM-BZWEAT
use: CloudPakForIntegrationNonProduction
pod:
containers:
runtime:
image: image-registry.openshift-image-registry.svc:5000/$(params.namespace)/$(params.image-name)-$(params.commit-id)
imagePullPolicy: Always
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 300m
memory: 300Mi
adminServerSecure: true
router:
timeout: 120s
designerFlowsOperationMode: disabled
service:
endpointType: http
version: 11.0.0.11-r2
replicas: 1
barURL: ''
EOF
- name: deploy-is-manifest
image: image-registry.openshift-image-registry.svc:5000/openshift/origin-cli
script: |
echo "Applying IntegrationServer manifest to OpenShift cluster"
oc apply -f integrationserver.yaml
在执行 oc apply
的 步骤 之后,您可以添加一个步骤来等待部署变得“可用”。这是针对 kubectl
但应该与 oc
:
kubectl wait --for=condition=available --timeout=60s deployment/myapp
然后下一个任务可以依赖这个任务 runAfter: ["create-and-deploy-integration-server"]