1.14. 创建和管理 ManagedClusterSets

ManagedClusterSet 是一个受管集群的组。使用受管集群集,您可以一起管理对组中所有受管集群的访问。您还可以创建一个 ManagedClusterSetBinding 资源,将 ManagedClusterSet 资源绑定到命名空间。

每个受管集群都必须是 ManagedClusterSet 的成员。安装 hub 集群时,会创建一个名为 defaultManagedClusterSet。所有没有特别分配给受管集群集的受管集群都会被自动分配给 default 受管集群集。为确保默认受管集群集始终可用,您无法删除或更新 default 受管集群集。

注: 没有特别添加到 ManagedClusterSet 中的集群池不会添加到默认的 ManagedClusterSet 中。从集群池中声明受管集群后,如果不明确添加到另一个 ManagedClusterSet 中,则会将其添加到默认 ManagedClusterSet 中。

1.14.1. 创建 ManagedClusterSet

您可以在受管集群集中将受管集群分组在一起,以限制受管集群的用户访问权限。

需要的访问权限: 集群管理员

ManagedClusterSet 是一个集群范围的资源,因此您必须在创建 ManagedClusterSet 的集群中具有集群管理权限。受管集群不能包含在多个 ManagedClusterSet 中。您可以从 Red Hat Advanced Cluster Management for Kubernetes 控制台或命令行界面创建受管集群集。

1.14.1.1. 使用控制台创建 ManagedClusterSet

完成以下步骤,使用 Red Hat Advanced Cluster Management 控制台创建受管集群集:

  1. 在主控制台导航中,选择 Infrastructure > Clusters 并确保选择了 Cluster set 选项卡。
  2. 选择 Create cluster set,并输入集群集的名称。

1.14.1.2. 使用命令行创建 ManagedClusterSet

将受管集群集的以下定义添加到 yaml 文件中,使用命令行创建受管集群集:

apiVersion: cluster.open-cluster-management.io/v1beta1
kind: ManagedClusterSet
metadata:
  name: <clusterset1>

clusterset1 替换为受管集集群的名称。

1.14.2. 为 ManagedClusterSet 分配用户或组基于角色的访问控制权限

您可以将用户或组分配给由 hub 集群上配置的身份提供程序提供的集群集合。

需要的访问权限:集群管理员

ManagedClusterSet API 提供了两个级别的 RBAC 权限:

  • 集群集 admin

    • 对分配给受管集群集的所有集群和集群池资源具有完全访问权限。
    • 创建集群、导入集群和创建集群池的权限。创建受管集群集时,必须将权限分配给受管集群集。
  • 集群集 view

    • 对分配给受管集群集的所有集群和集群池资源只读权限。
    • 没有创建集群、导入集群或创建集群池的权限。

完成以下步骤,通过 Red Hat Advanced Cluster Management 控制台将用户或组分配给受管集群集:

  1. 在控制台的主导航菜单中选择 Infrastructure > Clusters
  2. 选择 Cluster sets 选项卡。
  3. 选择您的目标集群集。
  4. 选择 Access management 选项卡。
  5. 选择 Add user or group
  6. 搜索,然后选择您要提供访问权限的用户和组。
  7. 选择 Cluster set adminCluster set view 角色,赋予所选用户或用户组。如需有关角色权限的更多信息,请参阅角色概述
  8. 选择 Add 以提交更改。

表中会显示您的用户或组。可能需要几秒钟后,分配到所有受管集群设置的资源的权限才会被传播到您的用户或组。

有关基于角色的操作的更多信息,请参阅基于角色的访问控制

如需放置信息,请参阅使用 ManagedClusterSets with Placement

1.14.2.1. 创建 ManagedClusterSetBinding 资源

创建一个 ManagedClusterSetBinding 资源,将 ManagedClusterSet 资源绑定到命名空间。在同一命名空间中创建的应用程序和策略只能访问包含在绑定受管集群集资源的受管集群。

命名空间的访问权限会自动应用到绑定到该命名空间的受管集群集。如果您有访问权限来访问受管集群设置的命名空间,则会自动具有访问绑定到该命名空间的任何受管集群集的权限。但是,如果您只拥有访问受管集群集的权限,则没有访问命名空间中其他受管集群集的权限。如果没有看到受管集群集,则可能没有查看它所需的权限。

