数据库配置

本文档介绍如何为 Tekton Results 配置所需的数据库。

NOTE

目前,我们仅支持连接外部数据库。原因如下:

  • 内置数据库缺少备份、监控、高可用和高级管理能力等关键生产特性。它仅提供基本的存储和查询功能,不适合生产环境。
  • 外部数据库提供完整的企业级功能,包括自动备份、性能监控、扩展能力以及专业支持,这些都是生产部署所必需的。
  • 我们的 Data Services 产品已经提供了完整的 PostgreSQL 管理能力。

前提条件

集群要求

  • 集群中必须已安装 Tekton Operator。

数据库要求

版本:

  • PostgreSQL 12 或更高版本
  • 建议使用更新的版本,以获得更长的维护支持

数据库设置:

  • 数据库必须已经存在
  • 数据库应为空(Tekton Results 会自动创建所需的表结构)
  • 确保数据库用户具有创建表的权限

创建数据库命令:

CREATE DATABASE tekton_results;

配置概述

Tekton Results 支持使用外部 PostgreSQL 数据库。配置分为两部分:

  1. 数据库凭据(用户名和密码)存储在 Kubernetes Secret 中
  2. 数据库连接参数(主机、端口、数据库名称、SSL 设置)配置在 TektonConfig 自定义资源的 spec.result

配置参数参考

