标签获取

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

replicaSets获取

deployment 的产生pod流程如下: deployment->replicaSets->pod。

deployment 先产生replicaSets, replicaSets再产生pod。所以我们可以根据以下步骤获取到pod。

  1. 根据标签获取到replicaSets
  2. 根据replicaSets ownerReferences字段进行过滤。就可以得到属于某个deployment的replicaset。
  3. 根据标签获取到pods
  4. 根据pods ownerReferences字段进行过滤。就可以得到属于某个replicaset的pods。

注意一点这里有个比较坑的地方,就是deployment在滚动更新中会产生多个replicaset, 如果没有设置revisionHistoryLimit保留历史的replicaSet的话。那么当新的pod起来了,老的pod在终止时, 此时老的replicaSets会被删除,但是

老的pod又是被老的replicaSets控制的,这个时候去查询deployment 下面的pods就会将这些终止态的pod忽略掉,这在某些系统其实问题很大,就比如我现在做的发布系统,某个发布必须要等老的都终止掉了才能执行下一个业务,那么这个时候其实是有问题的。目前我能想到的解决办法是通过标签筛选出来的pod如果是终止态的话,也归属于这个deployment。大家如果有更好的方法请在下面留言。

代码

func (r *Usecase) podsListByDeploymentV2(deployment *appv1.Deployment) ([]v1.Pod, error) {

	replicaSetSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)
if err != nil {
return nil, xerrors.WithStack(err)
} replicaSetListOptions := metav1.ListOptions{LabelSelector: replicaSetSelector.String()}
allReplicaSets, err := r.k8sClient.AppsV1().ReplicaSets(deployment.Namespace).List(context.TODO(), replicaSetListOptions)
if err != nil {
return nil, xerrors.WithStack(err)
}
ownedReplicaSetsUids := make(map[types.UID]struct{})
for i := range allReplicaSets.Items {
if !metav1.IsControlledBy(&allReplicaSets.Items[i], deployment) {
continue
}
ownedReplicaSetsUids[allReplicaSets.Items[i].UID] = struct{}{}
} podSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)
if err != nil {
return nil, xerrors.WithStack(err)
}
podListOptions := metav1.ListOptions{LabelSelector: podSelector.String()}
allPods, err := r.k8sClient.CoreV1().Pods(deployment.Namespace).List(context.TODO(), podListOptions)
if err != nil {
return nil, xerrors.WithStack(err)
} //replicaSetUID := replicaSet.UID
rsPods := make([]v1.Pod, 0)
for i, pod := range allPods.Items {
controllerRef := metav1.GetControllerOf(&allPods.Items[i])
if controllerRef != nil {
if _, ok := ownedReplicaSetsUids[controllerRef.UID]; ok {
rsPods = append(rsPods, pod)
continue
}
}
podStatus := r.k8sRepo.GetPodStatus(&pod)
if podStatus.Status == repo.TerminatingStatus { // 终止态的也可以认为属于这个deployment
rsPods = append(rsPods, pod)
continue
}
} return rsPods, nil }