您可以使用控制台或命令行创建受管集群集绑定。

1.14.2.1.1. 使用控制台创建 ManagedClusterSetBinding

完成以下步骤,使用 Red Hat Advanced Cluster Management 控制台从受管集群集中删除集群:

  1. 在主导航中选择 Infrastructure > Clusters 并选择 Cluster set 选项卡来访问集群页面。
  2. 选择您要为创建绑定的集群集的名称,以查看集群集详情。
  3. 选择 Actions > Edit namespace bindings
  4. Edit namespace bindings 页面中,从下拉菜单中选择您要将集群集绑定到的命名空间。已选择现有的与集群集绑定的命名空间。
1.14.2.1.2. 使用命令行创建 ManagedClusterSetBinding

要使用命令行创建受管集群集绑定,请完成以下步骤:

  1. yaml 文件中创建 ManagedClusterSetBinding 资源。在创建受管集群集绑定时,受管集群集绑定的名称必须与要绑定的受管集群集的名称匹配。您的 ManagedClusterSetBinding 资源可能类似以下信息:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: ManagedClusterSetBinding
    metadata:
      namespace: project1
      name: clusterset1
    spec:
      clusterSet: clusterset1
  2. 确保目标受管集群集有绑定权限。查看以下 ClusterRole 资源示例,其中包含允许用户绑定到 clusterset1 的规则:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: clusterrole1
    rules:
      - apiGroups: ["cluster.open-cluster-management.io"]
        resources: ["managedclustersets/bind"]
        resourceNames: ["clusterset1"]
        verbs: ["create"]

1.14.3. 将集群添加到 ManagedClusterSet

创建 ManagedClusterSet 后,您必须添加一个或多个受管集群。您可以使用控制台或命令行将受管集群添加到受管集群集。

1.14.3.1. 使用控制台将集群添加到 ManagedClusterSet

完成以下步骤,使用 Red Hat Advanced Cluster Management 控制台将集群添加到受管集群集中:

  1. 如果您只创建了受管集群集,选择 Manage resource assignments 以直接进入 Manage 资源分配页面。继续执行此流程的第 6 步。
  2. 如果集群已存在,在主导航中选择 Infrastructure > Clusters 来访问集群页面。
  3. 选择 Cluster set 选项卡来查看可用的集群集。
  4. 选择您要添加到受管集群集的集群集的名称,以查看集群设置详情。
  5. 选择 Actions > Manage resource assignments
  6. Manage resource assignments 页面上,选中您要添加到集群集的资源的复选框。
  7. 选择 Review 查看您的更改。
  8. 选择 Save 保存您的更改。

    注:如果将受管集群从一个受管集群集移到另一个受管集群,则必须在两个受管集群集中都有所需的 RBAC 权限。

1.14.3.2. 使用命令行将集群添加到 ManagedClusterSet

完成以下步骤,使用命令行将集群添加到受管集群集中:

  1. 确保有一个 RBAC ClusterRole 条目,供您在 managedclustersets/join 的虚拟子资源中创建。没有这个权限,就无法将受管集群分配给 ManagedClusterSet

    如果此条目不存在,请将其添加到您的 yaml 文件中。示例条目类似以下内容:

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: clusterrole1
    rules:
      - apiGroups: ["cluster.open-cluster-management.io"]
        resources: ["managedclustersets/join"]
        resourceNames: ["<clusterset1>"]
        verbs: ["create"]

    clusterset1 替换为 ManagedClusterSet 的名称。

    注:如果要将受管集群从一个 ManagedClusterSet 移到另一个,则必须在两个受管集群集中都有该权限。

  2. yaml 文件中查找受管集群的定义。在受管集群定义的这个部分添加与以下内容类似的标签:

    apiVersion: cluster.open-cluster-management.io/v1
    kind: ManagedCluster
    metadata:
      name: cluster1
    spec:
      hubAcceptsClient: true

    在本例中,cluster1 是受管集群的名称。

  3. 添加一个标签,指定 ManagedClusterSet,格式为: cluster.open-cluster-management.io/clusterset: clusterset1

    您的代码类似以下示例:

    apiVersion: cluster.open-cluster-management.io/v1
    kind: ManagedCluster
    metadata:
      name: cluster1
      labels:
        cluster.open-cluster-management.io/clusterset: clusterset1
    spec:
      hubAcceptsClient: true

    在本例中,cluster1 是添加到受管集群集 clusterset1 的集群 。

    注: 如果受管集群之前被分配给已删除的受管集群集,受管集群可能会有一个受管集群集已被指定到不存在的集群集合。如果出现这种情况,请用新名称替换。

