管理 PAC 组件

仅限管理员

本指南仅适用于集群管理员。它涵盖 PAC 组件的部署、配置以及需要集群管理员权限的维护任务。

普通用户应参考:

本指南说明如何在 Kubernetes 平台上部署、更新和卸载 Pipelines-as-Code(PAC)组件。

前提条件

在管理 PAC 之前,请确保你已具备:

  • Kubernetes 集群(版本 1.24 或更高)
  • 已安装并运行 Tekton Operator
  • 集群管理员权限
  • 已安装并配置好 kubectl 以访问你的集群

部署 PAC 组件

NOTE

平台支持:尽管资源名称中包含 "OpenShift",但通过 Tekton Operator 提供的添加 PAC controller 支持的 patch,PAC 可以部署在 Kubernetes 平台上。

PAC 通过直接创建 OpenShiftPipelinesAsCode CR 来部署。operator 会自动创建并管理 PAC 所需的全部资源。

部署 PAC 组件

步骤 1:创建 OpenShiftPipelinesAsCode CR

创建一个名为 pac.yaml 的 YAML 文件:

apiVersion: operator.tekton.dev/v1alpha1
kind: OpenShiftPipelinesAsCode
metadata:
  name: pipelines-as-code
spec:
  settings:
    application-name: Pipelines as Code CI
    hub-url: http://tekton-hub-api.tekton-pipelines:8000/v1
    remote-tasks: "true"
    secret-auto-create: "true"
  targetNamespace: tekton-pipelines  # 默认 namespace,可按需自定义

重要

  • 资源名称必须是 pipelines-as-code,否则 operator 不会部署 PAC 组件。
  • targetNamespace 字段指定 PAC 组件的部署位置。默认值为 tekton-pipelines,但你可以使用任意 namespace 名称。

如果 namespace 不存在,请先创建它

kubectl create namespace tekton-pipelines  # 或你的自定义 namespace 名称

步骤 2:应用配置

将 CR 应用到你的集群:

kubectl apply -f pac.yaml

示例输出:

openshiftpipelinesascode.operator.tekton.dev/pipelines-as-code created

步骤 3:验证部署

检查 OpenShiftPipelinesAsCode CR 的状态:

kubectl get openshiftpipelinesascodes.operator.tekton.dev

输出应显示该 CR 的 Ready 状态:

NAME                  VERSION   READY   REASON
pipelines-as-code    0.x.x     True    Ready

检查 TektonInstallerSet 状态(将 <pac-namespace> 替换为你实际的 PAC namespace,默认是 tekton-pipelines):

kubectl get tektoninstallersets -n <pac-namespace> | grep pipelinesascode

示例输出:

NAME                              READY   REASON
pipelinesascode-installer-set     True    Ready
理解 TektonInstallerSet

TektonInstallerSet 是 Tekton Operator 用于管理 PAC 组件安装和生命周期的内部 operator 资源。它充当模板,由 operator 用来创建和管理所有与 PAC 相关的资源(Deployments、Services、ConfigMaps、RBAC 等)。

重要

  • 绝不应直接创建、修改或删除 TektonInstallerSet
  • 当你创建 OpenShiftPipelinesAsCode CR 时,operator 会自动创建并管理它
  • 你可以检查其状态以进行故障排查,但所有更改都应通过 OpenShiftPipelinesAsCode CR 来完成
  • 当你删除 OpenShiftPipelinesAsCode CR 时,operator 会自动删除 TektonInstallerSet 及所有相关资源

示例输出:

NAME                              AGE
pipelines-as-code-installer-set   5m

验证 PAC pods 是否正在运行:

kubectl get pods -n <pac-namespace> | grep pipelines-as-code

示例输出:

NAME                                      READY   STATUS    RESTARTS   AGE
pipelines-as-code-controller-xxxxx        1/1     Running   0          5m
pipelines-as-code-watcher-xxxxx          1/1     Running   0          5m
pipelines-as-code-webhook-xxxxx          1/1     Running   0          5m

注意:在本文档中,<pac-namespace>tekton-pipelines 指 PAC 部署所在的 namespace。如果你的 namespace 不同,请替换为实际名称。

