分发策略 PropagationPolicy
概述
PropagationPolicy 是UCS集群联邦的核心 API 之一,用于定义多集群环境中的资源分发策略。该 API 支持将 Kubernetes 资源分发到一个或多个成员集群,并提供灵活的调度、资源管理功能。与Karmada的PropagationPolicy接口兼容。
分发策略 PropagationPolicy具有以下主要特征:
- 多集群资源分发: 支持将应用分发到多个 Kubernetes 集群
- 灵活的调度策略: 提供静态权重、复制分发和分散部署等多种调度方式
- 资源依赖管理: 自动分发相关依赖资源
分发策略 PropagationPolicy相关类型如下:
- PropagationPolicy: 用于命名空间作用域的应用分发,只能分发其所在命名空间的应用。详情可参见什么是命名空间作用域的应用?
- ClusterPropagationPolicy: 支持集群作用域的应用分发,包括PersistentVolume、StorageClass、CustomResourceDefinition,也支持任意命名空间(不包括系统命名空间)的应用分发。详情可参见什么集群作用域的应用?
API规范
基本信息:
apiVersion: policy.karmada.io/v1alpha1 kind: PropagationPolicy
作用范围:
- PropagationPolicy: 命名空间级别,只能分发所在命名空间的资源
- ClusterPropagationPolicy: 集群级别,可分发集群级别资源和任意命名空间的资源
资源格式
PropagationPolicy YAML 模板:
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: <policy-name>
namespace: <namespace-name> # 仅 PropagationPolicy 需要
spec:
resourceSelectors: [] # 必需,选择要分发的资源
conflictResolution: <string> # Abort/Overwrite
dependentOverrides: [] # 依赖的 OverridePolicy
placement: # 必需,集群选择规则
clusterAffinity:
clusterNames: []
clusterTolerations: []
replicaScheduling:
replicaSchedulingType: "Divided" # Duplicated/Divided
replicaDivisionPreference: "Weighted" # Aggregated/Weighted
weightPreference:
dynamicWeight: ""
staticWeightList: []
spreadConstraints: []
propagateDeps: false # 自动分发依赖
ClusterPropagationPolicy YAML 模板
apiVersion: policy.karmada.io/v1alpha1
kind: ClusterPropagationPolicy
metadata:
name: <policy-name>
spec:
# 与 PropagationPolicy 的 spec 结构相同
resourceSelectors: []
placement: {}
# ... 其他字段
参数详细说明
- resourceSelectors(必需):选择要分发的 Kubernetes 资源。包含以下字段:
- apiVersion (string, 必需): 目标资源的 API 版本
- kind (string, 必需): 目标资源的类型(Deployment, Service, ConfigMap 等)
- name (string): 目标资源的名称,空字符串表示匹配所有
- namespace (string): 目标资源的命名空间
- labelSelector (LabelSelector): 标签选择器
使用示例:
resourceSelectors: # 精确匹配 - apiVersion: apps/v1 kind: Deployment name: web-app namespace: default # 标签选择 - apiVersion: v1 kind: ConfigMap labelSelector: matchLabels: app: web-app matchExpressions: - key: tier operator: In values: ["frontend", "backend"] - placement:定义资源分发到哪些集群的规则。
- clusterAffinity
placement: clusterAffinity: clusterNames: ["cluster-1", "cluster-2"] # 指定集群列表 - replicaScheduling(副本调度)
placement: replicaScheduling: replicaSchedulingType: "Divided" # 调度类型 replicaDivisionPreference: "Weighted" # 分配偏好 weightPreference: dynamicWeight: "AvailableReplicas" # 动态权重 staticWeightList: # 静态权重 - targetCluster: clusterNames: ["cluster-1"] weight: 2 - targetCluster: clusterNames: ["cluster-2"] weight: 1调度类型说明:
- clusterAffinity
- spreadConstraints(分散约束):用于控制资源在多个集群间的分布策略,确保高可用性和资源分散。
placement: spreadConstraints: - spreadByField: "cluster" # 按集群维度分散:仅支持`cluster`维度 minGroups: 3 # 最少分布在 3 个不同的集群中 maxGroups: 5 # 最多分布在 5 个不同的集群中字段说明:
- spreadByField: 按集群维度分散约束,仅支持cluster维度
- minGroups : 最少集群数
- minGroups: 最多集群数
- 其他重要参数
- conflictResolution
conflictResolution: "Abort" # Abort: 停止分发 | Overwrite: 覆盖现有资源
- propagateDeps
propagateDeps: true # 自动分发依赖的 ConfigMap、Secret 等资源
- conflictResolution
使用示例
示例 1: 基础静态权重分发
场景: 将 Web 应用分发到 3 个集群,按 2:1:1 的比例分配副本
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: web-app-static-weight
namespace: default
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: web-app
- apiVersion: v1
kind: Service
name: web-app-service
- apiVersion: v1
kind: ConfigMap
name: app-config
placement:
clusterAffinity:
clusterNames:
- member1
- member2
- member3
replicaScheduling:
replicaSchedulingType: "Divided"
replicaDivisionPreference: "Weighted"
weightPreference:
staticWeightList:
- targetCluster:
clusterNames: ["member1"]
weight: 2 # 50% 副本
- targetCluster:
clusterNames: ["member2"]
weight: 1 # 25% 副本
- targetCluster:
clusterNames: ["member3"]
weight: 1 # 25% 副本
propagateDeps: true # 自动分发依赖资源
conflictResolution: "Abort" # 冲突时停止分发
示例 2: 复制模式 (Duplicated) 部署
场景: 需要在每个集群中都部署完整副本的应用
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: cache-cluster-duplicated
namespace: production
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: redis-cluster
- apiVersion: v1
kind: ConfigMap
name: redis-config
- apiVersion: v1
kind: Service
name: redis-cluster-service
placement:
clusterAffinity:
clusterNames:
- cache-west-1
- cache-east-1
- cache-eu-1
replicaScheduling:
replicaSchedulingType: "Duplicated" # 复制模式:每个集群获得完整副本
propagateDeps: true # 自动分发配置和依赖
# 关键:复制模式下,所有集群都会获得完整的副本数量
# 如果Deployment指定replicas: 3,那么每个集群都会运行3个副本
示例 3: 复制模式 + DaemonSet 自动扩展集群
场景: 部署 DaemonSet 到所有集群,当新增集群时自动部署,无需手动修改策略
# PropagationPolicy:选择所有集群的复制模式
apiVersion: policy.karmada.io/v1alpha1
kind: ClusterPropagationPolicy
metadata:
name: file-sync-agent-auto-spread
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: DaemonSet
name: file-sync-agent
- apiVersion: v1
kind: ConfigMap
name: agent-config
- apiVersion: v1
kind: ServiceAccount
name: file-sync-agent
placement:
# 关键:clusterAffinity 为空,自动选择所有可用的集群
# 当新集群加入 Karmada 控制平面时,自动纳入部署范围
# 复制模式:每个集群都会部署完整的 DaemonSet
replicaScheduling:
replicaSchedulingType: "Duplicated"
# DaemonSet 本身就会在每个节点上运行,所以这里是复制模式确保每个集群都部署
# 自动处理依赖资源
propagateDeps: true
# 冲突解决策略
conflictResolution: "Overwrite"