For Administrators
本指南适用于需要配置 PAC 以信任自签名证书或自定义 CA 证书的 集群管理员,用于 Git 提供商。
注意:本文档中 <pac-namespace> 或 tekton-pipelines 指的是 PAC 部署所在的命名空间。默认命名空间为 tekton-pipelines,但您可以通过 OpenShiftPipelinesAsCode CR 中的 targetNamespace 自定义。如果您的命名空间不同,请将 <pac-namespace> 或 tekton-pipelines 替换为实际命名空间名称。
本指南介绍如何配置 PAC 以支持使用自签名证书或自定义 CA 证书的 Git 托管服务。此配置适用于所有 Git 提供商(GitHub Enterprise、GitLab 自托管、Bitbucket Server 等)。
前提条件
在配置自定义证书之前,请确保您已具备:
- 已部署 PAC 组件
- 集群管理员权限
- 可访问 CA 证书文件
- 能够修改
OpenShiftPipelinesAsCode CR 或 TektonConfig CR
概述
当您的 Git 托管服务使用自签名证书或由自定义 CA 签发的证书时,PAC 的控制器 Pod 需要信任这些证书,才能成功连接到 Git 服务。此过程包括:
- 创建包含 CA 证书的 ConfigMap
- 在 PAC 控制器 Pod 中挂载该证书
- 配置 Git 使用该证书
第 1 步:准备 CA 证书
从您的 Git 托管服务管理员或组织的证书颁发机构获取 CA 证书文件。
CA 证书常见位置:
- 自托管 GitLab:通常可在 GitLab 安装目录或组织的 CA 中获得
- GitHub Enterprise:可向 GitHub Enterprise 服务器管理员获取
- Bitbucket Server:可向 Bitbucket Server 管理员获取
证书文件应为 PEM 格式:
-----BEGIN CERTIFICATE-----
<certificate-content>
-----END CERTIFICATE-----
第 2 步:创建包含 CA 证书的 ConfigMap
在 PAC 命名空间(默认:tekton-pipelines,如果不同请替换为实际命名空间)中创建包含 CA 证书的 ConfigMap:
方法 1:从文件创建
kubectl create configmap git-ca-cert \
--from-file=ca.crt=/path/to/ca.crt \
-n <pac-namespace> # 默认: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> # 默认: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 # 默认命名空间,可自定义
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_CAINFO 和 SSL_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> # 将 <pac-namespace> 替换为实际命名空间(默认: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:
# 设置 PAC 命名空间(默认: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 控制器日志中是否有证书相关错误:
# 设置 PAC 命名空间(默认:tekton-pipelines)
PAC_NAMESPACE="tekton-pipelines"
kubectl logs -n ${PAC_NAMESPACE} \
-l app=pipelines-as-code-controller \
--tail=100
如果配置正确,日志中不应出现 SSL/TLS 证书错误。
使用仓库测试
从托管在您的 Git 服务上的仓库触发测试流水线:
# 提交空提交以触发流水线
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 服务,提示证书问题。
解决方案:
-
验证证书格式:确保证书为 PEM 格式,包含正确的 BEGIN/END 标记
-
检查证书路径:确认证书挂载路径正确
-
验证环境变量:确保 GIT_SSL_CAINFO 和 SSL_CERT_FILE 设置正确
-
检查 ConfigMap:确认 ConfigMap 存在且包含证书内容:
kubectl get configmap git-ca-cert -n <pac-namespace> -o yaml # 将 <pac-namespace> 替换为实际命名空间(默认:tekton-pipelines)
示例输出:
apiVersion: v1
data:
ca.crt: |
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAK...
-----END CERTIFICATE-----
kind: ConfigMap
metadata:
name: git-ca-cert
namespace: tekton-pipelines
检查证书是否过期
问题:CA 证书已过期。
解决方案:
-
从证书颁发机构获取新的 CA 证书
-
更新 ConfigMap:
# 将 <pac-namespace> 替换为实际命名空间(默认: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
-
重启 PAC 控制器 Pod:
kubectl rollout restart deployment/pipelines-as-code-controller -n <pac-namespace> # 将 <pac-namespace> 替换为实际命名空间(默认:tekton-pipelines)
证书错误
问题:使用了错误的 CA 证书。
解决方案:
- 确认使用的是正确的 Git 托管服务的 CA 证书
- 对于自托管服务,从服务端直接获取证书
- 对于企业服务,联系管理员获取正确证书
Pod 未重启
问题:更新 CR 后 PAC 控制器 Pod 未重启。
解决方案:
-
检查 CR 状态:
kubectl get openshiftpipelinesascodes
示例输出:
NAME VERSION READY REASON
pipelines-as-code 0.x.x True Ready
-
查看 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"}
-
手动重启部署:
kubectl rollout restart deployment/pipelines-as-code-controller -n <pac-namespace> # 将 <pac-namespace> 替换为实际命名空间(默认:tekton-pipelines)
多个证书
如果需要信任多个 CA 证书(例如多个 Git 托管服务),您可以:
方案 1:将多个证书合并到单个 ConfigMap
将多个证书合并到一个文件中:
apiVersion: v1
kind: ConfigMap
metadata:
name: git-ca-cert
namespace: <pac-namespace> # 默认: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 控制器日志中的证书错误
- 备份:保留工作证书配置的备份
后续步骤