1. controller开发
    2. 1.获取 name对应的pod列表
    3. lbls := labels.Set{
    4. "app": instance.Name, #找到指定资源的labels,根据label查找对应pod
    5. }
    6. existingPods := &corev1.PodList{} #取到当前所有的pod
    7. err := r.client.List(context.TODO(), nil, &client.ListOptions{
    8. Namespace: request.Namespace,
    9. LabelSelector: labels.selectorFromSet(lbls),
    10. })
    11. if err != nil {
    12. reqLogger.Error(err, "取已经存在的pod失败")
    13. return reconcile.Result{}, err
    14. }
    15. 2.取到pod列表中的pod name
    16. var existingPodNames []string
    17. for _, pod := range existingPods.Items {
    18. if pod.GetObjectMeta().GetDeletionTimeStamp() != nil {
    19. continue #如果pod删除的时间戳有值,则跳过取该pod,有删除时间戳表示已被删除
    20. }
    21. if pod.Status.Phase == corev1.PodPending || pod.Status.Phase == corev1.PodRunning {
    22. #如果pod时pending或running
    23. existingPodNames = append(existingPodNames, pod.GetObjectMeta().GetName())
    24. }
    25. }
    26. 3.update pod.status != 运行中的status
    27. #比较期望与实际pod值是否相同
    28. status := k8sv1alpha1.ImoocPodStatus{ #期望的status
    29. PodNames: existingPodNames,
    30. Replicas: len(existingPodNames),
    31. }
    32. if reflect.DeepEqual(instance.Status, status) {
    33. instance.Status = status #把期望状态给运行态
    34. err := r.client.Status().Update(context.TODO(), instance.Status)
    35. if err != nil {
    36. reqLogger.Error(err, "更新pod失败")
    37. return reconcile.Result{}, err
    38. }
    39. }
    40. 4.len(pod) > 运行中的len(pod.replicas) 期望值大于实际值,需要 scale down delete
    41. if len(existingPodNames) > instance.Spec.Replicas {
    42. #delete
    43. reqLogger.Info("正在删除pod, 当前的podnames和期望的replicas", existingPodNames, instance.Spec.Replicas)
    44. pod := existingPods.Items[0] #拿到第0个pod
    45. err := r.client.Delete(context.TODO(), &pod) #传递一个指针
    46. if err != nil {
    47. reqLogger.Error(err, "删除pod失败")
    48. return reconcile.Result{}, err
    49. }
    50. }
    51. 5.len(pod) < 运行中的len(pod.replicas) 期望值小于实际值,需要 scale up create
    52. if len(existingPodNames) < instance.Spec.Replicas {
    53. reqLogger.Info("正在添加pod, 当前的podnames和期望的replicas", existingPodNames, instance.Spec.Replicas)
    54. pod := newPodForCR(instance)
    55. if err := controllerutil.SetControllerReference(instance, pod, r.scheme); err != nil {
    56. return reconcile.Result{}, err
    57. }
    58. err = r.client.Create(context.TODO(), pod)
    59. if err != nil {
    60. reqLogger.Error(err, "创建pod失败")
    61. return reconcile.Result{}, err
    62. }
    63. }
    64. 最后的函数返回值
    65. return reconcile.Result{Requeue: true}, nil

    2.Controller开发