1.14.4. 从 ManagedClusterSet 中删除受管集群

您可能希望从受管集群集中删除受管集群,将其移到不同的受管集群集,或者从集合的管理设置中删除。您可以使用控制台或命令行界面从受管集群集中删除受管集群。

注:每个受管集群都必须分配到一个受管集群集。如果您从 ManagedClusterSet 中删除受管集群,且不将其分配给不同的 ManagedClusterSet,则会自动添加到 default 受管集群集中。

1.14.4.1. 使用控制台从 ManagedClusterSet 中删除受管集群

完成以下步骤,使用 Red Hat Advanced Cluster Management 控制台从受管集群集中删除集群:

  1. 如果您只创建了受管集群集,选择 Manage resource assignments 以直接进入 Manage 资源分配页面。继续执行此流程的第 5 步。
  2. 如果集群已存在,在主导航中选择 Infrastructure > Clusters 来访问集群页面,并确保选择了 Cluster sets 选项卡。
  3. 选择您要从受管集群集中删除的集群集的名称,以查看集群设置详情。
  4. 选择 Actions > Manage resource assignments
  5. Manage resource assignments 页面上,选中您要从集群集合中删除的资源的复选框。

    此步骤删除已是集群集成员的资源,或添加尚未成为集群集成员的资源。您可以通过查看受管集群的详情来查看资源是否已是集群集的成员。

注: 如果要将受管集群从一个受管集群集移到另一个受管集群,则必须在两个受管集群集中都有所需的 RBAC 权限。

1.14.4.2. 使用命令行从 ManagedClusterSet 中删除集群

要使用命令行从受管集群集中删除受管集群,请完成以下步骤:

  1. 运行以下命令在受管集群集中显示受管集群列表:

    oc get managedclusters -l cluster.open-cluster-management.io/clusterset=<clusterset1>

    clusterset1 替换为受管集群集的名称。

  2. 找到您要删除的集群条目。
  3. 从您要删除的集群的 yaml 条目中删除该标签。参阅以下标签代码示例:

    labels:
       cluster.open-cluster-management.io/clusterset: clusterset1

注: 如果要将受管集群从一个受管集群集移到另一个受管集群集,则必须在两个受管集群集中都有所需的 RBAC 权限。

1.14.5. 在放置中使用 ManagedClusterSet

Placement 资源是一个命名空间范围的资源,它定义了一个规则来从 ManagedClusterSets 中选择 ManagedClusters 集合,它们绑定到放置命名空间。

需要的访问权限: Cluster administrator,Cluster set administrator

1.14.5.1. 放置概述

参阅以下有关使用受管集群放置的信息:

  • Kubernetes 集群在 hub 集群中注册,作为集群范围的 ManagedClusters
  • ManagedClusters 被组织到集群范围的 ManagedClusterSets 中。
  • ManagedClusterSets 与工作负载命名空间绑定。
  • 命名空间范围的放置指定 ManagedClusterSet 的一个部分,用于选择潜在 ManagedClusters 的工作集合。
  • 使用标签和声明选择器从该工作集中选择放置

    重要:如果没有绑定到放置命名空间的 ManagedClusterSet 绑定,Placement 不会选择 ManagedCluster

  • ManagedClusters 的放置可以使用污点和容限控制。如需更多信息,请参阅使用污点和容限放置受管集群

