配置自定义证书

适用于管理员

本指南适用于需要为 Git 提供商配置 PAC 以信任自签名证书或自定义 CA 证书的 集群管理员

注意:在本文档中,<pac-namespace>tekton-pipelines 指 PAC 所部署的命名空间。默认命名空间是 tekton-pipelines,但你可以通过 OpenShiftPipelinesAsCode CR 中的 targetNamespace 进行自定义。如果实际命名空间不同,请将 <pac-namespace>tekton-pipelines 替换为你的实际命名空间名称。

本指南说明如何配置 PAC 以适配使用自签名证书或自定义 CA 证书的 Git 托管服务。此配置适用于所有 Git 提供商(GitHub Enterprise、GitLab self-hosted、Bitbucket Server 等)。

前提条件

在配置自定义证书之前,请确保你具备以下条件:

  • 已部署 PAC 组件
  • 对集群具有管理员访问权限
  • 可以访问 CA 证书文件
  • 能够修改 OpenShiftPipelinesAsCode CR 或 TektonConfig CR

概述

当你的 Git 托管服务使用自签名证书或由自定义 CA 签发的证书时,PAC 控制器 Pod 需要信任这些证书,才能成功连接到 Git 服务。这需要:

  1. 创建包含 CA 证书的 ConfigMap
  2. 将证书挂载到 PAC 控制器 Pod 中
  3. 配置 Git 使用该证书

第 1 步:准备 CA 证书

从你的 Git 托管服务管理员处或从组织的证书颁发机构获取 CA 证书文件。

CA 证书的常见位置

  • Self-hosted GitLab:通常可在 GitLab 安装中找到,或从组织的 CA 获取
  • GitHub Enterprise:可从 GitHub Enterprise Server 管理员处获取
  • Bitbucket Server:可从 Bitbucket Server 管理员处获取

证书文件应采用 PEM 格式:

-----BEGIN CERTIFICATE-----
<certificate-content>
-----END CERTIFICATE-----

第 2 步:创建包含 CA 证书的 ConfigMap

在 PAC 命名空间中创建一个包含 CA 证书的 ConfigMap(默认:tekton-pipelines,如果不同请替换为你的实际 PAC 命名空间):

方法 1:从文件创建

kubectl create configmap git-ca-cert \
  --from-file=ca.crt=/path/to/ca.crt \
  -n <pac-namespace>  # Default: tekton-pipelines

示例输出:

configmap/git-ca-cert created

方法 2:手动创建

创建一个 YAML 文件 git-ca-cert-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: git-ca-cert
  namespace: <pac-namespace>  # Default: tekton-pipelines
data:
  ca.crt: |
    -----BEGIN CERTIFICATE-----
    <your-ca-certificate-content>
    -----END CERTIFICATE-----

应用该文件:

kubectl apply -f git-ca-cert-configmap.yaml

示例输出:

configmap/git-ca-cert created

注意:请将 <your-ca-certificate-content> 替换为实际的证书内容。

第 3 步:在 PAC 控制器中挂载证书

通过更新 OpenShiftPipelinesAsCode CR 或 TektonConfig CR,将证书挂载到 PAC 控制器 Pod 中。

对于 OpenShiftPipelinesAsCode CR

如果你使用的是 OpenShiftPipelinesAsCode CR:

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
  targetNamespace: tekton-pipelines  # Default namespace, you can customize this
  options:
    deployments:
      pipelines-as-code-controller:
        spec:
          template:
            spec:
              containers:
              - name: pac-controller
                volumeMounts:
                - name: git-ca-cert
                  mountPath: /etc/ssl/certs/git-ca.crt
                  subPath: ca.crt
                  readOnly: true
                env:
                - name: GIT_SSL_CAINFO
                  value: /etc/ssl/certs/git-ca.crt
                - name: SSL_CERT_FILE
                  value: /etc/ssl/certs/git-ca.crt
              volumes:
              - name: git-ca-cert
                configMap:
                  name: git-ca-cert