k8s 怎么精准获取deployment关联的pods?的更多相关文章

  1. k8s工作负载资源之deployment

    首先我们要理解:一个应用跑在k8s集群上了,那么这个应用就是一个工作负载(workloads). 在k8s中会用pod的来承载这个应用,那么负责管理这个pod的东西就叫工作负载资源(workload ...

  2. Kubernetes(k8s)控制器(一):deployment

    目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建deployment 六.修改deploy副本数 6.1 kubectl edit deploy ...

  3. iOS 【终极方案】精准获取webView内容高度,自适应高度

    前言:是这样的,刚写完上一篇文章还没缓过神来,上一篇文章我还提到了,想和大家聊聊原生+H5如何无缝连接的故事.结果我朋友就给我发了两篇他的作品.他的做法也都有独到之处.好的文章都是这样,让你每次看都能 ...

  4. k8s运行容器之deployment(三)--技术流ken

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  5. K8S中RC与Deployment的区别

    原文:http://fx114.net/qa-81-152379.aspx replication controller与deployment的区别 replication controller Re ...

  6. k8s运行容器之deployment(三)

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  7. 使用Deployment控制器创建Pods并使Service发布到外网可访问

    由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...

  8. 3.k8s资源控制器rs Deployment Job

    k8s资源控制器 #控制器类型 ReplicaSet #rs,确保pod副本数,rs已替代rc Deployment #管理rs,升级.回滚.扩容pod DaemonSet #在每个节点运行一个Pod ...

  9. 。net 添加或获取文件关联

    文件关联设置 2011-02-07 14:25:36|  分类: VB.net2008或2010 |  标签:文件关联  |举报|字号 订阅     原理:以后缀名为.txt为例 方式一: 1.在注册 ...

  10. Linux 精准获取进程pid--转

    如果想在脚本里只获取PID,那么可以用如下脚本.目前收集两种方法: 方法一 $ps x|grep xxx  |awk '{print $1}' e.g. ps x|grep java |awk '{p ...

随机推荐

  1. Native Drawing开发指导,实现HarmonyOS基本图形和字体的绘制

      场景介绍 Native Drawing模块提供了一系列的接口用于基本图形和字体的绘制.常见的应用场景举例: ● 2D图形绘制. ● 文本绘制. 接口说明 接口名 描述 OH_Drawing_Bit ...

  2. 重新整理.net core 计1400篇[九] (.net core 中的依赖注入的服务注入)

    前言 在该系列六中介绍了一个简单的依赖注入,该节介绍.net core 中的依赖注入的服务注入. ServiceDescriptor ServiceDescriptor 是服务描述的意思,这个是做什么 ...

  3. java知识点查漏补缺-- 2020513

    重载和重写 方法重载(overload): 必须是同一个类 方法名(也可以叫函数)一样 参数类型不一样或参数数量不一样 方法的重写(override)两同两小一大原则: 方法名相同,参数类型相同 子类 ...

  4. Git 各指令的本质

    前言 作为当前世界上最强大的代码管理工具Git相信大家都很熟悉,但据我所知有很大一批人停留在clone.commit.pull.push...的阶段,是不是对rebase心里没底只敢用merge? 碰 ...

  5. Java学生信息管理系统源码

    学生信息管理系统 功能说明 学生信息管理,包括学生.班级.院系.课程.成绩等的管理. 本程序仅供学习食用. 工程环境 JDK IntelliJ IDEA MySQL 运行说明 1.安装JDK. 2.导 ...

  6. 离线语音识别,vosk,离线流式实时静音噪声监测,支持多语言开发python c++ c# java等

    #!/usr/bin/env python3 from vosk import Model, KaldiRecognizer, SetLogLevel import sys import os imp ...

  7. 本地部署Llama3-8B/72b 并进行逻辑推理测试

    美国当地时间4月18日,Meta开源了Llama3大模型,目前开源版本为8B和70B.Llama 3模型相比Llama 2具有重大飞跃,并在8B和70B参数尺度上建立了LLM模型的新技术.由于预训练和 ...

  8. linux系统关闭指定端口

    linux系统关闭指定端口 关闭指定端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent systemctl restart f ...

  9. 力扣612(MySQL)-平面上的最近距离(中等)

    题目: 表 point_2d 保存了所有点(多于 2 个点)的坐标 (x,y) ,这些点在平面上两两不重合.写一个查询语句找到两点之间的最近距离,保留 2 位小数. 最近距离在点 (-1,-1) 和( ...

  10. 对接HiveMetaStore,拥抱开源大数据

    本文分享自华为云社区<对接HiveMetaStore,拥抱开源大数据>,作者:睡觉是大事. 1. 前言 适用版本:9.1.0及以上 在大数据融合分析时代,面对海量的数据以及各种复杂的查询, ...