ToB企服应用市场:ToB评测及商务社交产业平台

标题: k8s 怎么精准获取deployment关联的pods? [打印本页]

作者: 八卦阵    时间: 2024-5-27 13:36
标题: k8s 怎么精准获取deployment关联的pods?
标签获取

我们获取那些pods属于某个deployment时最先想到的可能是通过标签获取,其实这个是不正确的。因为标签并不是唯一的,也就是说不同deployment其实是能有相同标签的。
replicaSets获取

deployment 的产生pod流程如下:  deployment->replicaSets->pod。
deployment 先产生replicaSets, replicaSets再产生pod。所以我们可以根据以下步骤获取到pod。
注意一点这里有个比较坑的地方,就是deployment在滚动更新中会产生多个replicaset, 假如没有设置revisionHistoryLimit保留汗青的replicaSet的话。那么当新的pod起来了,老的pod在终止时, 此时老的replicaSets会被删除,但是
老的pod又是被老的replicaSets控制的,这个时间去查询deployment 下面的pods就会将这些终止态的pod忽略掉,这在某些系统其实问题很大,就好比我现在做的发布系统,某个发布必须要等老的都终止掉了才能执行下一个业务,那么这个时间其实是有问题的。目前我能想到的办理办法是通过标签筛选出来的pod假如是终止态的话,也归属于这个deployment。各人假如有更好的方法请在下面留言。
代码
  1. func (r *Usecase) podsListByDeploymentV2(deployment *appv1.Deployment) ([]v1.Pod, error) {
  2.         replicaSetSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)
  3.         if err != nil {
  4.                 return nil, xerrors.WithStack(err)
  5.         }
  6.         replicaSetListOptions := metav1.ListOptions{LabelSelector: replicaSetSelector.String()}
  7.         allReplicaSets, err := r.k8sClient.AppsV1().ReplicaSets(deployment.Namespace).List(context.TODO(), replicaSetListOptions)
  8.         if err != nil {
  9.                 return nil, xerrors.WithStack(err)
  10.         }
  11.         ownedReplicaSetsUids := make(map[types.UID]struct{})
  12.         for i := range allReplicaSets.Items {
  13.                 if !metav1.IsControlledBy(&allReplicaSets.Items[i], deployment) {
  14.                         continue
  15.                 }
  16.                 ownedReplicaSetsUids[allReplicaSets.Items[i].UID] = struct{}{}
  17.         }
  18.         podSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)
  19.         if err != nil {
  20.                 return nil, xerrors.WithStack(err)
  21.         }
  22.         podListOptions := metav1.ListOptions{LabelSelector: podSelector.String()}
  23.         allPods, err := r.k8sClient.CoreV1().Pods(deployment.Namespace).List(context.TODO(), podListOptions)
  24.         if err != nil {
  25.                 return nil, xerrors.WithStack(err)
  26.         }
  27.         //replicaSetUID := replicaSet.UID
  28.         rsPods := make([]v1.Pod, 0)
  29.         for i, pod := range allPods.Items {
  30.                 controllerRef := metav1.GetControllerOf(&allPods.Items[i])
  31.                 if controllerRef != nil {
  32.                         if _, ok := ownedReplicaSetsUids[controllerRef.UID]; ok {
  33.                                 rsPods = append(rsPods, pod)
  34.                                 continue
  35.                         }
  36.                 }
  37.                 podStatus := r.k8sRepo.GetPodStatus(&pod)
  38.                 if podStatus.Status == repo.TerminatingStatus { // 终止态的也可以认为属于这个deployment
  39.                         rsPods = append(rsPods, pod)
  40.                         continue
  41.                 }
  42.         }
  43.         return rsPods, nil
  44. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4