对于 TektonConfig CR

如果你使用的是 TektonConfig CR(适用于 OpenShift 部署):

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  platforms:
    openshift:
      pipelinesAsCode:
        enable: true
        options:
          deployments:
            pipelines-as-code-controller:
              spec:
                template:
                  spec:
                    containers:
                    - name: pac-controller
                      volumeMounts:
                      - name: git-ca-cert
                        mountPath: /etc/ssl/certs/git-ca.crt
                        subPath: ca.crt
                        readOnly: true
                      env:
                      - name: GIT_SSL_CAINFO
                        value: /etc/ssl/certs/git-ca.crt
                      - name: SSL_CERT_FILE
                        value: /etc/ssl/certs/git-ca.crt
                    volumes:
                    - name: git-ca-cert
                      configMap:
                        name: git-ca-cert

重要

  • 证书会挂载到容器中的 /etc/ssl/certs/git-ca.crt
  • 环境变量 GIT_SSL_CAINFOSSL_CERT_FILE 会告诉 Git 使用此证书
  • 更新 CR 后,Operator 会自动重启 PAC 控制器 Pod

第 4 步:应用配置

应用更新后的 CR:

kubectl apply -f your-cr-file.yaml

示例输出:

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

等待 PAC 控制器 Pod 重启:

kubectl rollout status deployment/pipelines-as-code-controller -n <pac-namespace>  # Replace <pac-namespace> with your actual namespace (default: tekton-pipelines)

示例输出:

Waiting for deployment "pipelines-as-code-controller" rollout to finish: 0 of 1 updated replicas are available...
deployment "pipelines-as-code-controller" successfully rolled out

第 5 步:验证证书配置

检查证书是否已挂载

验证 PAC 控制器 Pod 中是否已挂载证书:

# Set your PAC namespace (default: tekton-pipelines)
PAC_NAMESPACE="tekton-pipelines"

kubectl get pod -n ${PAC_NAMESPACE} \
  -l app=pipelines-as-code-controller \
  -o jsonpath='{.items[0].spec.volumes}' | jq

示例输出:

[
  {
    "name": "tls",
    "secret": {
      "defaultMode": 420,
      "optional": true,
      "secretName": "pipelines-as-code-tls-secret"
    }
  }
]

你应该能看到显示证书已挂载的卷配置。

检查 PAC 控制器日志

检查 PAC 控制器日志中是否有与证书相关的错误:

# Set your PAC namespace (default: tekton-pipelines)
PAC_NAMESPACE="tekton-pipelines"

kubectl logs -n ${PAC_NAMESPACE} \
  -l app=pipelines-as-code-controller \
  --tail=100

如果配置正确,日志中不应出现 SSL/TLS 证书错误。

使用仓库进行测试

从托管在你的 Git 服务上的仓库触发一个测试流水线:

# Push a commit to trigger the pipeline
git commit --allow-empty -m "Test certificate configuration"
git push origin main

示例输出:

[main abc1234] Test certificate configuration
Enumerating objects: 3, done.
Writing objects: 100% (2/2), 240 bytes | 240.00 KiB/s, done.
To https://gitlab.example.com/user/repo
   def5678..abc1234  main -> main

检查 PipelineRun 是否成功创建:

kubectl get pipelineruns -n <your-namespace>

示例输出:

NAME                    STARTED        DURATION   STATUS
test-pipeline-xxxxx     1 minute ago  25s        Succeeded

故障排查

检查证书是否不受信任

问题:由于证书问题,PAC 仍然无法连接到你的 Git 服务。

解决方案

  1. 验证证书格式:确保证书为 PEM 格式,并具有正确的 BEGIN/END 标记
  2. 检查证书路径:确认证书已挂载到正确路径
  3. 验证环境变量:确保 GIT_SSL_CAINFOSSL_CERT_FILE 已正确设置
  4. 检查 ConfigMap:验证 ConfigMap 是否存在并包含证书:
    kubectl get configmap git-ca-cert -n <pac-namespace> -o yaml  # Replace <pac-namespace> with your actual namespace (default: tekton-pipelines)