字段描述默认值是否必填
is_external_db是否使用外部数据库false是(外部 DB 时设为 true
db_host数据库主机地址localhost
db_port数据库端口5432
db_name数据库名称tekton_results
db_sslmodeSSL 连接模式disable
db_sslrootcertSSL 根证书路径为空否(使用 SSL 时必填)
db_secret_name数据库凭据的 Secret 名称为空

db_sslmode 的有效选项说明请参见 https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-PROTECTION

基本配置

对于不使用 SSL 的基础外部数据库配置,请按以下步骤操作:

1. 创建数据库凭据

Secret 中需要的字段:

字段描述示例值
POSTGRES_USER数据库用户名result
POSTGRES_PASSWORD数据库密码your_secure_password

创建 Secret 命令:

kubectl create secret generic tekton-results-postgres \
  --namespace="tekton-pipelines" \
  --from-literal=POSTGRES_USER=result \
  --from-literal=POSTGRES_PASSWORD=your_secure_password

Secret YAML 示例:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: tekton-results-postgres
data:
  POSTGRES_USER: <base64 encoded username>
  POSTGRES_PASSWORD: <base64 encoded password>

2. 配置 TektonConfig 资源

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  result:
    is_external_db: true
    db_host: your-postgres-host.example.com
    db_port: 5432
    db_name: tekton_results
    db_sslmode: allow
    db_secret_name: tekton-results-postgres
TIP

本文档仅列出与数据库相关的配置字段。完整字段列表请参见 快速开始

3. 验证配置

kubectl get tektonconfig config
kubectl get pods -n tekton-pipelines -l app.kubernetes.io/name=tekton-results-api
TIP

本快速开始仅涵盖基础配置。对于需要 SSL、高级安全性或自定义 CA 证书的生产环境,请参见下方的高级配置部分。

高级配置

SSL 配置

当需要安全的数据库连接时,可以配置与 SSL 相关的参数:

SSL 模式选择指南:

环境推荐模式安全级别描述
开发环境disable不加密
测试环境require基础加密连接
生产环境verify-full最高加密 + 证书验证

SSL 模式说明

sslmode窃听防护MITM 防护说明
disable我不在乎安全性,也不想承担加密带来的开销。
allow可能我不在乎安全性,但如果服务器坚持要求加密,我愿意承担加密带来的开销。
prefer可能我不在乎加密,但如果服务器支持,我希望承担加密带来的开销。
require我希望我的数据被加密,并且可以接受相关开销。我相信网络会确保我始终连接到我想要的服务器。
verify-ca取决于 CA 策略我希望数据被加密,并且可以接受相关开销。我希望确认自己连接的是受信任的服务器。
verify-full我希望数据被加密,并且可以接受相关开销。我希望确认自己连接的是受信任的服务器,而且它就是我指定的那台。

verify-caverify-full 的区别取决于根 CA 的策略。如果使用公共 CA,verify-ca 允许连接到某个他人可能已经在该 CA 下注册过的服务器。在这种情况下,应始终使用 verify-full。如果使用本地 CA,甚至是自签名证书,使用 verify-ca 往往就能提供足够的保护。

WARNING

重要: 当使用 requireverify-caverify-full 这些 SSL 模式时,必须提供为数据库服务器证书签名的 CA 证书。如果没有正确配置 CA 证书,Tekton Results 各组件将无法启动。详细配置步骤请参见下方的配置自定义 CA 证书部分。

配置自定义 CA 证书

当使用需要证书验证的 SSL 模式(requireverify-caverify-full)时,需要提供为数据库服务器证书签名的 CA 证书。最常见的做法是将 CA 证书存储在 ConfigMap 中,然后挂载到 Tekton Results 的 pods 中。

步骤 1:使用 CA 证书创建 ConfigMap

如果你有一个名为 root.crt 的 CA 证书文件,请创建一个 ConfigMap:

kubectl create configmap db-root-crt -n tekton-pipelines --from-file ca.crt=./root.crt

步骤 2:通过 Volume Mounts 配置 TektonConfig

为了让容器能够访问 CA 证书,需要在 TektonConfig 资源的 spec.result 下配置额外的 options,以挂载该 ConfigMap:

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  result:
    is_external_db: true
    # 数据库连接配置
    db_host: your-postgres-host.example.com
    db_port: 5432
    db_name: tekton_results
    db_sslmode: verify-full
    db_sslrootcert: /etc/tls/db/ca.crt
    # Secret 配置
    db_secret_name: tekton-results-postgres
    # 挂载 CA 证书的选项
    options:
      deployments:
        tekton-results-api:
          spec:
            template:
              spec:
                containers:
                  - name: api
                    volumeMounts:
                      - mountPath: /etc/tls/db
                        name: postgredb-tls-ca
                        readOnly: true
                volumes:
                  - configMap:
                      name: db-root-crt
                    name: postgredb-tls-ca
        tekton-results-retention-policy-agent:
          spec:
            template:
              spec:
                containers:
                  - name: retention-policy-agent
                    volumeMounts:
                      - mountPath: /etc/tls/db
                        name: postgredb-tls-ca
                        readOnly: true
                volumes:
                  - configMap:
                      name: db-root-crt
                    name: postgredb-tls-ca

使用此配置后:

  • CA 证书将在容器中的 /etc/tls/db/ca.crt 路径可用
  • db_sslrootcert 设置为 /etc/tls/db/ca.crt,以匹配挂载路径
  • API server 和 retention policy agent 都可以访问该 CA 证书

运维

更新数据库配置

修改数据库配置后,需要重启 Tekton Results 组件,变更才会生效

选项 1:重启特定 deployment

# 重启 API server
kubectl delete pod -n tekton-pipelines -l app.kubernetes.io/name=tekton-results-api

# 重启 retention policy agent
kubectl delete pod -n tekton-pipelines -l app.kubernetes.io/name=tekton-results-retention-policy-agent

选项 2:重新创建 TektonConfig 资源

# 获取当前 TektonConfig 资源并重新创建
kubectl get tektonconfig config -o yaml | kubectl replace --force -f -

验证变更:

# 检查 pods 是否使用新配置运行
kubectl get pods -n tekton-pipelines -l app.kubernetes.io/name=tekton-results-api
kubectl get pods -n tekton-pipelines -l app.kubernetes.io/name=tekton-results-retention-policy-agent
WARNING

如果你更新了 db_sslmode 字段,可能需要重新创建 TektonConfig 资源,变更才会生效。

kubectl get tektonconfig config -o yaml | kubectl replace --force -f -

故障排查

常见问题

  1. Connection refused:

    • 验证数据库主机和端口
    • 检查网络连通性
    • 确认数据库正在运行
  2. Authentication failed:

    • 验证 Secret 中的用户名和密码
    • 检查数据库用户权限
  3. SSL certificate errors:

    • 验证 CA 证书是否已正确挂载
    • 检查 SSL 模式配置
    • 确保证书路径与挂载路径一致

验证命令

# 检查 TektonConfig 状态
kubectl get tektonconfig config -o yaml

# 检查 pod 日志
kubectl logs -n tekton-pipelines -l app.kubernetes.io/name=tekton-results-api

# 验证 Secret 是否存在
kubectl get secret tekton-results-postgres -n tekton-pipelines

使用 Data Services 中的 PostgreSQL

Data Services 支持部署可用于 Tekton Results 的 PostgreSQL 实例。在创建 PostgreSQL 实例时,请注意以下重要要求:

  1. 选择与 Tekton Results 版本匹配的 PostgreSQL 版本,例如可以选择 PostgreSQL 12.x 或更高版本。
  2. 存储配额不得小于 5Gi

创建 PostgreSQL 实例时,会自动生成一个包含连接信息的 Secret。可以使用标签 middleware.instance/type: PostgreSQL 过滤该 Secret 资源。

kubectl get secret -n <ns-of-postgresql-instance> -l middleware.instance/type=PostgreSQL | grep -E '^postgres'
INFO

该 Secret 包含 hostportusernamepassword 信息。你需要基于此 Secret 补充 database 信息,并在 Tekton Results 实例所在的命名空间中创建一个新的 secret。

如果需要设置 sslmode,请在 TektonConfigspec.result 部分将 db_sslmode 设置为 allowprefer 等值。

有关更多 PostgreSQL 部署参数和要求,请参见 PostgreSQL 部署文档