配置集群和集群级对象

本页面介绍如何配置集群和集群级对象。您还可以了解如何配置命名空间和命名空间级对象

配置集群和集群级对象

非结构化代码库中,您可以采用最方便的方式组织集群和集群级对象的配置。以这种方式组织的所有配置都会应用于在 Config Sync 中注册的每个集群。

分层代码库中,集群和集群级对象的所有配置都位于 cluster/ 目录中。cluster/ 中的所有配置都适用于 Config Sync 中注册的每个集群。

配置 CustomResourceDefinitions

Config Sync 可让您以同步任何其他资源的相同方式同步 CustomResourceDefinition (CRD)。在同步 CRD 时,有一些注意事项:

  • 即使在声明带有命名空间的自定义资源时,分层代码库中的 CRD 也必须放置在 cluster/ 目录中。

  • CRD 及其相应 CustomResource 不会按任何可预测的顺序进行更新。如果您在同一次提交中修改了 CRD 和相应的 CustomResource,则 CRD 更新不会早于自定义资源更新。这可能导致 nomos status 在短时间内报告暂时性错误,直到集群中同时存在 CustomResource 和 CRD。

  • 如果代码库中的任何 CustomResource 依赖于 CRD,则 Config Sync 不允许移除该 CRD。如需移除 CRD,您还需要移除其 CustomResource。建议您在向代码库执行的同一次提交中同时移除这两项。

  • 您可以同步 CustomResource 而不同步其 CRD,只要您能保证 CRD 已存在于集群中。

限制受配置影响的集群

默认情况下,Config Sync 会将配置应用到每个已注册的集群。但是,如果只需要将配置应用于部分集群,则可以向代码库中添加集群名称选择器注解或 ClusterSelector 配置。

cluster-name-selector 注解提供了一种用于指定要应用配置的部分集群的简单方法。此选项仅支持按名称选择集群。

ClusterSelector 对象支持按标签选择集群,但需要更复杂的配置。

使用 cluster-name-selector 注解进行配置

您可以使用 configsync.gke.io/cluster-name-selector 注解将配置应用于部分集群。您可以使用注解将配置应用于一组以集群名称表示的集群。该注解的值是以英文逗号分隔的目标集群名称列表。您可以在集群级对象和命名空间级对象上应用注解。当注解与集群名称相匹配并且选定了集群所属的命名空间时,系统就会选择命名空间对象。

选择单个集群

以下配置会创建一个名为 namespace-reader 的 Role,该对象定义了一组用于读取命名空间的权限。此 Role 仅在名为 cluster-1 的集群上应用。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

选择集群列表

以下配置会创建与上例相同的 Role,但此 Role 仅在名为 cluster-1cluster-2cluster-3 的集群上应用。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1,cluster-2,cluster-3
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

使用 ClusterSelector 对象进行配置

ClusterSelector 是一种使用 Kubernetes labelSelectors 的特殊类型的配置。 您可以使用 ClusterSelector 根据集群的标签来限制特定配置所适用的集群。您还可以使用 ClusterSelector 来限制哪些集群实例化命名空间级对象。

与其他 labelSelector 一样,ClusterSelector 使用 AND 逻辑运行。由于 ClusterSelector 使用 AND 逻辑,因此只有在对象与您定义的所有标签匹配时,才会选择对象。

ClusterSelector 配置不会在集群中保留。如需保留 ClusterSelector 配置,您可以在另一项配置中使用注释对其进行引用,但该配置将仅应用于与 ClusterSelector 匹配的集群。

如需使用 ClusterSelector,每个集群都必须具有唯一的名称和一组可供选择的标签。集群元数据在可靠来源的 Cluster 配置中指定。

接下来,您为集群添加标签创建 ClusterSelector,然后在另一个配置中引用它

向集群添加标签

如需使用 ClusterSelector,每个集群都必须具有一组可供选择的标签。在非结构化代码库中,集群配置可以任意存储在配置目录或其后代目录中。在分层代码库中,集群配置存储在 clusterregistry/ 目录中。

如需将配置应用于集群,集群配置的 metadata.name 字段必须与 ConfigManagement 对象的 clusterName 字段相匹配。

以下集群配置示例声明 cluster-2 具有 environment: prodlocation: central 标签。

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-2
  labels:
    environment: prod
    location: central

您还可以使用 Cluster 配置来应用注释。

创建 ClusterSelector

借助 ClusterSelector,您可以仅选择具有指定标签或标签组合的集群。在非结构化代码库中,ClusterSelector 可以任意存储在同步目录或其后代目录中。在分层代码库中,ClusterSelector 存储在代码库的顶级 clusterregistry/ 目录中。

以下 ClusterSelector 将仅选择具有 environment: prod 标签的集群。

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-env-prod
spec:
  selector:
    matchLabels:
      environment: prod

以下 ClusterSelector 选择任何具有 location: centrallocation: west 标签的集群。

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-central-or-west
spec:
  selector:
    matchExpressions:
      - key: location
        operator: In
        values:
        - central
        - west 

除非您在另一项配置中引用 ClusterSelector,否则该 ClusterSelector 不会产生任何作用。

引用 ClusterSelector

如需在其他配置中引用 ClusterSelector,请设置 configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME 注释。

以下配置会创建一个名为 namespace-reader 的 ClusterRole,该对象定义了一组用于读取命名空间的权限。此 ClusterRole 仅在与 selector-env-prod ClusterSelector 匹配的集群上进行实例化。

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-reader
  annotations:
    configmanagement.gke.io/cluster-selector: selector-env-prod
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

限制受命名空间级配置影响的集群

默认情况下,Config Sync 会将一个命名空间继承的配置应用到所有相关集群中的该命名空间。您可以使用 ClusterSelector 将配置仅应用于这些集群中的一部分。

例如,您可以根据集群的地理位置或其客户端的地理位置对集群进行不同的配置。在本地化或法规遵从方面,这项配置会很有用。本部分中的示例仅将语言区域特定的配置应用于带有 location: france 标签的集群。

以下 Cluster 配置向名为 cluster-1 的集群添加一个 location: france 标签:

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-1
  labels:
    location: france

创建一项 ClusterSelector 配置以用于引用您要选择的标签。以下 ClusterConfig 选择 location: france 标签:

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-location-france
spec:
  selector:
    matchLabels:
      location: france

当您在另一个配置中引用 ClusterSelector 之后,该 ClusterSelector 才会生效。 以下 RoleBinding 配置仅选择与 selector-location-france ClusterSelector 匹配的集群。举例来说,如果合规性指南仅允许特定服务账号查看其指定地理区域内集群的信息,则此配置可能很有用。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: viewers
  annotations:
    configmanagement.gke.io/cluster-selector: selector-location-france
subjects:
- kind: Group
  name: system:serviceaccounts:foo
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

如果将该配置放入抽象命名空间或命名空间目录(例如 namespaces/eng)中,那么该配置将应用于继承它的命名空间,但仅应用于具有 location: france 标签的集群。

后续步骤