示例输出:

apiVersion: v1
data:
  ca.crt: |
    -----BEGIN CERTIFICATE-----
    MIIDXTCCAkWgAwIBAgIJAK...
    -----END CERTIFICATE-----
kind: ConfigMap
metadata:
  name: git-ca-cert
  namespace: tekton-pipelines

检查证书是否已过期

问题:CA 证书已过期。

解决方案

  1. 从你的证书颁发机构获取新的 CA 证书

  2. 更新 ConfigMap:

    # Replace <pac-namespace> with your actual namespace (default: tekton-pipelines)
    kubectl create configmap git-ca-cert \
      --from-file=ca.crt=/path/to/new-ca.crt \
      -n <pac-namespace> \
      --dry-run=client -o yaml | kubectl apply -f -

    示例输出:

    configmap/git-ca-cert configured
  3. 重启 PAC 控制器 Pod:

    kubectl rollout restart deployment/pipelines-as-code-controller -n <pac-namespace>  # Replace <pac-namespace> with your actual namespace (default: tekton-pipelines)

证书错误

问题:为你的 Git 服务使用了错误的 CA 证书。

解决方案

  1. 确认你使用的是对应 Git 托管服务的正确 CA 证书
  2. 对于 self-hosted 服务,请直接从该服务获取证书
  3. 对于企业级服务,请联系管理员获取正确的证书

Pod 未重启

问题:更新 CR 后,PAC 控制器 Pod 未重启。

解决方案

  1. 检查 CR 状态:

    kubectl get openshiftpipelinesascodes

    示例输出:

    NAME                  VERSION   READY   REASON
    pipelines-as-code    0.x.x     True    Ready
  2. 检查 Operator 日志:

    kubectl logs -n tekton-operator -l app=tekton-operator --tail=100

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

{"level":"info","ts":"2024-01-01T12:00:00Z","logger":"operator","msg":"Processing OpenShiftPipelinesAsCode CR"}
  1. 手动重启部署:
    kubectl rollout restart deployment/pipelines-as-code-controller -n <pac-namespace>  # Replace <pac-namespace> with your actual namespace (default: tekton-pipelines)

多个证书

如果你需要信任多个 CA 证书(例如多个 Git 托管服务),可以:

选项 1:将证书合并到单个 ConfigMap 中

将多个证书合并到一个文件中:

apiVersion: v1
kind: ConfigMap
metadata:
  name: git-ca-cert
  namespace: <pac-namespace>  # Default: tekton-pipelines
data:
  ca.crt: |
    -----BEGIN CERTIFICATE-----
    <certificate-1-content>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <certificate-2-content>
    -----END CERTIFICATE-----

选项 2:使用独立的 ConfigMap

使用独立的 ConfigMap 并将它们挂载到不同位置,然后配置 Git 使用证书捆绑包:

env:
- name: GIT_SSL_CAINFO
  value: /etc/ssl/certs/ca-bundle.crt
- name: SSL_CERT_FILE
  value: /etc/ssl/certs/ca-bundle.crt

通过将所有证书合并为单个文件来创建证书捆绑包。

最佳实践

1. 证书管理

  • 安全存储:将 CA 证书保存在安全存储中
  • 版本控制:跟踪证书变更并纳入版本控制(如果不涉及敏感信息)
  • 文档记录:记录所使用的证书及其来源
  • 过期监控:监控证书过期时间

2. 安全性

  • 最小权限:仅授予必要证书的访问权限
  • 轮换:定期轮换证书
  • 验证:在部署之前验证证书

3. 故障排查

  • 先行测试:在应用到生产环境之前,先使用测试仓库测试证书配置
  • 监控日志:定期检查 PAC 控制器日志中的证书错误
  • 备份:保留可用证书配置的备份副本

下一步