配置自定义证书
适用于管理员
本指南适用于需要为 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 服务。这需要:
- 创建包含 CA 证书的 ConfigMap
- 将证书挂载到 PAC 控制器 Pod 中
- 配置 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_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> # 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 服务。
解决方案:
- 验证证书格式:确保证书为 PEM 格式,并具有正确的 BEGIN/END 标记
- 检查证书路径:确认证书已挂载到正确路径
- 验证环境变量:确保
GIT_SSL_CAINFO 和 SSL_CERT_FILE 已正确设置
- 检查 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 证书已过期。
解决方案:
-
从你的证书颁发机构获取新的 CA 证书
-
更新 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
-
重启 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 证书。
解决方案:
- 确认你使用的是对应 Git 托管服务的正确 CA 证书
- 对于 self-hosted 服务,请直接从该服务获取证书
- 对于企业级服务,请联系管理员获取正确的证书
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> # 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 控制器日志中的证书错误
- 备份:保留可用证书配置的备份副本
下一步