配置条件触发自动切流
本小节指导您配置条件触发自动切流,以识别集群CoreDNS功能故障并自动摘除流量。
为集群安装CPD组件识别集群
在配置自动切流前,您需要在集群中安装CPD(cluster-problem-detector)组件,以自动探测集群CoreDNS域名解析功能是否正常,并进行上报。
CPD会周期性地解析kubernetes.default域名,将解析结果更新到Node对象的conditions中。主CPD Pod会收集各个Node上的conditions,判断集群域名解析功能是否正常,并将该判断结果上报到至集群联邦控制面。
CPD以DaemonSet的形式部署,需要独立部署在每个目标集群的所有节点上。CPD的配置文件示例如下所示,请参见表1中的描述修改相关参数。
参数 |
描述 |
---|---|
<federation-version> |
集群所在联邦的版本号。请在“容器舰队”页签下单击目标舰队名称以获取联邦版本号。 |
<your-cluster-name> |
需要安装CPD组件的集群名称。 |
<kubeconfig-of-karmada> |
可访问联邦控制面的kubeconfig文件内容。关于如何下载满足要求的kubeconfig文件,请参见kubeconfig。
注意:
|
hostAliases |
若kubeconfig文件中的联邦控制面地址为域名,则需要在部署文件中配置hostAliases,否则请删除YAML中的hostAliases配置。 |
coredns-detect-period |
CoreDNS进行探测和上报的周期,默认5s(推荐值)。周期越短,探测和上报越频繁。 |
coredns-success-threshold |
CoreDNS域名解析成功持续时长超过该阈值,则认为CoreDNS功能正常,默认30s(推荐值)。阈值越大,探测状态越稳定,但是灵敏度越低。阈值越低,灵敏度越高,但可能导致探测状态不稳定。 |
coredns-failure-threshold |
CoreDNS域名解析失败持续时长超过该阈值,则认为CoreDNS功能故障,默认30s(推荐值)。阈值越大,探测状态越稳定,但是灵敏度越低。阈值越低,灵敏度越高,但可能导致探测状态不稳定。 |
kind: DaemonSet apiVersion: apps/v1 metadata: name: cluster-problem-detector namespace: kube-system labels: app: cluster-problem-detector spec: selector: matchLabels: app: cluster-problem-detector template: metadata: labels: app: cluster-problem-detector spec: containers: - image: swr.cn-north-4.myhuaweicloud.com/hwofficial/cluster-problem-detector:<federation-version> name: cluster-problem-detector command: - /bin/sh - '-c' - /var/paas/cluster-problem-detector/cluster-problem-detector --karmada-kubeconfig=/tmp/config --karmada-context=federation --cluster-name=<your-cluster-name> --host-name=${HOST_NAME} --bind-address=${POD_ADDRESS} --healthz-port=8081 --detectors=* --coredns-detect-period=5s --coredns-success-threshold=30s --coredns-failure-threshold=30s --coredns-stale-threshold=60s env: - name: POD_ADDRESS valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: HOST_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName livenessProbe: httpGet: path: /healthz port: 8081 scheme: HTTP initialDelaySeconds: 3 timeoutSeconds: 3 periodSeconds: 5 successThreshold: 1 failureThreshold: 3 readinessProbe: httpGet: path: /healthz port: 8081 scheme: HTTP initialDelaySeconds: 3 timeoutSeconds: 3 periodSeconds: 5 successThreshold: 1 failureThreshold: 3 volumeMounts: - mountPath: /tmp name: karmada-config serviceAccountName: cluster-problem-detector volumes: - configMap: name: karmada-kubeconfig items: - key: kubeconfig path: config name: karmada-config securityContext: fsGroup: 10000 runAsUser: 10000 seccompProfile: type: RuntimeDefault hostAliases: - hostnames: - <host name of karmada server> ip: <ip of host name of karmada server> --- apiVersion: v1 kind: ServiceAccount metadata: name: cluster-problem-detector namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cpd-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:cluster-problem-detector subjects: - kind: ServiceAccount name: cluster-problem-detector namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:cluster-problem-detector rules: - apiGroups: - "" resources: - nodes verbs: - get - list - watch - apiGroups: - "" resources: - nodes/status verbs: - patch - update - apiGroups: - "" - events.k8s.io resources: - events verbs: - create - patch - update - apiGroups: - coordination.k8s.io resources: - leases verbs: - get - list - watch - create - update - patch - delete --- apiVersion: v1 kind: ConfigMap metadata: name: karmada-kubeconfig namespace: kube-system data: kubeconfig: |+ <kubeconfig-of-karmada>
检查CPD组件是否正常运行
部署CPD组件后,请检查CPD组件是否正常运行。
- 执行以下命令,检查节点的conditions中是否有“ServiceDomainNameResolutionReady”类型的 condition 出现,并检查该condition的“lastHeartBeatTime”是否及时更新。
kubectl get node <node-name> -oyaml | grep -B4 ServiceDomainNameResolutionReady
若节点中没有上述类型的condition出现,或者该condition“lastHeartBeatTime”长时间不更新:
- 请检查CPD中的pod是否处于Ready状态。
- 请检查成员集群中是否有“LoadCorednsConditionFailed”或者“StoreCorednsConditionFailed”类型的事件。若存在,请按事件中的错误提示进行处理。
- 执行以下命令,检查集群联邦cluster对象中是否有“ServiceDomainNameResolutionReady”类型的condition出现。
kubectl --kubeconfig <kubeconfig-of-federation> get cluster <cluster-name> -oyaml | grep ServiceDomainNameResolutionReady
若cluster对象中没有上述类型的condition:
- 请检查CPD日志中是否出现“failed to sync corendns condition to control plane, requeuing”错误。
- 请检查kubeconfig配置是否有误。若kubeconfig有更新,请重新部署CPD。
- 请检查CPD所在节点的网络和下载kubeconfig文件所使用的VPC网络是否打通。
配置条件触发自动切流策略
在CPD组件部署成功并正常运行后,您需要创建Remedy对象,以在特定触发条件下执行特定动作,如在集群CoreDNS组件故障后执行MCI切流。
Remedy对象的配置文件示例如下所示。示例YAML定义了一个Remedy对象,可以通过member1或member2集群上的CPD上报CoreDNS解析功能,在功能故障时自动将该集群上的MCI进行切流。详细的Remedy对象参数说明请参见表2。
apiVersion: remedy.karmada.io/v1alpha1 kind: Remedy metadata: name: foo spec: clusterAffinity: clusterNames: - member1 - member2 decisionMatches: - clusterConditionMatch: conditionType: ServiceDomainNameResolutionReady operator: Equal conditionStatus: "False" actions: - TrafficControl
参数 |
描述 |
---|---|
spec.clusterAffinity.clusterNames |
策略关注的集群名列表。仅在该列表中的集群会执行指定动作,为空时不会执行任何动作。 |
spec.decisionMatches |
触发条件列表。当上述集群列表中指定的集群满足任一触发条件时,即会执行指定动作。当列表为空时,表示无条件触发。 |
conditionType |
触发条件的类型。当前仅支持ServiceDomainNameResolutionReady类型,即CPD上报的CoreDNS域名解析状态。 |
operator |
判断逻辑,仅支持Equal和NotEqual两种值,即等于和不等于。 |
conditionStatus |
触发条件的状态。 |
actions |
策略要执行的动作,目前仅支持TrafficControl,即流量控制。 |