部署Tekton EventListener遇资源冲突报错,求排查方案
Tekton EventListener部署时"对象已修改"报错的排查与解决
问题描述
部署Tekton EventListener时反复出现如下报错:
Operation cannot be fulfilled on deployments.apps "el-event-listener-test-starter": the object has been modified; please apply your changes to the latest version and try again
已确认以下信息:
- 未使用时间字段、ID或版本字段,排除此类干扰;
- 当前环境存在另一个EventListener以不同服务监听同一端口;
- 每次操作都会删除并重建EventListener,且通过Lens验证无残留资源;
- 相关Deployment(含RS、Pod)状态均正常;
- 使用版本:tekton-pipelines v0.53.0、tekton-triggers v0.25.3
相关配置
apiVersion: triggers.tekton.dev/v1beta1 kind: EventListener metadata: name: event-listener-test-starter spec: serviceAccountName: tekton-service-account triggers: - name: test-starter-trigger bindings: - ref: test-starter-binding template: ref: test-starter-template --- apiVersion: triggers.tekton.dev/v1beta1 kind: TriggerBinding metadata: name: test-starter-binding spec: params: - name: testversion value: $(body.testversion) - name: appTargetBranch value: $(body.apptargetbranch) --- apiVersion: triggers.tekton.dev/v1beta1 kind: TriggerTemplate metadata: name: test-starter-template spec: params: - name: testversion - name: appTargetBranch resourcetemplates: - apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: generateName: test-pipeline- spec: serviceAccountName: build-bot pipelineRef: name: test-pipeline workspaces: - name: test-source-workspace persistentVolumeClaim: claimName: test-source-pvc - name: maven-settings subPath: mavensettings persistentVolumeClaim: claimName: mavensettingsv2-pvc - name: config-source subPath: config-source persistentVolumeClaim: claimName: configrepo2-pvc params: - name: TEST_SOURCE_URL value: http://gitea-xxx-http.default.svc.cluster.local:3000/gituser/functionaltester.git - name: TEST_SOURCE_REVISION value: $(tt.params.testversion) - name: GIT_CONFIG_TARGET_BRANCH value: $(tt.params.appTargetBranch)
排查方向与解决办法
1. 端口冲突引发控制器竞争
同一端口被另一个EventListener占用,尽管服务不同,但Tekton Triggers控制器在 reconcile 资源时可能因端口检测逻辑出现冲突,导致Deployment被意外修改。
- 临时停掉监听同一端口的EventListener,重新部署当前资源验证是否报错;
- 若恢复正常,为两个EventListener分配不同端口,或通过Ingress/Route实现端口转发避免直接冲突。
2. 控制器reconcile循环竞态问题
Tekton Triggers v0.25.3 存在 reconcile 逻辑的竞态缺陷,删除重建EventListener时,控制器可能仍在处理旧资源清理,同时新资源创建请求到来,引发版本冲突。
- 删除EventListener后等待30-60秒,确认控制器完成旧资源清理后再部署新资源;
- 升级Tekton Triggers至v0.26及以上版本,该版本修复了部分竞态问题。
3. 隐性元数据残留导致版本冲突
Kubernetes控制器会自动为资源添加kubectl.kubernetes.io/last-applied-configuration等注解,若删除重建时这些元数据未完全清理,可能引发版本冲突。
- 使用强制同步删除命令:
kubectl delete eventlistener event-listener-test-starter --cascade=foreground; - 部署前清理关联残留资源:
kubectl apply --prune -f <配置文件路径> --selector=triggers.tekton.dev/eventlistener=event-listener-test-starter
4. 工具验证残留资源的局限性
Lens可能无法实时刷新所有资源状态,部分处于Terminating状态的Pod/RS可能未被显示,导致控制器仍在处理这些资源并修改Deployment。
- 用命令行直接检查资源:
kubectl get deployments,rs,pods -l triggers.tekton.dev/eventlistener=event-listener-test-starter,确认所有旧资源已删除后再部署。
内容的提问来源于stack exchange,提问作者tm1701
相关产品推荐
相关产品推荐

