首页 > 其他分享 >k8s 怎么精准获取deployment关联的pods?

k8s 怎么精准获取deployment关联的pods?

时间:2024-05-27 14:22:53浏览次数:18  
标签:err nil replicaSets deployment pod k8s pods

标签获取

我们获取那些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

}

标签:err,nil,replicaSets,deployment,pod,k8s,pods
From: https://www.cnblogs.com/biwentao/p/18215405

相关文章

  • 通过apisix访问k8s的service示例
    kind:IngressapiVersion:networking.k8s.io/v1metadata:labels:app:test-webname:test-webnamespace:testannotations:k8s.apisix.apache.org/enable-websocket:"true"kubernetes.io/ingress.class:apisixkubernetes.io/p......
  • k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、实验环境二、具体步骤1.准备存储设备:这里使用的是NFS2.现在部署一个MySQL服务,并且将MySQL的数据进行持久化存储。(1)创建PV,PVC(2)部署MySQL(3)在MySQL数据库中添加数据(4)模拟MySQ服务器节点故障......
  • KubeSphere系列---【离线安装kubeSphere时报错:failed: [k8s_node02] failed to conne
    1.报错信息[root@k8s_masterkubesphere-3.4.1-1.23.15-offline-package]#./kkinitregistry-fconfig-sample.yaml-akubesphere.tar.gz_______||//||||//||//__||_____||//_____......
  • 微服务实践k8s&dapr开发部署实验(2)状态管理
    新建webapi项目建项目时取消https支持,勾选docker支持,Program.cs中注释下面语句,这样部署后才能访问Swagger//ConfiguretheHTTPrequestpipeline.//if(app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}添加Dapr.Client与Dapr.A......
  • Ubuntu20 安装 K8S
    准备apt-get修改国内源mv/etc/apt/sources.list/etc/apt/sources.list.bkcat>/etc/apt/sources.list<<EOFdebhttps://mirrors.ustc.edu.cn/ubuntu/focalmainrestricteduniversemultiversedeb-srchttps://mirrors.ustc.edu.cn/ubuntu/focalmainrestric......
  • K8S认证|CKA题库+答案| 15. 备份还原Etcd
    目录15、 备份还原EtcdCKA v1.29.0模拟系统  下载试用题目: 开始操作:1)、切换集群2)、登录master并提权3)、备份Etcd现有数据4)、验证备份数据快照5)、查看节点和Pod状态 6)、创建目录​7)、执行Etcd数据恢复命令8)、验证恢复情况 ​9)、更改Etcd配置10)、重启kubel......
  • python+k8s——基础练习
    列表core_api=client.CoreV1Api()#管理核心资源(Pod,Service,ConfigMap等)apps_api=client.AppsV1Api()#管理应用资源(Deployment,StatefulSet,DaemonSet等)batch_api=client.BatchV1Api()#管理批处理任务资源(Job,CronJob)rbac_api=client.RbacAuthorizati......
  • python+k8s(基础,遇到的问题)
    python+k8s(基础,遇到的问题)CoreV1Api和ApiClient的区别kubernetes.client.CoreV1Apikubernetes.client.ApiClient两者有什么区别吗kubernetes.client.CoreV1Api和kubernetes.client.ApiClient是KubernetesPython客户端库中的不同类。CoreV1Api:这是KubernetesPyt......
  • python管理k8s集群
    1、python怎么管理k8sk8s最核心的组件就是api-server,大部分的组件都是监听这个端口的,因此只有有着api就能进行使用python来管理k8s了2、操作1、参数详细的介绍#导入这些库fromkubernetesimportclient,configfromkubernetes.streamimportstreamApi_Instance=clie......
  • 红队攻防渗透技术实战流程:云安全之云原生安全:K8s安全etcd Dashboard Configfile漏洞
    红队云攻防实战1.云原生安全-K8s安全-Kubelet漏洞利用1.1K8s安全-Master节点漏洞利用-2379端口etcd未授权访问1.1.1K8s安全-Master节点漏洞利用-etcd未授权的几种利用方式1.1.2K8s安全-Master节点漏洞利用-etcd未授权-V2版本利用1.1.3K8s安全-Master节点漏......