应用分发状态说明及FAQ

更新时间:2025-03-19 05:33:23

本文介绍应用分发能力的实现流程,并提供分发状态说明与常见问题排查思路。

工作原理

image
  1. 资源匹配:根据分发策略和应用资源进行匹配。如果您创建的分发策略选中了集群中已存在的应用资源,则会产生一个ResourceBinding对象,该对象与应用资源一一对应。ResourceBinding的名称采用格式${resource name}-${resource Kind},您可以通过名称直接查询ResourceBinding。对于集群范围级别的应用资源,与之对应的是ClusterResourceBinding

  2. 多集群调度:根据创建的分发策略,对ResourceBinding进行调度。如果调度完成,ResourceBinding的状态中SCHEDULED条件将会变为True

  3. 差异化渲染:如果您创建应用资源的差异化策略,该策略将在此阶段生效。

  4. 子集群应用资源创建:应用资源将在相应的子集群被创建,成功创建后,ResourceBinding的状态中FULLYAPPLIED条件将会变为True

  5. 应用资源在子集群运行:工作负载类型的应用资源在子集群运行时,应用资源状态变为Ready。当应用资源就绪之后,ResourceBinding的状态中ALLAVAILABLE条件会为True

应用多集群分发流程

步骤一:在舰队集群创建资源、分发策略和差异化策略

  1. 使用如下示例内容,创建资源和分发策略。

    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
  2. (可选)使用如下示例内容,创建差异化策略。

    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

步骤二:查看分发状态

  1. 执行如下命令,查看分发状态。

    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

    表示资源在子集群中是否符合预期状态。

  2. (可选)查看差异化策略。

    • 通过执行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中声明的条件是否与应用资源匹配。

应用分发后,显示调度失败如何处理?

image.png

您可以通过以下命令查看ResourceBinding的详细情况:

kubectl get rb xxx -oyaml -n xxx

通常调度失败的原因是因为您在分发策略中clusterAffinity参数的配置与实际子集群不一致,请确保填写正确的集群ID。

差异化配置没有生效如何处理?

首先检查差异化策略的resourceSelector参数是否选中了您想要差异化的应用资源。可通过以下两种方式排查。

  • 您可以通过以下命令查看ResourceBindingmessage字段来排查失败原因。

    kubectl get rb ${resource name}-${resource kind} -oyaml -n ${namespace}

    预期输出:

    image.png

  • 您可以通过以下命令查看差异化策略相关资源的事件,关注两个关键事件:ApplyOverridePolicyFailedSyncWorkFailed,具体原因可在message栏中查看。

    kubectl describe ${resource-kind} ${resource-name} -n ${resource-namespace}

通常,差异化策略未生效的主要原因是路径配置错误,例如指定了一个不存在的路径。

为什么显示调度成功,但应用创建失败?

应用资源显示调度成功,但FULLYAPPLIEDfalse,您可以查看具体的应用资源状态,检查每个集群的appliedMessage字段,以获取APPLY失败的原因。

通常失败的原因是在分发一些尚未支持的应用资源,您可以提交工单寻求帮助。

为什么应用资源在子集群创建成功,但一直未就绪?

应用资源在子集群创建成功,但ALLAVAILABLEfalse,您可以查看具体的应用资源状态,检查每个集群的appliedMessage字段,获取应用资源未就绪的原因。

通常像ConfigMapSecret等资源创建成功即表示就绪。而对于Deployment、StatefulSet等工作负载类的应用资源,其就绪状态可能受到多种因素的影响,例如底层资源不足、子集群调度失败等。您可以连接您的子集群或者使用AMC插件进一步定位排查问题。

  • 本页导读 (1)
  • 工作原理
  • 应用多集群分发流程
  • 步骤一:在舰队集群创建资源、分发策略和差异化策略
  • 步骤二:查看分发状态
  • 步骤三:查看具体的应用资源状态
  • FAQ
  • 为什么创建应用资源和分发策略后没有对应的ResourceBinding/ClusterResourceBinding?
  • 应用分发后,显示调度失败如何处理?
  • 差异化配置没有生效如何处理?
  • 为什么显示调度成功,但应用创建失败?
  • 为什么应用资源在子集群创建成功,但一直未就绪?