controller开发1.获取 name对应的pod列表lbls := labels.Set{"app": instance.Name, #找到指定资源的labels,根据label查找对应pod}existingPods := &corev1.PodList{} #取到当前所有的poderr := r.client.List(context.TODO(), nil, &client.ListOptions{Namespace: request.Namespace,LabelSelector: labels.selectorFromSet(lbls),})if err != nil {reqLogger.Error(err, "取已经存在的pod失败")return reconcile.Result{}, err}2.取到pod列表中的pod namevar existingPodNames []stringfor _, pod := range existingPods.Items {if pod.GetObjectMeta().GetDeletionTimeStamp() != nil {continue #如果pod删除的时间戳有值,则跳过取该pod,有删除时间戳表示已被删除}if pod.Status.Phase == corev1.PodPending || pod.Status.Phase == corev1.PodRunning {#如果pod时pending或runningexistingPodNames = append(existingPodNames, pod.GetObjectMeta().GetName())}}3.update pod.status != 运行中的status#比较期望与实际pod值是否相同status := k8sv1alpha1.ImoocPodStatus{ #期望的statusPodNames: existingPodNames,Replicas: len(existingPodNames),}if reflect.DeepEqual(instance.Status, status) {instance.Status = status #把期望状态给运行态err := r.client.Status().Update(context.TODO(), instance.Status)if err != nil {reqLogger.Error(err, "更新pod失败")return reconcile.Result{}, err}}4.len(pod) > 运行中的len(pod.replicas) 期望值大于实际值,需要 scale down deleteif len(existingPodNames) > instance.Spec.Replicas {#deletereqLogger.Info("正在删除pod, 当前的podnames和期望的replicas", existingPodNames, instance.Spec.Replicas)pod := existingPods.Items[0] #拿到第0个poderr := r.client.Delete(context.TODO(), &pod) #传递一个指针if err != nil {reqLogger.Error(err, "删除pod失败")return reconcile.Result{}, err}}5.len(pod) < 运行中的len(pod.replicas) 期望值小于实际值,需要 scale up createif len(existingPodNames) < instance.Spec.Replicas {reqLogger.Info("正在添加pod, 当前的podnames和期望的replicas", existingPodNames, instance.Spec.Replicas)pod := newPodForCR(instance)if err := controllerutil.SetControllerReference(instance, pod, r.scheme); err != nil {return reconcile.Result{}, err}err = r.client.Create(context.TODO(), pod)if err != nil {reqLogger.Error(err, "创建pod失败")return reconcile.Result{}, err}}最后的函数返回值return reconcile.Result{Requeue: true}, nil
2.Controller开发
