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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 该内容是关于Kubernetes中通过标签获取Deployment管理的Pod的流程和代码示例。首先,Deployment创建ReplicaSets,然后ReplicaSets创建Pod。获取Pod的步骤包括:1) 使用标签选择器获取ReplicaSets;2) 过滤出属于特定Deployment的ReplicaSets;3) 通过标签选择器获取Pod;4) 过滤出属于特定ReplicaSets的Pod。提供的Go代码展示了如何实现这一过程。

标签获取

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。
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
}
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes 容器
要获取ACK(阿里云容器服务)集群中的Deployment
要获取ACK(阿里云容器服务)集群中的Deployment【1月更文挑战第8天】【1月更文挑战第40篇】
75 4
|
8月前
|
Kubernetes 应用服务中间件 nginx
【云原生】Kubernetes中deployment是什么?
【云原生】Kubernetes中deployment是什么?
41 0
|
1月前
|
Kubernetes 安全 Ubuntu
k8s学习-CKS真题-Dockerfile和deployment优化
k8s学习-CKS真题-Dockerfile和deployment优化
89 0
|
1月前
|
Kubernetes 测试技术 Docker
K8S中Deployment控制器的概念、原理解读以及使用技巧
K8S中Deployment控制器的概念、原理解读以及使用技巧
|
8月前
|
存储 Kubernetes 数据库
剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景
剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景
417 0
|
1月前
|
Kubernetes 容器
阿里云OpenAPI咋取到ack集群的Deployment呀?
阿里云OpenAPI咋取到ack集群的Deployment呀?【1月更文挑战第17天】【1月更文挑战第84篇】
31 2
|
9月前
|
Kubernetes 应用服务中间件 nginx
|
11月前
|
Kubernetes Perl 容器
【k8s 系列】k8s 学习二十五-3,Deployment 升级应用2
上次我们说到自己手动的做使用 RS 的方式来升级 pod ,感觉还是蛮复杂的,并且容易弄错,实际生产过程中,肯定不会这样来弄,很危险
|
6月前
|
Kubernetes Cloud Native Perl
k8s Deployment 升级应用1
k8s Deployment 升级应用1
|
1月前
|
Prometheus Kubernetes Cloud Native
kubernetes|云原生|Deployment does not have minimum availability 的解决方案(资源隐藏的由来)
kubernetes|云原生|Deployment does not have minimum availability 的解决方案(资源隐藏的由来)
1009 0