云原生服务中心 OSC-实现Controller:调度逻辑

时间:2023-11-01 16:15:34

调度逻辑

对于Kubernetes集群内任何Hwfka或Service、StatefulSet、Deployment的变化,Controller都会监听到,并生成事件,触发Reconcile()方法。需要在Reconcile()方法中实现协调逻辑,创建Service、StatefulSet等资源,并更新应用实例状态,实现的过程中,可以参考:

  1. 查询资源:控制器使用controller-runtime库中的Client实现对Kubernetes资源的增查改删,示例代码参见:example_test.go
  2. 创建资源:使用Go语言调用Kubernetes API创建资源,可参考Kubernetes API Reference
  3. 设置关联:为创建的Kubernetes资源设置ownerReferences,以便其能在CR删除时被级联删除,可参考如下代码。
    // 为指定命名空间和名称的 secret 设置 owner,返回 secretfunc (k *K8sClient) SetSecretOwner(cr *oscv1.Kafka, secretName string) (*corev1.Secret, error) {ctx := context.Background()secret, err := k.GetSecretByNamespaceName(cr.Namespace, secretName)if err != nil {return nil, err}if secret.OwnerReferences == nil {patch := client.MergeFrom(secret.DeepCopy())secret.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(cr, schema.GroupVersionKind{Group:   cr.GroupVersionKind().Group,Version: cr.GroupVersionKind().Version,Kind:    cr.Kind,}),}if err := k.Patch(ctx, secret, patch); err != nil {return nil, err}}return secret, nil}
  4. 如果一个动作的处理时间较长,为了避免Reconcile阻塞,需要使请求返回并重新排队,有四种方法:
    // 请求成功,不再排队return ctrl.Result{}, nil// 请求失败,重新加入队列return ctrl.Result{}, err// 请求因某种原因需要重新加入队列return ctrl.Result{Requeue: true}, nil// 请求因某种原因,需要在指定时间后重新加入队列return ctrl.Result{RequeueAfter: time.Second*5}, nil
  5. 当删除CR时,如果需要预先清理Kubernetes之外的资源,此时仅凭ownerReferences无法实现,可以利用finalizers特性。利用finalizers延时删除资源的方法请参见Using Finalizers

    示例代码请参见Controller实现

support.huaweicloud.com/devg-osc/osc_ss_0027.html