仅配置部分集群

通常,Config Sync 会将配置应用到每个已注册的集群。如果配置位于 namespaces/ 子目录中,则 Config Sync 会先在每个集群内创建命名空间,然后再将所有继承的配置应用到该命名空间。

但是,您可以将配置应用于部分集群。从 1.6.1 版本开始,您可以向配置中添加 configsync.gke.io/cluster-name-selector 注释。如果您使用的是早于 1.6.1 的版本,则可以使用 ClusterSelector

使用集群选择器注释

您可以将 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,每个集群的名称都不得重复。集群名称在配置 Config Sync Operator 时进行设置。 您可以手动为每个集群应用标签,但我们建议使用 Cluster 配置。

接下来,您将创建 ClusterSelector,然后在另一项配置中引用它

向集群添加标签

如需使用 ClusterSelector,每个集群都必须具有一组可供选择的标签。您可以手动为集群添加标签,但建议您为每个集群使用 Cluster 配置。集群配置存储在您的 Git 代码库的 clusterregistry/ 目录中。

config-management.yaml 文件的 clusterName 字段应与至少一个集群配置的 metadata.name 字段匹配。

以下示例 Cluster 配置声明 cluster-2 具有 environment: prod 标签。

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

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

创建 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,否则该 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:audit
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

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

后续步骤