云效是阿里云提供的一站式DevOps平台,涵盖软件研发全生命周期的工具链和服务管理,可以通过流水线Flow将应用部署到ACK集群中。分布式云容器平台ACK One的应用分发功能可以根据多样的策略(静态权重、动态资源调度、Gang调度等)将Kubernetes资源灵活分配到多个集群,并具备重调度和故障迁移等能力。结合云效自身的CD能力和ACK One的应用分发功能,您可以快速将单集群持续交付构建成多集群持续交付系统,并获得强大的多集群资源调度与分发能力。
工作流程
结合云效和ACK One多集群应用分发能力,您可以快速将单集群发布流水线转变为多集群持续交付流水线:
无需修改原先发布的应用资源(如Deployment)。
只需在原应用基础上增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy)。
原单集群中的应用不受影响,不会发生服务中断或重启。
将应用YAML、分发策略(PropagationPolicy)、差异化策略(OverridePolicy)提交到Codeup代码仓库中。
创建云效流水线,并配置将应用和策略部署到ACK One舰队实例中。
ACK One多集群应用分发。按照策略将应用分发到多集群中,同时接管单集群中已部署的该应用。
前提条件
步骤一:将代码仓库导入Codeup
将ACK One gitops-demo项目通过网页端导入到云效的Codeup。本文以mc-app为例,包含内容如下:
应用资源:
Deployment:
deployment.yaml
。本例默认Replicas为2。Service:
service.yaml
。
ACK One多集群应用分发策略:
PropagationPolicy(pp.yaml):分发策略。本例含义是将上述应用资源按照动态感知到的各关联集群中当前可用资源的比例来进行分发。本例测试使用2个集群,剩余资源一致,所以最终副本数是1:1。
apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: echo-server-policy namespace: default spec: preserveResourcesOnDeletion: false propagateDeps: true placement: replicaScheduling: replicaSchedulingType: Divided replicaDivisionPreference: Weighted weightPreference: dynamicWeight: AvailableReplicas resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: echo-server - apiVersion: v1 kind: Service name: echo-server
OverridePolicy(op.yaml):差异化策略。本例OverridePolicy功能是为Deployment添加label a=a1分发到各关联集群中。
apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: OverridePolicy metadata: name: echo-server-op namespace: default spec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: echo-server overrideRules: - overriders: plaintext: - operator: add path: /metadata/labels/a value: a1 # targetCluster: # clusterNames: # - clusterid
步骤二:创建流水线并发布相关策略
通过云效流水线Flow将应用的策略部署到舰队中,ACK One按照策略将应用分发到多集群中,同时接管单集群中已部署的该应用。
添加Kubernetes部署任务。
在流水线编辑页面,单击
进入编辑页面。配置Kubectl发布,配置详情,请参见Kubernetes Kubectl 发布,重点配置如下所示:
参数
说明
参数
说明
集群连接
单击+ 新建连接
集群类型
选择自定义集群。
集群名称
自定义集群名称。
集群ID
填入舰队实例ID。
集群配置文件
舰队实例的KubeConfig。
命名空间
自定义命名空间。
YAML路径
输入
manifests/directory/mc-app
。
单击保存并运行,运行流水线。运行完成后可查看部署日志。
步骤三:查看多集群部署结果
使用舰队kubeconfig,在舰队中查看已部署的Demo应用。
kubectl get deploy
预期输出:
NAME READY UP-TO-DATE AVAILABLE AGE echo-server 2/2 2 0 11m
在舰队中执行以下命令,查看子集群中的Deployment状态。
kubectl amc get deploy -M --show-labels
预期输出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION LABELS echo-server c9xxxxxx 1/1 1 1 11m Y a=a1,app=echo-server,... echo-server cbxxxxxx 1/1 1 1 11m Y a=a1,app=echo-server,...
由于本文测试的两个集群剩余资源相同,所以两个副本被平均分配到两个关联集群中。
每个副本中
a=a1
标签是通过差异化策略自动添加。ADOPTION
为Y
表示该集群的资源已经被ACK One多集群应用分发的PropagationPolicy
管理。更新镜像时,变更将自动下发到子集群,删除舰队中的应用,也会同步清理各子集群中的相关应用。
步骤四:测试重调度能力
若关联集群节点发生故障导致Pod资源不足而处于pending
状态,舰队会自动进行多集群重调度,将其迁移至资源充足的其他集群。
模拟节点故障:将一个关联集群中的所有节点进行节点排水,使Pod因资源不足无法调度而处于
pending
状态。等待约三分钟后,在舰队执行以下命令查看事件,
DescheduleBindingSucceed
即为重调度成功事件,表明发生了重调度。kubectl describe deployment echo-server
预期输出:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 4m53s deployment-controller Scaled up replica set echo-server-74d8cff746 to 2 Normal ApplyPolicySucceed 4m53s (x3 over 4m53s) resource-detector Apply policy(default/echo-server-policy) succeed Normal ScheduleBindingSucceed 4m53s default-scheduler Binding has been scheduled successfully. Result: {cbxxxxxx:1,c9xxxxxx:1,[]} Warning ApplyPolicyFailed 4m53s resource-detector Apply policy(default/echo-server-policy) failed: resourcebindings.work.one.alibabacloud.com "echo-server-deployment" already exists Normal SyncWorkSucceed 8s (x5 over 4m53s) binding-controller Sync work of resourceBinding(default/echo-server-deployment) successful. Normal GetDependenciesSucceed 8s (x9 over 4m53s) dependencies-distributor Get dependencies([]) succeed. Normal ApplyOverridePolicySucceed 8s (x9 over 4m53s) override-manager Apply override policy(default/echo-server-op) for cluster(cbxxxxxx) succeed. Warning SyncWorkFailed 8s (x7 over 4m53s) binding-controller Operation cannot be fulfilled on resourcebindings.work.one.alibabacloud.com "echo-server-deployment": the object has been modified; please apply your changes to the latest version and try again Normal AggregateStatusSucceed 8s (x11 over 4m53s) resource-binding-status-controller Update Resource with AggregatedStatus successfully. Normal DescheduleBindingSucceed 8s karmada-descheduler Binding has been descheduled, 1 replica(s) in cluster(cbxxxxxx), 1 total descheduled replica(s) Normal ScheduleBindingSucceed 8s default-scheduler Binding has been scheduled successfully. Result: {c9xxxxxx:2,[]} Normal ApplyOverridePolicySucceed 8s (x2 over 8s) override-manager Apply override policy(default/echo-server-op) for cluster(c9xxxxxx) succeed.
执行以下命令,查看Deployment在重调度后子集群中的状态。
kubectl amc get deploy -M echo-server
预期输出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION echo-server c9xxxxxx 2/2 2 2 6m7s Y
通过预期输出可以看到2个副本均在资源充足的c9xxxxxx集群中运行。
- 本页导读
- 工作流程
- 前提条件
- 步骤一:将代码仓库导入Codeup
- 步骤二:创建流水线并发布相关策略
- 步骤三:查看多集群部署结果
- 步骤四:测试重调度能力