你应该会看到三个处于 Running 状态的 pods:

  • pipelines-as-code-controller-*
  • pipelines-as-code-watcher-*
  • pipelines-as-code-webhook-*

配置访问

PAC 组件需要对外暴露,以便来自 Git 提供程序的 webhook 事件能够访问它。配置 Git 提供程序中的 webhooks 时会使用 PAC controller URL。

重要:在配置 repository 之前,你必须使用下面任一方法暴露 PAC controller。tkn pac create repo 命令可以在 PAC 通过 Ingress 暴露时自动检测 controller URL,但你需要先完成配置。

你可以使用以下任一方法暴露 PAC controller:

使用 Ingress(HTTP)

域名和 DNS 配置

如果你有域名

  • 使用你的域名配置 host 字段(例如 pac.example.com
  • 确保该域名可通过 DNS 解析到你的 Ingress Controller IP 地址
  • 配置 DNS A 记录:pac.example.com<Ingress-Controller-IP>

如果你没有域名

  • host 字段留空,或从 Ingress 配置中删除 host 这一行
  • 通过 IP 地址和端口访问 PAC:http://<Ingress-Controller-IP>:<port>
  • Git 提供程序(GitLab、GitHub)仍然可以向该 IP 地址发送 webhook

创建 IngressClass(如果尚不存在):

创建一个 Ingress 资源(将 <pac-namespace> 替换为你的 PAC namespace,默认是 tekton-pipelines):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pipelines-as-code
  namespace: <pac-namespace>  # 默认: tekton-pipelines
spec:
  rules:
  - host: pac.example.com
    http:
      paths:
      - backend:
          service:
            name: pipelines-as-code-controller
            port:
              number: 8080
        path: /
        pathType: Prefix

应用 Ingress:

kubectl apply -f ingress.yaml

示例输出:

ingress.networking.k8s.io/pipelines-as-code created

替代方案:不带域名的 Ingress(host 为空)

如果你没有域名,可以创建一个不包含 host 字段的 Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pipelines-as-code
  namespace: <pac-namespace>  # 默认: tekton-pipelines
spec:
  rules:
  - http:  # 未指定 host 字段
      paths:
      - backend:
          service:
            name: pipelines-as-code-controller
            port:
              number: 8080
        path: /
        pathType: Prefix

然后使用 Ingress Controller 的 IP 地址访问 PAC:

# 获取 Ingress Controller IP
kubectl get ingress pipelines-as-code -n <pac-namespace>

# 访问 PAC
# http://<INGRESS-IP>/
# 示例: http://192.168.1.100/

使用 Ingress(HTTPS)

HTTPS 配置要求

TLS 证书要求

  • 你需要为域名准备一个有效的 TLS 证书
  • 证书的 Common Name(CN)或 Subject Alternative Name(SAN)必须与域名匹配
  • 在生产环境中,请使用受信任 CA(如 Let's Encrypt、DigiCert 等)颁发的证书

域名配置

  • HTTPS Ingress 需要在 host 字段中配置域名
  • 确保 DNS 解析:pac.example.com<Ingress-Controller-IP>
  • 通过 IP 地址使用 HTTPS 访问可能会导致证书验证错误

首先,创建一个 TLS Secret(将 <pac-namespace> 替换为你的 PAC namespace,默认是 tekton-pipelines):

apiVersion: v1
kind: Secret
metadata:
  name: pipelines-as-code-tls
  namespace: <pac-namespace>  # 默认: tekton-pipelines
type: kubernetes.io/tls
data:
  tls.crt: <base64-encoded-tls-certificate>
  tls.key: <base64-encoded-tls-key>

然后创建一个 HTTPS Ingress(将 <pac-namespace> 替换为你的 PAC namespace,默认是 tekton-pipelines):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pipelines-as-code
  namespace: <pac-namespace>  # 默认: tekton-pipelines
spec:
  rules:
  - host: pac.example.com
    http:
      paths:
      - backend:
          service:
            name: pipelines-as-code-controller
            port:
              number: 8080
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - pac.example.com
    secretName: pipelines-as-code-tls

使用 NodePort

创建一个 NodePort Service(将 <pac-namespace> 替换为你的 PAC namespace,默认是 tekton-pipelines):

apiVersion: v1
kind: Service
metadata:
  name: pipelines-as-code-controller-nodeport
  namespace: <pac-namespace>  # 默认: tekton-pipelines
spec:
  ports:
    - name: http-listener
      port: 8080
      protocol: TCP
      targetPort: 8082  # PAC controller 监听的端口是 8082
      nodePort: 30080  # 可选:指定固定的 NodePort
  selector:
    app.kubernetes.io/part-of: pipelines-as-code
    app.kubernetes.io/component: controller
  type: NodePort

重要

  • targetPort 必须是 8082,这是 PAC controller pod 监听 webhook 事件的端口
  • port(8080)是 Service 端口(用于集群内部通信)
  • nodePort(30080)是可从集群外部访问的外部端口
  • 对于 Ingress,Service 端口是 8080,它会在内部路由到 controller 的 8082 端口

获取 NodePort(将 <pac-namespace> 替换为你的 PAC namespace,默认是 tekton-pipelines):

kubectl get service -n <pac-namespace> pipelines-as-code-controller-nodeport -o jsonpath='{.spec.ports[?(@.name=="http-listener")].nodePort}'

示例输出:

30080

通过 http://<node-ip>:<node-port> 访问 PAC。

如何获取 PAC Controller URL

在暴露 PAC controller 之后,你可以使用以下方法获取 URL:

如果使用 Ingress

获取 Ingress host(将 <pac-namespace> 替换为你的 PAC namespace,默认是 tekton-pipelines):

kubectl get ingress pipelines-as-code -n <pac-namespace> -o jsonpath='{.spec.rules[0].host}'

示例输出:

pac.example.com

controller URL 将是:

  • HTTP: http://<ingress-host>
  • HTTPS: https://<ingress-host>

如果使用 NodePort

获取 NodePort 和节点 IP:

# 设置你的 PAC namespace(默认: tekton-pipelines)
PAC_NAMESPACE="tekton-pipelines"

# 获取 NodePort
NODEPORT=$(kubectl get service -n ${PAC_NAMESPACE} pipelines-as-code-controller-nodeport -o jsonpath='{.spec.ports[?(@.name=="http-listener")].nodePort}')

# 获取节点 IP(使用第一个节点的 InternalIP)
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')

echo "PAC Controller URL: http://${NODE_IP}:${NODEPORT}"

示例输出:

PAC Controller URL: http://192.168.1.100:30080

由 tkn pac 自动检测

当使用 tkn pac create repo 时,CLI 会通过以下方式自动检测 controller URL:

  1. 检查指向 PAC controller service 的 Ingress 资源
  2. 检查 LoadBalancer services
  3. 检查 NodePort services
  4. 如果都没有找到,则提示你手动输入 URL

如果自动检测失败,你可以在提示时手动输入 controller URL。

适用于普通用户

如果你是普通用户并且需要查找 PAC controller URL:

  1. 先尝试上面的查询命令(如果你有集群访问权限)
  2. 如果命令无法执行,或你没有权限,请联系你的 PAC 管理员获取 URL
  3. 管理员可以使用本节中的方法查找它

注意:controller URL 必须能够被 Git 提供程序服务器访问,才能接收 webhook 事件。

配置设置

你可以通过 OpenShiftPipelinesAsCode CR 中的 settings 字段自定义 PAC 行为:

SettingDescriptionDefault
application-name在 Git 提供程序 UI 中显示的名称Pipelines as Code CI
hub-urlTekton Hub API URLhttp://tekton-hub-api.tekton-pipelines:8000/v1(集群内部,默认 namespace)
remote-tasks启用远程任务解析true
secret-auto-create自动创建 secrettrue
error-detection-from-container-logs从容器日志中检测错误false
error-log-snippet显示错误日志片段true
custom-console-nameGit 提供程序 UI 中自定义控制台链接的显示名称``(空)
custom-console-url自定义控制台的基础 URL(例如 OpenShift Console)``(空)
custom-console-url-pr-detailsPR/MR 详情页面的 URL 模板。支持变量:{{namespace}}{{pipelinerun}}``(空)
custom-console-url-pr-tasklogPR/MR 任务日志页面的 URL 模板。支持变量:{{namespace}}{{pipelinerun}}{{taskrun}}``(空)
custom-console-url-namespacenamespace 页面 URL 模板。支持变量:{{namespace}}``(空)

关于 hub-url 的说明

  • 默认值指向默认 namespace(tekton-pipelines)中的集群内部 Tekton Hub service
  • 格式:http://<service-name>.<namespace>:<port>/v1
  • 如果 Tekton Hub 部署在其他 namespace 中,请相应调整 URL 中的 namespace
  • hub-url 中的 namespace 是 Tekton Hub 所部署的 namespace,它可能与 PAC namespace(由 targetNamespace 指定)不同
  • 如需使用外部 Hub(例如公共 Tekton Hub),请设置为 https://api.hub.tekton.dev/v1
  • 只有 PAC controller 需要访问此 URL

关于 custom-console-namecustom-console-url 的说明

  • 这些设置用于配置 Git 提供程序 UI 中的自定义控制台链接
  • custom-console-name 是自定义控制台链接的显示名称
  • custom-console-url 是自定义控制台的基础 URL(例如 Devops Console)
  • custom-console-url-pr-details 是 PR/MR 详情页面的 URL 模板。支持变量:{{namespace}}{{pipelinerun}}
  • custom-console-url-pr-tasklog 是 PR/MR 任务日志页面的 URL 模板。支持变量:{{namespace}}{{pipelinerun}}{{taskrun}}
  • custom-console-url-namespace 是 namespace 页面 URL 模板。支持变量:{{namespace}}
  • 它提供了一种将 Git 提供程序 UI 中的控制台链接自定义为指向 Devops Console 的方式。

有关 PAC 设置的更多信息,请参阅 常见配置更新 部分。

更新 PAC 组件

更新配置

  1. 编辑 OpenShiftPipelinesAsCode CR:

    kubectl edit openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code
  2. 按需更新 settings 字段:

    spec:
      settings:
        application-name: "My Custom PAC"
        hub-url: http://tekton-hub-api.tekton-pipelines:8000/v1
        remote-tasks: "true"
        error-detection-from-container-logs: "true"
  3. 保存并退出。operator 会自动更新 TektonInstallerSet 并应用这些更改。

更新组件版本

要更新 PAC 组件版本,请升级 Tekton Operator:

  1. 将 Tekton Operator 更新到目标版本
  2. operator 会自动:
    • 删除旧的 TektonInstallerSet
    • 创建一个带有新 PAC 版本的新 TektonInstallerSet
    • 使用新版本更新 OpenShiftPipelinesAsCode CR

升级后检查版本:

kubectl get openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code -o jsonpath='{.status.version}'

验证更新

更新配置后:

  1. 检查 OpenShiftPipelinesAsCode CR 状态:

    kubectl get openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code

示例输出:

NAME                VERSION           READY   REASON
pipelines-as-code   v0.36.0-2881c2a   True    
  1. 检查 pods 是否正在重启(将 <pac-namespace> 替换为你的 PAC namespace):

    kubectl get pods -n <pac-namespace> | grep pipelines-as-code

示例输出:

pipelines-as-code-controller-665b9588c8-q7ftg        1/1     Running   0          4d2h
pipelines-as-code-watcher-86d58cb688-xkzxg           1/1     Running   0          4d2h
pipelines-as-code-webhook-6f6b79c7b6-w8shs           1/1     Running   0          4d2h
  1. 检查 pod 日志中是否存在错误:

    kubectl logs -n <pac-namespace> -l app.kubernetes.io/part-of=pipelines-as-code --tail=50

示例输出:

{"level":"info","ts":"2025-11-27T19:28:35.773Z","logger":"pipelinesascode","caller":"adapter/adapter.go:84","msg":"Starting Pipelines as Code version: nightly-20251126-"}
{"level":"info","ts":"2025-11-27T19:28:35.774Z","logger":"pipelinesascode","caller":"injection/health_check.go:43","msg":"Probes server listening on port 8080"}
...
  1. 验证配置已应用:

    kubectl get configmap -n <pac-namespace> pipelines-as-code -o yaml

示例输出:

apiVersion: v1
kind: ConfigMap
metadata:
  name: pipelines-as-code
  namespace: <pac-namespace>
data:
  application-name: Pipelines as Code CI
  hub-url: https://api.hub.tekton.dev/v1
  remote-tasks: "true"
  secret-auto-create: "true"
  error-detection-from-container-logs: "true"
  error-log-snippet: "true"
  ...

回滚配置

如果你需要回滚配置更改:

  1. OpenShiftPipelinesAsCode CR 中恢复之前的配置:

    kubectl edit openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code
  2. 或者从备份中恢复:

在进行更改之前先创建备份:

kubectl get openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code -o yaml > pac-backup.yaml

从备份恢复:

kubectl apply -f pac-backup.yaml

常见配置更新

更改 Application 名称

spec:
  settings:
    application-name: "New Application Name"

启用错误检测

spec:
  settings:
    error-detection-from-container-logs: "true"
    error-detection-max-number-of-lines: "100"

更新 Hub URL

如果你的 Tekton Hub 部署在其他 namespace 中,或者你想使用外部 Hub:

spec:
  settings:
    # 用于不同 namespace 中的集群内部 Hub
    hub-url: "http://tekton-hub-api.<your-namespace>:8000/v1"
    
    # 或者用于外部/公共 Hub
    hub-url: "https://api.hub.tekton.dev/v1"

查找 Tekton Hub service

kubectl get svc -A | grep tekton-hub-api

示例输出:

tekton-pipelines   tekton-hub-api   ClusterIP   10.96.123.45   <none>   8000/TCP   10m

禁用远程任务

spec:
  settings:
    remote-tasks: "false"

要将 PAC 与你的自定义控制台集成,请配置自定义控制台链接。这样 Git 提供程序(GitLab、GitHub 等)中的 pipeline 状态链接就可以指向你的自定义控制台。

配置示例
spec:
  settings:
    # 自定义控制台显示名称
    custom-console-name: "My Console"
    
    # 自定义控制台的基础 URL(Console 入口)
    custom-console-url: "https://console.example.com"
    
    # PipelineRun 详情页的 URL 模板
    # 格式: /console-acp/workspace/{{ namespace }}~CLUSTER_NAME~{{ namespace }}/pipeline/pipelineRuns/detail/{{ pr }}
    # 将 CLUSTER_NAME 替换为你的实际集群名称(例如 my-cluster、business-1)
    custom-console-url-pr-details: "https://console.example.com/console-acp/workspace/{{ namespace }}~my-cluster~{{ namespace }}/pipeline/pipelineRuns/detail/{{ pr }}"
    
    # TaskRun 日志页的 URL 模板
    # 格式: /console-acp/workspace/~CLUSTER_NAME~{{ namespace }}/pipeline/pipelineRuns/detail/{{ pr }}?tab=task_overview&id={{ task }}
    custom-console-url-pr-tasklog: "https://console.example.com/console-acp/workspace/{{ namespace }}~my-cluster~{{ namespace }}/pipeline/pipelineRuns/detail/{{ pr }}?tab=task_overview&id={{ task }}"
    
    # namespace pipeline 列表页的 URL 模板
    # 格式: /console-acp/workspace/~CLUSTER_NAME~{{ namespace }}/pipeline/pipelineRuns
    custom-console-url-namespace: "https://console.example.com/console-acp/workspace/{{ namespace }}~my-cluster~{{ namespace }}/pipeline/pipelineRuns"
如何配置

步骤 1:确定你的集群名称

联系你的集群管理员以获取正确的集群名称。常见示例:

  • my-cluster - 通用集群名称
  • business-1 - 业务集群 1
  • dev-cluster - 开发集群

集群名称会在 URL 路径中以 ~CLUSTER_NAME~ 的形式出现(注意波浪线字符)。

步骤 2:设置控制台 URL

custom-console-url 设置为你的控制台入口地址(末尾不要带斜杠):

  • https://console.example.com
  • https://devops.example.com

步骤 3:配置 URL 模板

将 URL 模板中的 CLUSTER_NAME 替换为你的实际集群名称。PAC 会自动替换以下变量:

  • {{ namespace }}:执行 PipelineRun 的 namespace
  • {{ pr }}:PipelineRun 名称
  • {{ task }}:PipelineRun 中的 Task 名称
示例:完整配置

对于名为 my-cluster、控制台地址为 https://console.example.com 的集群:

spec:
  settings:
    custom-console-name: "My Console"
    custom-console-url: "https://console.example.com"
    custom-console-url-pr-details: "https://console.example.com/console-acp/workspace/{{ namespace }}~my-cluster~{{ namespace }}/pipeline/pipelineRuns/detail/{{ pr }}"
    custom-console-url-pr-tasklog: "https://console.example.com/console-acp/workspace/{{ namespace }}~my-cluster~{{ namespace }}/pipeline/pipelineRuns/detail/{{ pr }}?tab=task_overview&id={{ task }}"
    custom-console-url-namespace: "https://console.example.com/console-acp/workspace/{{ namespace }}~my-cluster~{{ namespace }}/pipeline/pipelineRuns"
示例:生成的链接

当 PAC 在 namespace my-project 中创建一个名为 my-app-build-abc123 的 PipelineRun,且其任务为 build-task 时:

  • PipelineRun 详情

    https://console.example.com/console-acp/workspace/my-project~my-cluster~my-project/pipeline/pipelineRuns/detail/my-app-build-abc123
  • TaskRun 日志

    https://console.example.com/console-acp/workspace/my-project~my-cluster~my-project/pipeline/pipelineRuns/detail/my-app-build-abc123?tab=task_overview&id=build-task
  • namespace Pipeline 列表

    https://console.example.com/console-acp/workspace/my-project~my-cluster~my-project/pipeline/pipelineRuns

这些链接会显示在你的 Git 提供程序 UI 中(GitLab merge requests、GitHub pull requests 等),让开发者能够快速跳转到你的自定义控制台。

卸载 PAC 组件

删除 OpenShiftPipelinesAsCode CR

步骤 1:删除 CR

kubectl delete openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code

示例输出:

openshiftpipelinesascode.operator.tekton.dev "pipelines-as-code" deleted

operator 会自动:

  • 删除 TektonInstallerSet(内部 operator 资源)
  • 移除所有与 PAC 相关的资源(Deployments、Services、ConfigMaps 等)
  • 清理 RBAC 资源

注意TektonInstallerSet 是内部 operator 资源。你不应手动删除它。operator 会自动管理其生命周期。

步骤 2:验证卸载

检查 OpenShiftPipelinesAsCode CR 是否已删除:

kubectl get openshiftpipelinesascodes.operator.tekton.dev

验证 TektonInstallerSet 是否已删除(将 <pac-namespace> 替换为你的 PAC namespace):

kubectl get tektoninstallersets -n <pac-namespace> | grep pipelinesascode

注意:这是只读检查,用于验证内部 operator 资源是否已清理。不要尝试手动删除 TektonInstallerSet。

示例输出(如果成功删除,应为空):

No resources found

检查 PAC pods 是否已终止:

kubectl get pods -n <pac-namespace> | grep pipelines-as-code

示例输出(如果成功删除,应为空):

No resources found

清理额外资源

卸载 PAC 后,你可能还需要清理额外资源:

删除 Repository CR

如果你已经创建了用于 Git 提供程序集成的 Repository CR:

kubectl get repositories -A
kubectl delete repositories --all -n <namespace>

示例输出:

repository.pipelinesascode.tekton.dev "my-repo" deleted
repository.pipelinesascode.tekton.dev "another-repo" deleted

删除 Secret

重要:当你删除 OpenShiftPipelinesAsCode CR 时,operator 会自动清理 PAC namespace 中带有 app.kubernetes.io/part-of=pipelines-as-code 标签的 secret。然而,你仍需要手动删除为 Git 提供程序认证而创建的、与 Repository CR 相关的 secret。

会自动清理的 secret(位于 PAC namespace 中):

  • pipelines-as-code-secret - PAC controller 的内部 secret(带有 app.kubernetes.io/part-of=pipelines-as-code 标签)

需要手动清理的 secret(位于 Repository CR namespace 中):

  • gitlab-secret / github-secret - Git 提供程序访问令牌
  • webhook-secret - webhook 验证 secret
  • git-auth-secret - 私有 repository 访问令牌
  • git-ssh-secret - 用于访问 repository 的 SSH 密钥

要查找并删除与 Repository CR 相关的 secret:

  1. 列出该 namespace 中的所有 secret

    kubectl get secrets -n <namespace>
  2. 识别你专门为 PAC Repository CR 创建的 secret。

    注意:secret 名称可能会因创建方式不同而有所差异。请仔细查看列表,识别哪些 secret 与 PAC 相关。

  3. 删除前,请确保:

    • 使用该 secret 的所有 Repository CR 都已删除
    • 该 secret 未被集群中的其他应用或资源使用
    • 你已确认该 secret 可以安全移除
  4. 仅在确认不再需要时删除该 secret:

    kubectl delete secret <secret-name> -n <namespace>

警告

  • secret 可能会被多个 Repository CR 或其他资源共享
  • 删除仍在使用的 secret 会导致认证失败
  • 在删除之前,务必确认该 secret 没有在其他地方被引用

示例输出:

secret "gitlab-secret" deleted

删除 Ingress/Service

如果你为 PAC 创建了 Ingress 或 NodePort Service(将 <pac-namespace> 替换为你的 PAC namespace):

kubectl delete ingress pipelines-as-code -n <pac-namespace>
kubectl delete service pipelines-as-code-controller-nodeport -n <pac-namespace>

示例输出:

ingress.networking.k8s.io "pipelines-as-code" deleted
service "pipelines-as-code-controller-nodeport" deleted

故障排查

PAC Pods 未启动

检查 pod 日志(将 <pac-namespace> 替换为你的 PAC namespace):

kubectl logs -n <pac-namespace> -l app.kubernetes.io/part-of=pipelines-as-code

示例输出(示例日志条目):

{"level":"info","ts":"2024-01-01T12:00:00Z","logger":"controller","msg":"Starting PAC controller"}
{"level":"info","ts":"2024-01-01T12:00:01Z","logger":"controller","msg":"PAC controller ready"}

OpenShiftPipelinesAsCode CR 未就绪

检查 CR 状态和事件:

kubectl describe openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code

示例输出(节选):

Name:         pipelines-as-code
Namespace:    
Status:       Ready
Version:      0.x.x
Events:
  Type    Reason   Age   From              Message
  ----    ------   ----  ----              -------
  Normal  Ready    5m    tekton-operator   PAC component deployed successfully

TektonInstallerSet 问题

重要TektonInstallerSet 是内部 operator 资源。如果你遇到相关问题,请不要直接修改或删除它。应通过 OpenShiftPipelinesAsCode CR 来排查。

检查 TektonInstallerSet 状态以进行故障排查(将 <pac-namespace> 替换为你的 PAC namespace):

kubectl get tektoninstallersets -n <pac-namespace> -o yaml

如果 TektonInstallerSet 显示错误:

  1. 检查 OpenShiftPipelinesAsCode CR 状态以查找底层问题
  2. 查看 operator 日志以获取详细错误信息
  3. 如有必要,删除并重新创建 OpenShiftPipelinesAsCode CR(operator 会自动重新创建 TektonInstallerSet)

示例输出(节选):

apiVersion: tekton.dev/v1alpha1
kind: TektonInstallerSet
metadata:
  name: pipelines-as-code-installer-set
  namespace: tekton-pipelines
status:
  conditions:
  - status: "True"
    type: Ready

CR 未删除

如果 OpenShiftPipelinesAsCode CR 未被删除,请检查 finalizer:

kubectl get openshiftpipelinesascodes.operator.tekton.dev pipelines-as-code -o yaml | grep finalizers

示例输出(如果存在 finalizer):

  finalizers:
  - tekton.dev/operator

如果没有 finalizer,输出将为空,这表示该 CR 可以被删除。

如果存在 finalizer,operator 可能仍在处理。请稍等片刻后重试。

资源未移除

如果某些资源没有被自动移除:

  1. 检查 TektonInstallerSet 状态以进行故障排查(将 <pac-namespace> 替换为你的 PAC namespace):

    kubectl get tektoninstallersets -n <pac-namespace> -o yaml

    注意:这是只读检查。TektonInstallerSet 是内部 operator 资源。不要手动删除它。

  2. 手动删除剩余资源:

    kubectl delete deployment -n <pac-namespace> -l app.kubernetes.io/part-of=pipelines-as-code
    kubectl delete service -n <pac-namespace> -l app.kubernetes.io/part-of=pipelines-as-code

下一步