Placement 规格包括以下字段:

  • ClusterSets 代表从中选择 ManagedClustersManagedClusterSets

    • 如果没有指定,则从绑定到放置命名空间的 ManagedClusterSets 中选择 ManagedClusters
    • 如果指定,ManagedClusters 会从这个集合的交集和绑定到放置命名空间的 ManagedClusterSets 中选择。
  • NumberOfClusters 代表要选择的可以满足放置要求的 ManagedClusters 数量。

    如果没有指定,则会选择满足放置要求的所有 ManagedClusters

  • Predicates 代表一个 predicates 片段,用于选择带有标签和声明选择器的 ManagedClusters。predicate 是 ORed。
  • priorityrPolicy 代表优先级器的策略。

    • mode 可以是 Exact, Additive, 或 "",其中 "" 默认为 Additive

      • Additive 模式中,未特别提供配置值的任何优先级程序均通过其默认配置启用。在当前的默认配置中,SteadyBalance 的权重为 1,而其他优先级的权重为 0。默认配置将来可能会改变,这可能会改变优先级。additive 模式不要求您配置所有优先级别。
      • Exact 模式中,没有特别提供的配置值的任何优先级优先级的权重为零。Exact 模式要求您输入您想要的完整一组优先级程序,但可避免版本之间的行为改变。
    • configurations 表示优先级器的配置。

      • scoreCoordinate 代表优先级和分数源的配置。

        • type 定义优先级分数的类型。类型是 BuiltIn, AddOn, 或 " ",其中 " " 默认为 BuiltIn。当类型为 BuiltIn 时,必须指定 prioritizer 的名称。当类型为 AddOn 时,您需要在 AddOn 中配置分数源。
        • builtIn 定义 BuiltIn prioritizer 的名称。以下列表包含有效的 BuiltIn prioritizer 名称:

          • Balance: 平衡集群之间的决策。
          • Steady:确保现有决策稳定。
          • ResourceAllocatableCPU 和 ResourceAllocatableMemory: 根据可分配资源排序集群。
        • addOn 定义资源名称和分数名称。引入了 AddOnPlacementScore 来描述附加组件分数。请参阅可扩展调度以了解更多信息。

          • resourceName 定义 AddOnPlacementScore 的资源名称。放置 prioritizer 根据此名称选择 AddOnPlacementScore 自定义资源。
          • scoreName 定义 AddOnPlacementScore 中的分数名称。AddOnPlacementScore 包含分数名称和分数值的列表。scoreName,指定 prioritizer 要使用的分数。
      • weight 定义优先级优先级的权重。该值必须在 [-10,10] 范围内。每个优先级器计算一个集群在 [-100, 100] 范围内的整数分数。集群的最终分数由以下公式 sum(weight * prioritizer_score) 决定。权重越高,表示优先级函数在集群选择中获得更高的权重,而 0 个权重表示已禁用优先级优先级。负权重表示它是选定的最后一个。

注: configure.name 文件将在 v1beta1 中删除,并替换为 scoreCoordinate.builtIn 文件。如果同时定义了 namescoreCoordinate.builtIn,则使用 scoreCoordinate.builtIn 的值来确定选择。

1.14.5.2. 放置示例

