Namespace 配置

针对环境特定的保留需求,按 Namespace 配置不同的 pruning 策略。

配置层级

设置流转:GlobalNamespaceResource Group

在全局配置中设置 enforcedConfigLevel: namespace,以启用 Namespace 级别覆盖。

验证边界

WARNING

关键 - 系统边界:仅在 PipelineRuns/TaskRuns 运行的用户 Namespace 中创建 Namespace 级别的 ConfigMaps。

禁止的 namespaces(验证将拒绝):

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

所有 configs 所需的 labels

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

Namespace 级别的 ConfigMaps 不在 TektonConfig 生命周期内。如果您稍后需要备份或恢复 Tekton 配置,请单独保存这些 ConfigMaps。

方法 1:内联 Namespace 规格(集中式)

在 TektonConfig 中定义所有 namespace 配置:

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:按 Namespace 的 ConfigMaps(自助式)

推荐用于 Namespace 隔离和团队自治。

步骤 1: 在 TektonConfig 中启用 Namespace 级别配置:

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: 创建特定于 namespace 的 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

优点:

  • Namespace 所有者可自助管理
  • 独立的生命周期管理
  • 优先于全局配置

验证规则

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

1. 显式全局限制

当全局配置定义了限制时,Namespace 配置不能超过该限制。

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. 系统默认限制

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

Configuration FieldSystem Maximum
ttlSecondsAfterFinished2,592,000 seconds (30 days)
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)仅适用于 Namespace 级别 ConfigMapstekton-pruner-namespace-spec),不适用于 全局 ConfigMap 中的内联 namespace 规格。

这可以工作(namespace 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 中的内联 namespace):

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

对于基于 selector 的 resource groups,请使用单独的 Namespace ConfigMaps(方法 2)。

常见模式

基于环境:

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

最佳实践

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

下一步