# 过滤规则

这里主要介绍过滤规则的使用,支持按namespace、type、labels过滤etcd集群中的k8s数据。如果规则文件中未配置任何规则,则不会进行任何数据的同步。

提示

当前过滤规则主要适用于过滤etcd中的Kubernetes数据。

过滤规则配置文件是yaml格式的,基本结构如下:

filters:
  sequential: []
  secondary: []
1
2
3

# 优先级

# sequential

这部分用于配置需要被优先同步的数据,适用于对数据同步有顺序要求的场景。

# secondary

这部分是同步次优先级的数据,在sequential部分的数据同步完成后,才开始该部分的数据同步。

# 标签

支持三种标签:

  1. labelSelectors
  2. namespaceSelectors
  3. fieldSelectors

标签匹配规则格式如下,支持多个规则,多个规则满足其一则代表匹配成功:

matchExpressions:
  - key: // 标签的key
    operator:  // 支持"In"、"NotIn"、"Exists"、"DoesNotExist"
    values: // 标签的value
      - xx
      - xxx
1
2
3
4
5
6

# labelSelectors

# 符合下面标签规则的数据将会被同步。
labelSelectors:
  - matchExpressions:
    - key: etcd-carry.io/test
      operator: In
      values:
        - "true"
# 即A的labels包含"etcd-carry.io/test: true",那么A将会被同步。
1
2
3
4
5
6
7
8

# namespaceSelectors

# namespace中包含的标签符合下面规则的数据将会被同步。
namespaceSelectors:
  - matchExpressions:
    - key: etcd-carry.io/namespace-kind
      operator: In
      values:
        - test1
        - test2
# 即A的namespace为ns,ns中labels包含"etcd-carry.io/namespace-kind: test1" 或 "etcd-carry.io/namespace-kind: test2",那么A将会被同步。
1
2
3
4
5
6
7
8
9

# fieldSelectors

# 某个字段符合下面规则的数据将会被同步
fieldSelectors:
  - matchExpressions:
    - key: type
      operator: NotIn
      values:
        - kubernetes.io/service-account-token
# 即A的"type"字段不为"kubernetes.io/service-account-token",那么A将会被同步。
1
2
3
4
5
6
7
8

# namespace

该命名空间下的数据都会被同步到目的集群,未指定namespace则代表所有命名空间。即使同时指定了namespaceSelectors,也只匹配namespace

# group

k8s资源所属的apiGroup,"*"代表所有apiGroup。

# resources

同步k8s的某种资源,列表形式,格式如下:

# 比如,同步CRD、Secret到目的集群
resources:
  - group: apiextensions.k8s.io
    version: v1beta1
    kind: CustomResourceDefinition
  - group: ""
    version: v1
    Kind: Secret
1
2
3
4
5
6
7
8

# excludes

从同步数据中排除指定资源,支持多个规则,满足任意一条则不会被同步,支持以下字段:

  1. resource
  2. namespace
  3. name
  4. labelSelectors

# resource

排除某一种指定的资源:

# 排除CRD
excludes:
  - resource:
      group: apiextensions.k8s.io
      version: v1beta1
      kind: CustomResourceDefinition
1
2
3
4
5
6

# namespace

排除指定命名空间的资源,默认代表所有命名空间:

# 排除test命名空间下的"failover.etcd-carry.io/v1alpha1, Kind=ControllerFailOver"资源
excludes:
  - resource:
      group: failover.etcd-carry.io
      version: v1alpha1
      kind: ControllerFailOver
    namespace: test
1
2
3
4
5
6
7

# name

排除指定名称的资源:

# 排除test命名空间下名为etcd-carry的Secret资源
excludes:
  - resource:
      group: ""
      version: v1
      kind: Secret
    name: etcd-carry
    namespace: test
1
2
3
4
5
6
7
8

# labelSelectors

排除符合标签规则的资源:

# 排除labels中包含"app.etcd-carry.io/required-on-controller: true"标签项的"app.etcd-carry.io/v1beta1, Kind=Cell"资源
excludes:
  - resource:
      group: "app.etcd-carry.io"
      version: v1beta1
      kind: Cell
    labelSelectors:
      - matchExpressions:
          - key: app.etcd-carry.io/required-on-controller
            operator: In
            values:
              - "true"
1
2
3
4
5
6
7
8
9
10
11
12

# 示例

通过下面的示例来说明过滤规则:

filters:
  # 首先sequential中的CRD资源,以及带有"test.io/namespace-kind: unique"标签项的namespace资源会被优先同步到目的集群
  sequential:
    - group: apiextensions.k8s.io
      resources:
        - group: apiextensions.k8s.io
          version: v1
          kind: CustomResourceDefinition
    - group: ""
      resources:
        - version: v1
          kind: Namespace
      labelSelectors:
        - matchExpressions:
            - key: test.io/namespace-kind
              operator: In
              values:
                - unique
  # sequential中的CRD、Namespace同步完成后,开始同步符合secondary中规则的资源
  secondary:
    # 所属namespace的labels含有"test.io/namespace-kind: unique"的资源都会被同步,但labels中含有"test.io/namespace-kind:"标签项的Secret资源除外。
    - group: "*"
      namespaceSelectors:
        - matchExpressions:
            - key: test.io/namespace-kind
              operator: In
              values:
                - unique
      excludes:
        - resource:
            version: v1
            kind: Secret
          labelSelectors:
            - matchExpressions:
                - key: test.io/namespace-kind
                  operator: Exists
    # unit-test命名空间下type不为"kubernetes.io/service-account-token"的Secret资源都会被同步,但unit-test命名空间下名为exclude-me-secret的Secret除外。
    - group: ""
      resources:
        - version: v1
          Kind: Secret
      namespace: unit-test
      fieldSelectors:
        - matchExpressions:
            - key: type
              operator: NotIn
              values:
                - kubernetes.io/service-account-token
      excludes:
        - resource:
            version: v1
            kind: Secret
          name: exclude-me-secret
          namespace: unit-test
    # unit-test命名空间下labels包含"test.io/namespace-kind:"标签项的ConfigMap资源都会被同步。
    - group: ""
      resources:
        - version: v1
          kind: ConfigMap
      namespace: unit-test
      labelSelectors:
        - matchExpressions:
            - key: test.io/namespace-kind
              operator: Exists
    # 集群中所有labels包含"test.io/namespace-kind"标签项的Service资源都会被同步。
    - group: ""
      resources:
        - version: v1
          kind: Service
      labelSelectors:
        - matchExpressions:
            - key: test.io/namespace-kind
              operator: Exists
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Last Updated: 2/24/2023, 5:25:10 PM