您需要通过在该命名空间中创建一个 ManagedClusterSetBinding 来最少将一个 ManagedClusterSet 绑定到一个命名空间。注:您需要在 managedclustersets/bind 的虚拟子资源上对 CREATE 进行基于角色的访问权限。请参见以下示例:

  • 您可以使用 labelSelector 选择 ManagedClusters。请参阅以下示例,其中 labelSelector 仅与带有标签 vendor: OpenShift 的集群匹配:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement1
      namespace: ns1
    spec:
      predicates:
        - requiredClusterSelector:
            labelSelector:
              matchLabels:
                vendor: OpenShift
  • 您可以使用 claimSelector 选择 ManagedClusters。请参阅以下示例,其中 claimSelector 仅与带有 us-west-1region.open-cluster-management.io 的集群匹配:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement2
      namespace: ns1
    spec:
      predicates:
        - requiredClusterSelector:
            claimSelector:
              matchExpressions:
                - key: region.open-cluster-management.io
                  operator: In
                  values:
                    - us-west-1
  • 您可以从特定的 clusterSets 中选择 ManagedClusters。请参阅以下示例,其中 claimSelector 仅与 clusterSets: clusterset1 clusterset2 匹配:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement3
      namespace: ns1
    spec:
      clusterSets:
        - clusterset1
        - clusterset2
      predicates:
        - requiredClusterSelector:
            claimSelector:
              matchExpressions:
                - key: region.open-cluster-management.io
                  operator: In
                  values:
                    - us-west-1
  • 选择所需的 ManagedClusters 数量。请参阅以下示例,其中 numberOfClusters3

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement4
      namespace: ns1
    spec:
      numberOfClusters: 3
      predicates:
        - requiredClusterSelector:
            labelSelector:
              matchLabels:
                vendor: OpenShift
            claimSelector:
              matchExpressions:
                - key: region.open-cluster-management.io
                  operator: In
                  values:
                    - us-west-1
  • 选择具有最大可分配内存的集群。

    注: 与 Kubernetes Node Allocatable 类似,"可分配"这里定义为每个集群中 pod 可用的计算资源数量。

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement6
      namespace: ns1
    spec:
      numberOfClusters: 1
      prioritizerPolicy:
        configurations:
          - scoreCoordinate:
              builtIn: ResourceAllocatableMemory
  • 选择具有最大可分配 CPU 和内存的集群,并区分资源更改。

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement7
      namespace: ns1
    spec:
      numberOfClusters: 1
      prioritizerPolicy:
        configurations:
          - scoreCoordinate:
              builtIn: ResourceAllocatableCPU
            weight: 2
          - scoreCoordinate:
              builtIn: ResourceAllocatableMemory
            weight: 2
  • 选择具有最大可分配内存的两个集群,以及最大附加组件分数 cpu 比例,并固定放置决策。

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement8
      namespace: ns1
    spec:
      numberOfClusters: 2
      prioritizerPolicy:
        mode: Exact
        configurations:
          - scoreCoordinate:
              builtIn: ResourceAllocatableMemory
          - scoreCoordinate:
              builtIn: Steady
            weight: 3
          - scoreCoordinate:
              type: AddOn
              addOn:
                resourceName: default
                scoreName: cpuratio

1.14.5.3. 放置决定

将创建一个或多个带有标签 cluster.open-cluster-management.io/placement={placement name}PlacementDecisions 来代表由一个 Placement 选择的 ManagedClusters

如果选择了 ManagedCluster 并添加到 PlacementDecision 中,消耗此放置的组件可能会在这个 ManagedCluster 上应用工作负载。当 ManagedCluster 不再被选择后,它会从 PlacementDecisions 中删除后,在此 ManagedCluster 上应用的工作负载也会被相应地删除。

请参阅以下 PlacementDecision 示例:

apiVersion: cluster.open-cluster-management.io/v1beta1
kind: PlacementDecision
metadata:
  labels:
    cluster.open-cluster-management.io/placement: placement1
  name: placement1-kbc7q
  namespace: ns1
  ownerReferences:
    - apiVersion: cluster.open-cluster-management.io/v1beta1
      blockOwnerDeletion: true
      controller: true
      kind: Placement
      name: placement1
      uid: 05441cf6-2543-4ecc-8389-1079b42fe63e
status:
  decisions:
    - clusterName: cluster1
      reason: ''
    - clusterName: cluster2
      reason: ''
    - clusterName: cluster3
      reason: ''

1.14.5.4. 附加组件状态

您可能希望根据部署在其上的附加组件的状态,为放置选择受管集群。例如,只有在集群中启用了特定的附加组件时,才会为放置选择受管集群。

您可以为附加组件指定标签,并在创建放置时根据需要指定其状态(如果需要)。如果集群中启用了附加组件,则会自动在 ManagedCluster 资源上创建一个标签。如果禁用了附加组件,则会自动删除该标签。

每个附加组件都由一个标签表示,格式为 feature.open-cluster-management.io/addon-<addon_name>=<status_of_addon>

使用要在要选择的受管集群中启用的附加组件名称替换 addon_name

