Namespace Configuration

针对不同命名空间配置不同的修剪策略,以满足环境特定的保留需求。

目录

配置层级

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

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

校验边界

WARNING

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

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

  • 系统:kube-*
  • Tekton 控制器:tekton-pipelinestekton-*

所有配置必须包含以下标签:

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

命名空间级别的 ConfigMaps 不在 TektonConfig 生命周期管理范围内。如果以后需要备份或恢复 Tekton 配置,请单独保存这些 ConfigMaps。

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

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

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # 必须禁用基于 Job 的修剪器
  tektonpruner:
    disabled: false  # 启用基于事件的修剪器
    global-config:
      enforcedConfigLevel: namespace
      ttlSecondsAfterFinished: 3600  # 全局回退值
      namespaces:
        dev:
          ttlSecondsAfterFinished: 300
          successfulHistoryLimit: 3
        staging:
          ttlSecondsAfterFinished: 86400
          successfulHistoryLimit: 5
        prod:
          ttlSecondsAfterFinished: 604800
          successfulHistoryLimit: 10

方法二:每命名空间 ConfigMaps(自助式)

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

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

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # 必须禁用基于 Job 的修剪器
  tektonpruner:
    disabled: false  # 启用基于事件的修剪器
    global-config:
      enforcedConfigLevel: namespace
      ttlSecondsAfterFinished: 3600  # 无配置命名空间的回退值

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

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: |
    ttlSecondsAfterFinished: 300
    successfulHistoryLimit: 5
    failedHistoryLimit: 10

优点:

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

校验规则

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

1. 显式全局限制

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

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # 必须禁用基于 Job 的修剪器
  tektonpruner:
    disabled: false  # 启用基于事件的修剪器
    global-config:
      ttlSecondsAfterFinished: 3600
      successfulHistoryLimit: 10
      namespaces:
        development:
          ttlSecondsAfterFinished: 7200   # 无效:超过全局限制
          successfulHistoryLimit: 5       # 有效:在全局限制内

2. 系统默认限制

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

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

示例:

spec:
  tektonpruner:
    global-config:
      enforcedConfigLevel: namespace
      # 未定义限制 - 应用系统最大值
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: tekton-pruner-namespace-spec
  namespace: my-app
data:
  ns-config: |
    ttlSecondsAfterFinished: 2592001   # 无效:超过系统最大值
    successfulHistoryLimit: 150        # 无效:超过系统最大值

3. 覆盖默认值

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

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # 必须禁用基于 Job 的修剪器
  tektonpruner:
    disabled: false  # 启用基于事件的修剪器
    global-config:
      ttlSecondsAfterFinished: 86400     # 管理员限制:1 天
      successfulHistoryLimit: 20         # 管理员限制:20 次运行
      namespaces:
        development:
          ttlSecondsAfterFinished: 3600   # 有效:在全局限制内
        # ttlSecondsAfterFinished: 172800 # 无效示例:超过全局限制

配置继承

未指定的设置将继承自更高层级:

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pruner:
    disabled: true  # 必须禁用基于 Job 的修剪器
  tektonpruner:
    disabled: false  # 启用基于事件的修剪器
    global-config:
      enforcedConfigLevel: namespace
      ttlSecondsAfterFinished: 3600     # 全局默认
      successfulHistoryLimit: 5          # 全局默认
      namespaces:
        dev:
          ttlSecondsAfterFinished: 300   # 覆盖 TTL
          # successfulHistoryLimit: 5 继承自全局

选择器支持

重要: 资源选择器(matchLabels、matchAnnotations)仅在命名空间级 ConfigMapstekton-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"

对于基于选择器的资源组,请使用独立的命名空间 ConfigMaps(方法二)。

常见模式

基于环境:

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. 对于基于选择器的组,使用命名空间 ConfigMaps

后续步骤