本文介绍应用分发能力的实现流程,并提供分发状态说明与常见问题排查思路。
工作原理
资源匹配:根据分发策略和应用资源进行匹配。如果您创建的分发策略选中了集群中已存在的应用资源,则会产生一个
ResourceBinding
对象,该对象与应用资源一一对应。ResourceBinding
的名称采用格式${resource name}-${resource Kind}
,您可以通过名称直接查询ResourceBinding
。对于集群范围级别的应用资源,与之对应的是ClusterResourceBinding
。多集群调度:根据创建的分发策略,对
ResourceBinding
进行调度。如果调度完成,ResourceBinding
的状态中SCHEDULED
条件将会变为True
。差异化渲染:如果您创建应用资源的差异化策略,该策略将在此阶段生效。
子集群应用资源创建:应用资源将在相应的子集群被创建,成功创建后,
ResourceBinding
的状态中FULLYAPPLIED
条件将会变为True
。应用资源在子集群运行:工作负载类型的应用资源在子集群运行时,应用资源状态变为
Ready
。当应用资源就绪之后,ResourceBinding
的状态中ALLAVAILABLE
条件会为True
。
应用多集群分发流程
步骤一:在舰队集群创建资源、分发策略和差异化策略
使用如下示例内容,创建资源和分发策略。
apiVersion: apps/v1 kind: Deployment metadata: name: web-demo spec: replicas: 5 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - name: nginx image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 ports: - containerPort: 80 --- apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: web-demo spec: # 设置为true时,删除舰队上资源时,子集群上资源会被保留;如需同时清理子集群资源,请设置为false。 preserveResourcesOnDeletion: true resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的集群ID。 - ${cluster2-id} replicaScheduling: replicaSchedulingType: Duplicated
(可选)使用如下示例内容,创建差异化策略。
apiVersion: one.alibabacloud.com/v1alpha1 kind: OverridePolicy metadata: name: demo spec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo overrideRules: - targetCluster: clusterNames: - ${cluster1-id} #您的集群ID。 overriders: plaintext: - operator: replace path: /spec/replicas value: 3
步骤二:查看分发状态
执行如下命令,查看分发状态。
kubectl get rb web-demo-deployment
预期输出:
NAME SCHEDULED FULLYAPPLIED OVERRIDDEN ALLAVAILABLE AGE web-demo-deployment True True True True 17h
参数
说明
参数
说明
SCHEDULED
表示资源是否被调度成功。
FULLYAPPLIED
表示资源是否成功在子集群中创建。
OVERRIDDEN
表示差异化策略是否生效(如果没有差异化策略,默认为True)。
ALLAVAILABLE
表示资源在子集群中是否符合预期状态。
(可选)查看差异化策略。
通过执行
kubectl get rb web-demo-deployment
命令,并查看输出中OVERRIDDEN
参数,若为True
则表示差异化策略已生效。通过执行
kubectl describe deploy web-demo
命令,查看相关事件判断差异化策略是否生效。预期输出如下:Normal ApplyOverridePolicySucceed 2m37s (x3 over 49m) override-manager Apply override policy(default/demo) for cluster(cxxxxxxx) succeed.
步骤三:查看具体的应用资源状态
执行如下命令,查看具体的应用资源状态。
kubectl get rb web-demo-deployment -oyaml
预期输出:
...
status:
aggregatedStatus:
- applied: true
appliedMessage: 'Applied Condition Message: Apply manifest complete; AvailableCondition
Message:Resource is available'
clusterName: ${cluster1-id}
health: Healthy
status:
availableReplicas: 3
generation: 7
observedGeneration: 7
readyReplicas: 3
replicas: 3
resourceTemplateGeneration: 2
updatedReplicas: 3
- applied: true
appliedMessage: 'Applied Condition Message: Apply manifest complete; AvailableCondition
Message:Resource is available'
clusterName: ${cluster2-id}
health: Healthy
status:
availableReplicas: 5
generation: 1
observedGeneration: 1
readyReplicas: 5
replicas: 5
resourceTemplateGeneration: 2
updatedReplicas: 5
在aggregatedStatus
部分中可以看到两个集群中deployment
的状态,包括集群名称和对应deployment
的状态信息,也可以看到Cluster1集群的副本数已经被差异化策略渲染为3。
FAQ
为什么创建应用资源和分发策略后没有对应的ResourceBinding/ClusterResourceBinding?
此问题通常是由于分发策略的resourceSelector参数没有选中应用资源导致。请检查ResourceSelectors
中声明的条件是否与应用资源匹配。
应用分发后,显示调度失败如何处理?
您可以通过以下命令查看ResourceBinding
的详细情况:
kubectl get rb xxx -oyaml -n xxx
通常调度失败的原因是因为您在分发策略中clusterAffinity参数的配置与实际子集群不一致,请确保填写正确的集群ID。
差异化配置没有生效如何处理?
首先检查差异化策略的resourceSelector参数是否选中了您想要差异化的应用资源。可通过以下两种方式排查。
您可以通过以下命令查看
ResourceBinding
中message
字段来排查失败原因。kubectl get rb ${resource name}-${resource kind} -oyaml -n ${namespace}
预期输出:
您可以通过以下命令查看差异化策略相关资源的事件,关注两个关键事件:
ApplyOverridePolicyFailed
和SyncWorkFailed
,具体原因可在message
栏中查看。kubectl describe ${resource-kind} ${resource-name} -n ${resource-namespace}
通常,差异化策略未生效的主要原因是路径配置错误,例如指定了一个不存在的路径。
为什么显示调度成功,但应用创建失败?
应用资源显示调度成功,但FULLYAPPLIED
为false
,您可以查看具体的应用资源状态,检查每个集群的appliedMessage
字段,以获取APPLY失败的原因。
通常失败的原因是在分发一些尚未支持的应用资源,您可以提交工单寻求帮助。
为什么应用资源在子集群创建成功,但一直未就绪?
应用资源在子集群创建成功,但ALLAVAILABLE
为false
,您可以查看具体的应用资源状态,检查每个集群的appliedMessage
字段,获取应用资源未就绪的原因。
通常像ConfigMap和Secret等资源创建成功即表示就绪。而对于Deployment、StatefulSet等工作负载类的应用资源,其就绪状态可能受到多种因素的影响,例如底层资源不足、子集群调度失败等。您可以连接您的子集群或者使用AMC插件进一步定位排查问题。
- 本页导读 (1)
- 工作原理
- 应用多集群分发流程
- 步骤一:在舰队集群创建资源、分发策略和差异化策略
- 步骤二:查看分发状态
- 步骤三:查看具体的应用资源状态
- FAQ
- 为什么创建应用资源和分发策略后没有对应的ResourceBinding/ClusterResourceBinding?
- 应用分发后,显示调度失败如何处理?
- 差异化配置没有生效如何处理?
- 为什么显示调度成功,但应用创建失败?
- 为什么应用资源在子集群创建成功,但一直未就绪?