status_of_addon 替换为在选择集群时该附加组件应具有的状态。status_of_addon 的可能值位于以下列表中:

  • available :附加组件已启用并可用。
  • unhealthy:附加组件已启用,但租期不会持续更新。
  • unreachable :附加组件已启用,但没有为其找到租用。也可以在受管集群离线时导致这个问题。

例如,可用的 application-manager 附加组件由受管集群中的标签表示:

feature.open-cluster-management.io/addon-application-manager: available

请参阅以下基于附加组件及其状态创建放置的示例:

  • 您可以通过添加以下 YAML 内容来创建放置,其中包含启用了 application-manager 的所有受管集群:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement1
      namespace: ns1
    spec:
      predicates:
        - requiredClusterSelector:
            labelSelector:
              matchExpressions:
                - key: feature.open-cluster-management.io/addon-application-manager
                  operator: Exists
  • 您可以通过添加以下 YAML 内容来创建放置,其中包含启用了 application-manager 且具有 available 状态的所有受管集群:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement2
      namespace: ns1
    spec:
      predicates:
        - requiredClusterSelector:
            labelSelector:
              matchLabels:
                "feature.open-cluster-management.io/addon-application-manager": "available"
  • 您可以通过添加以下 YAML 内容来创建包含禁用 application-manager 的所有受管集群的放置:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement3
      namespace: ns1
    spec:
      predicates:
        - requiredClusterSelector:
            labelSelector:
              matchExpressions:
                - key: feature.open-cluster-management.io/addon-application-manager
                  operator: DoesNotExist

1.14.5.5. 可扩展调度

在基于放置资源的调度中,prioritizer 需要比 MananagedCluster 资源提供的默认值更多的数据来计算受管集群分数。例如,根据通过监控系统获取的集群 CPU 或内存使用情况数据来调度集群。

API AddOnPlacementScore 支持根据自定义分数进行调度的更可扩展方式。

  • 您可以指定 placement.yaml 文件中的分数来选择集群。
  • 作为分数供应商,第 3 方控制器可以在 hub 集群或受管集群上运行,以便维护 AddOnPlacementScore 生命周期,并在其中更新分数。

请参阅 open-cluster-management 存储库中的放置可扩展调度增强,以了解更多信息。

1.14.6. 使用污点和容限来放置受管集群

您可以使用污点和容限控制受管集群或受管集群集的放置。污点和容限提供了一种防止为特定放置选择受管集群的方法。如果要阻止某些受管集群包含在某些放置中,这个控制会很有用。您可以向受管集群添加污点,并为放置添加容限。如果污点和容限不匹配,则不会为该放置选择受管集群。

1.14.6.1. 将污点添加到受管集群

污点在受管集群的属性中指定,并允许放置来重新放置受管集群或一组受管集群。您可以通过输入类似以下示例的命令,为受管集群添加污点:

kubectl taint ManagedCluster <managed_cluster_name> key=value:NoSelect

污点的规格包括以下字段:

  • 必需键 - 应用到集群的污点键。这个值必须与受管集群的容限中的值匹配,以满足添加到该放置的条件。您可以确定这个值。例如,这个值可以是 barfoo.example.com/bar
  • 可选值 - 污点键的污点值。这个值必须与受管集群的容限中的值匹配,以满足添加到该放置的条件。例如,这个值可以是 value
  • 必需效果 - 污点对不容许污点的放置效果,或者在污点和放置容限不匹配时发生什么。effect 的值必须是以下值之一:

    • NoSelect - 除非容许这个污点,否则不允许放置来选择集群。如果在设置污点前放置选择了集群,则会从放置决定中移除集群。
    • NoSelectIfNew - 如果是新集群,调度程序就无法选择该集群。只有容许污点且已在其集群决策中拥有集群,放置才可以选择集群。
  • 必需 TimeAdded - 添加污点的时间。这个值会自动设置。

1.14.6.2. 识别内置污点以反映受管集群的状态

