命名空间配置

针对不同的命名空间配置不同的 pruning 策略,以满足与环境相关的保留需求。

配置层次

设置流向:全局 → 命名空间 → 资源组

在全局配置中设置 enforcedConfigLevel: namespace 以启用命名空间级覆盖。

验证边界

WARNING

关键 - 系统边界:仅在 PipelineRuns/TaskRuns 运行的用户命名空间中创建命名空间级 ConfigMap。

禁止的命名空间(验证将拒绝):

  • 系统:kube-*
  • Tekton controllers:tekton-pipelines、tekton-*

所有配置都必须具备的标签:

labels:
  app.kubernetes.io/part-of: tekton-pruner
  pruner.tekton.dev/config-type: <global|namespace>
WARNING

命名空间级 ConfigMap 不在 TektonConfig 生命周期内。如果你之后需要备份或还原 Tekton 配置,请单独保存这些 ConfigMap。

方法 1:内联命名空间规格(集中式)

在 TektonConfig 中定义所有命名空间配置:

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # Must disable job-based pruner
  tektonpruner:
    disabled: false  # Enable event-based pruner
    global-config:
      enforcedConfigLevel: namespace
      ttlSecondsAfterFinished: 3600  # Global fallback
      namespaces:
        dev:
          ttlSecondsAfterFinished: 300
          successfulHistoryLimit: 3
        staging:
          ttlSecondsAfterFinished: 86400
          successfulHistoryLimit: 5
        prod:
          ttlSecondsAfterFinished: 604800
          successfulHistoryLimit: 10

方法 2:按命名空间的 ConfigMap(自助式)

推荐用于命名空间隔离和团队自治。

步骤 1: 在 TektonConfig 中启用命名空间级配置:

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # Must disable job-based pruner
  tektonpruner:
    disabled: false  # Enable event-based pruner
    global-config:
      enforcedConfigLevel: namespace
      ttlSecondsAfterFinished: 3600  # Fallback for namespaces without config

步骤 2: 创建特定于命名空间的 ConfigMap(固定名称:tekton-pruner-namespace-spec):

apiVersion: v1
kind: ConfigMap
metadata:
  name: tekton-pruner-namespace-spec  # Fixed name
  namespace: my-app  # User namespace only
  labels:
    app.kubernetes.io/part-of: tekton-pruner
    pruner.tekton.dev/config-type: namespace
data:
  ns-config: |
    ttlSecondsAfterFinished: 300
    successfulHistoryLimit: 5
    failedHistoryLimit: 10

优势:

  • 供命名空间所有者自助管理
  • 独立的生命周期管理
  • 优先级高于全局配置

验证规则

命名空间配置会根据限制进行验证,以防止资源耗尽。

1. 显式全局限制

当全局配置定义了限制时,命名空间配置不能超过该限制。

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # Must disable job-based pruner
  tektonpruner:
    disabled: false  # Enable event-based pruner
    global-config:
      ttlSecondsAfterFinished: 3600
      successfulHistoryLimit: 10
      namespaces:
        development:
          ttlSecondsAfterFinished: 7200   # Invalid: exceeds global limit
          successfulHistoryLimit: 5       # Valid: within global limit

2. 系统默认限制

当未定义全局限制时,系统会强制执行以下最大值:

配置字段系统最大值
ttlSecondsAfterFinished2,592,000 秒(30 天)
successfulHistoryLimit100
failedHistoryLimit100
historyLimit100

示例:

spec:
  tektonpruner:
    global-config:
      enforcedConfigLevel: namespace
      # No limits defined - system maximums apply
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: tekton-pruner-namespace-spec
  namespace: my-app
data:
  ns-config: |
    ttlSecondsAfterFinished: 2592001   # Invalid: exceeds system maximum
    successfulHistoryLimit: 150        # Invalid: exceeds system maximum

3. 覆盖默认值

集群管理员可以通过全局配置设置更严格的限制。全局限制会覆盖系统默认值,但不能超过系统最大值。

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # Must disable job-based pruner
  tektonpruner:
    disabled: false  # Enable event-based pruner
    global-config:
      ttlSecondsAfterFinished: 86400     # Admin limit: 1 day
      successfulHistoryLimit: 20         # Admin limit: 20 runs
      namespaces:
        development:
          ttlSecondsAfterFinished: 3600   # Valid: within global limit
        # ttlSecondsAfterFinished: 172800 # Invalid example: exceeds global limit

配置继承

未指定的设置会从更高层级继承:

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # Must disable job-based pruner
  tektonpruner:
    disabled: false  # Enable event-based pruner
    global-config:
      enforcedConfigLevel: namespace
      ttlSecondsAfterFinished: 3600     # Global default
      successfulHistoryLimit: 5          # Global default
      namespaces:
        dev:
          ttlSecondsAfterFinished: 300   # Override TTL
          # Inherits successfulHistoryLimit: 5 from global

Selector 支持

重要: 资源 selector(matchLabels、matchAnnotations)仅适用于命名空间级 ConfigMap(tekton-pruner-namespace-spec),而不适用于全局 ConfigMap 中的内联命名空间规格。

这会生效(命名空间 ConfigMap):

apiVersion: v1
kind: ConfigMap
metadata:
  name: tekton-pruner-namespace-spec
  namespace: my-app
  labels:
    app.kubernetes.io/part-of: tekton-pruner
    pruner.tekton.dev/config-type: namespace
data:
  ns-config: |
    pipelineRuns:
      - selector:
          matchLabels:
            critical: "true"
        ttlSecondsAfterFinished: 2592000

这会被忽略(全局 ConfigMap 中的内联命名空间):

spec:
  tektonpruner:
    global-config:
      namespaces:
        production:
          pipelineRuns:
            - selector:
                matchLabels:
                  critical: "true"

对于基于 selector 的资源组,请使用单独的命名空间 ConfigMap(方法 2)。

常见模式

基于环境:

spec:
  tektonpruner:
    global-config:
      enforcedConfigLevel: namespace
      namespaces:
        dev:
          ttlSecondsAfterFinished: 300
          successfulHistoryLimit: 3
        staging:
          ttlSecondsAfterFinished: 86400
          successfulHistoryLimit: 5
        prod:

最佳实践

  1. 使用清晰的命名空间命名约定
  2. 在开发环境中先采用较宽松的限制
  3. 在生产环境中实施更严格的保留策略
  4. 记录命名空间配置决策
  5. 定期审查并调整设置
  6. 在部署前测试配置
  7. 对基于 selector 的组使用命名空间 ConfigMap

后续步骤