k8s 怎么精准获取deployment关联的pods?
标签获取
我们获取那些pods属于某个deployment时最先想到的可能是通过标签获取,其实这个是不准确的。因为标签并不是唯一的,也就是说不同deployment其实是能有相同标签的。
replicaSets获取
deployment 的产生pod流程如下: deployment->replicaSets->pod。
deployment 先产生replicaSets, replicaSets再产生pod。所以我们可以根据以下步骤获取到pod。
- 根据标签获取到replicaSets
- 根据replicaSets ownerReferences字段进行过滤。就可以得到属于某个deployment的replicaset。
- 根据标签获取到pods
- 根据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?的更多相关文章
- k8s工作负载资源之deployment
首先我们要理解:一个应用跑在k8s集群上了,那么这个应用就是一个工作负载(workloads). 在k8s中会用pod的来承载这个应用,那么负责管理这个pod的东西就叫工作负载资源(workload ...
- Kubernetes(k8s)控制器(一):deployment
目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建deployment 六.修改deploy副本数 6.1 kubectl edit deploy ...
- iOS 【终极方案】精准获取webView内容高度,自适应高度
前言:是这样的,刚写完上一篇文章还没缓过神来,上一篇文章我还提到了,想和大家聊聊原生+H5如何无缝连接的故事.结果我朋友就给我发了两篇他的作品.他的做法也都有独到之处.好的文章都是这样,让你每次看都能 ...
- k8s运行容器之deployment(三)--技术流ken
deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...
- K8S中RC与Deployment的区别
原文:http://fx114.net/qa-81-152379.aspx replication controller与deployment的区别 replication controller Re ...
- k8s运行容器之deployment(三)
deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...
- 使用Deployment控制器创建Pods并使Service发布到外网可访问
由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...
- 3.k8s资源控制器rs Deployment Job
k8s资源控制器 #控制器类型 ReplicaSet #rs,确保pod副本数,rs已替代rc Deployment #管理rs,升级.回滚.扩容pod DaemonSet #在每个节点运行一个Pod ...
- 。net 添加或获取文件关联
文件关联设置 2011-02-07 14:25:36| 分类: VB.net2008或2010 | 标签:文件关联 |举报|字号 订阅 原理:以后缀名为.txt为例 方式一: 1.在注册 ...
- Linux 精准获取进程pid--转
如果想在脚本里只获取PID,那么可以用如下脚本.目前收集两种方法: 方法一 $ps x|grep xxx |awk '{print $1}' e.g. ps x|grep java |awk '{p ...
随机推荐
- 高并发场景QPS等专业指标揭秘大全与调优实战
高并发场景QPS等专业指标揭秘大全与调优实战 最近经常有小伙伴问及高并发场景下QPS的一些问题,特意结合项目经验和网上技术贴做了一些整理和归纳,供大家参考交流. 一.一直再说高并发,多少QPS才算高并 ...
- Worker 进行多线程任务开发
概念介绍 在 OpenHarmony 中,UI 线程负责处理 UI 事件和用户交互,而 Worker 线程用于处理耗时操作,以提高应用程序的响应速度和用户体验. Worker 线程是与主线程并行的独立 ...
- 利用navicat 完成两台服务器之间的数据库迁移,安全可靠
首先,准备工作先做好 1. 工具,navicat,我这里用的是navicat12+ 2. 建立两台服务器的链接,即新建链接,mysql,同时,需要在迁移目标服务器上面实现建立好对应的数据库,即如果有1 ...
- ES6---new Promise()使用方法
2015年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范.作为ES6中最重要的特性之一,我们有必要掌握并理解透彻.本文将由浅到深,讲解Promise ...
- 浅析Golang map的实现原理
Golang中的map底层使用的数据结构是hash table,基本原理就和基础的散列表一致,重点是Golang在设计中采用了分桶(Bucket),每个桶里面支持多个key-value元素的这种思路, ...
- 力扣303(java)-区域和检索-数组不可变(简单)
题目: 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= rig ...
- Serverless Devs 2.0 全新发布,让 Serverless 应用开发更简单
简介: 2020 年 10 月 23日,阿里巴巴正式宣布开源其首个 Serverless 开发者平台 Serverless Devs.历经近一年精心打磨,今天 Serverless Devs 2.0 ...
- 读 MAUI 源代码 理解可绑定对象和可绑定属性的存储机制
和 UWP 与 WPF 不同的是在 MAUI 里面,使用可绑定对象 BindableObject 替换了依赖对象的概念,我阅读了 MAUI 的源代码发现其实只是命名变更了,里面的机制和设计思想都是差不 ...
- JavaScript字符串String方法介绍及使用示例
实例方法 charAt() charCodeAt() 返回索引位置的字符 'hello'.charAt(0) //h 等价 'hello'.[0] //返回索引位置的字符的Unicode码点 'hel ...
- HAL库移植RT-Thread Nano
一.移植RT-Thread Nano准备 keil软件 CubeMx软件 STM32 CubeMx使用教程:https://www.cnblogs.com/jzcn/p/16313803.html S ...