集群故障判定

Karmada支持PushPull两种模式来管理成员集群,有关集群注册的更多详细信息,请参考Cluster Registration

在Karmada中,对集群的心跳探测有两种方式:

  • 集群状态收集,更新集群的.status字段(包括PushPull两种模式);
  • karmada控制面中karmada-cluster命名空间内的Lease对象,每个Pull模式集群都有一个关联的Lease对象。

集群状态收集

对于Push模式集群,Karmada控制面中的clusterStatus控制器将定期执行执行集群状态的收集任务; 对于Pull模式集群,集群中部署的 karmada-agent组件负责创建并定期更新集群的.status字段。

上述集群状态的定期更新任务可以通过--cluster-status-update-frequency标签进行配置(默认值为10秒)。

集群的Ready条件在满足以下条件时将会被设置为False

  • 集群持续一段时间无法访问;
  • 集群健康检查响应持续一段时间不正常。

上述持续时间间隔可以通过--cluster-failure-threshold标签进行配置(默认值为30秒)。

集群租约对象更新

每当有集群加入时,Karmada将为每个Pull模式集群创建一个租约对象和一个租赁控制器。

每个租约控制器负责更新对应的租约对象,续租时间可以通过--cluster-lease-duration--cluster-lease-renew-interval-fraction标签进行配置(默认值为10秒)。

由于集群的状态更新由clusterStatus控制器负责维护,因此租约对象的更新过程与集群状态的更新过程相互独立。

Karmada控制面中的cluster控制器将每隔--cluster-monitor-period时间(默认值为5秒)会检查Pull模式集群的状态,当cluster控制器在最后一个--cluster-monitor-grace-period时间段(默认值为40秒)内没有收到来着集群的消息时,集群的Ready条件将被更改为Unknown

检查集群状态

你可以使用kubectl来检查集群的状态细节:

  1. kubectl describe cluster <cluster-name>

以下实例描述了一个状态不健康的集群:

unfold me to see the yaml

  1. kubectl describe cluster member1
  2. Name: member1
  3. Namespace:
  4. Labels: <none>
  5. Annotations: <none>
  6. API Version: cluster.karmada.io/v1alpha1
  7. Kind: Cluster
  8. Metadata:
  9. Creation Timestamp: 2021-12-29T08:49:35Z
  10. Finalizers:
  11. karmada.io/cluster-controller
  12. Resource Version: 152047
  13. UID: 53c133ab-264e-4e8e-ab63-a21611f7fae8
  14. Spec:
  15. API Endpoint: https://172.23.0.7:6443
  16. Impersonator Secret Ref:
  17. Name: member1-impersonator
  18. Namespace: karmada-cluster
  19. Secret Ref:
  20. Name: member1
  21. Namespace: karmada-cluster
  22. Sync Mode: Push
  23. Status:
  24. Conditions:
  25. Last Transition Time: 2021-12-31T03:36:08Z
  26. Message: cluster is not reachable
  27. Reason: ClusterNotReachable
  28. Status: False
  29. Type: Ready
  30. Events: <none>