当无法访问受管集群时,您不希望集群添加到放置中。以下污点会自动添加到无法访问的受管集群:

  • cluster.open-cluster-management.io/unavailable - 当集群有 ManagedClusterConditionAvailable 条件为 False 时,这个污点被添加到受管集群。污点具有 NoSelect 和空值的效果,以防止调度不可用的集群。以下内容中提供了此污点的示例:

    apiVersion: cluster.open-cluster-management.io/v1
    kind: ManagedCluster
    metadata:
     name: cluster1
    spec:
     hubAcceptsClient: true
     taints:
       - effect: NoSelect
         key: cluster.open-cluster-management.io/unavailable
         timeAdded: '2022-02-21T08:11:54Z'
  • cluster.open-cluster-management.io/unreachable - 当 ManagedClusterConditionAvailable 条件的状态为 Unknown 或没有条件时,此污点被添加到受管集群。污点对 NoSelect 和一个空值的影响,以防止调度无法访问的集群。以下内容中提供了此污点的示例:

    apiVersion: cluster.open-cluster-management.io/v1
    kind: ManagedCluster
    metadata:
      name: cluster1
    spec:
      hubAcceptsClient: true
      taints:
        - effect: NoSelect
          key: cluster.open-cluster-management.io/unreachable
          timeAdded: '2022-02-21T08:11:06Z'

1.14.6.3. 为放置添加容限

容限应用到放置,并允许放置没有与放置容限匹配的污点的受管集群。容限的规格包括以下字段:

  • 可选 键 - 密钥与 taint 键匹配以允许放置。
  • 可选 值 - 容限中的值必须与容限的污点值匹配,以允许放置。
  • 可选 Operator - Operator 代表键和值之间的关系。有效的操作符是 equalexists。默认值为 equal。当键相同时,容限与污点匹配,影响相同,运算符是以下值之一:

    • equal - 运算符 equal,值在污点和容忍度中是相同的。
    • exists - 值的通配符,因此放置可以容限特定类别的所有污点。
  • 可选 效果 - 要匹配的污点效果。当留空时,它将匹配所有污点效果。指定后允许的值为 NoSelectNoSelectIfNew
  • 可选 TolerationSeconds - 将受管集群移至新放置前容许污点的时间长度(以秒为单位)。如果 effect 值不是 NoSelectPreferNoSelect,会忽略此字段。默认值为 nil,这表示没有时间限制。TolerationSeconds 的开始时间自动列为污点中的 TimeAdded 值,而不是在集群调度时间或者 TolerationSeconds 添加时间。

以下示例演示了如何配置容许具有污点的集群的容限:

  • 受管集群中的污点,例如:

    apiVersion: cluster.open-cluster-management.io/v1
    kind: ManagedCluster
    metadata:
      name: cluster1
    spec:
      hubAcceptsClient: true
      taints:
        - effect: NoSelect
          key: gpu
          value: "true"
          timeAdded: '2022-02-21T08:11:06Z'
  • 允许容许污点的放置上的容限

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: placement1
      namespace: default
    spec:
      tolerations:
        - key: gpu
          value: "true"
          operator: Equal

    在定义了容限示例后,放置可以选择 cluster1,因为 key: gpuvalue: "true" 匹配。

注: 受管集群不能保证放在包含污点容限的放置上。如果其他放置包含相同的容限,受管集群可能会放置到其中一个放置上。

1.14.6.4. 指定临时容限

TolerationSeconds 的值指定容限容许污点的时间期限。当受管集群离线时,这个临时容限会很有用,您可以将在此集群中部署的应用程序传送到另一个受管集群中,以便容忍的时间。

例如,具有以下污点的受管集群将无法访问:

apiVersion: cluster.open-cluster-management.io/v1
kind: ManagedCluster
metadata:
  name: cluster1
spec:
  hubAcceptsClient: true
  taints:
    - effect: NoSelect
      key: cluster.open-cluster-management.io/unreachable
      timeAdded: '2022-02-21T08:11:06Z'

如果您使用 TolerationSeconds 的值定义放置,如下例所示,工作负载在 5 分钟后传输到另一个可用的受管集群。

apiVersion: cluster.open-cluster-management.io/v1alpha1
kind: Placement
metadata:
  name: demo4
  namespace: demo1
spec:
  tolerations:
    - key: cluster.open-cluster-management.io/unreachable
      operator: Exists
      tolerationSeconds: 300
----

受管集群在无法访问 5 分钟后,应用程序会被移到另一个受管集群。