开发 k8s 管理平台 - k8sailor 09. 通过 deployment label 获取 pod 信息

简介: 开发 k8s 管理平台 - k8sailor 09. 通过 deployment label 获取 pod 信息

开发 k8s 管理平台 - k8sailor 09. 通过 deployment label 获取 pod 信息

原文地址: https://tangx.in/posts/books/k8sailor/chapter02/09-get-pods-by-deployment-label/

tag: https://github.com/tangx/k8sailor/tree/feat/09-get-pods-by-deployment-label

有了之前结构铺垫, 获取 Pod 还是很简单简单的。 其中需要注意的是 ListOptions 中的 LabelSelector 是一个字符串, 多组 key=value 之间使用 逗号 , 进行连接。

labelSelector := `key1=value1,key2=value2,...`

而通过 client-go API 获取的 Deployment, Pod 等信息中的 MatchLabel 字段是一个 map[string]string 的 map。

因此, 在使用 k8s client 查询的时候, 需要对进行一些传参转换。

// convertMapToSelector convert map to string, use comma connection: k1=v1,k2=v2
func convertMapToSelector(labels map[string]string) string {
   
    l := []string{
   }
    for k, v := range labels {
   
        l = append(l, fmt.Sprintf("%s=%s", k, v))
    }

    return strings.Join(l, ",")
}

获取 Pod

Pod 本身是 k8s 的一个最核心的概念, 独立于其他 Workloads , 这点从 API 上也可以看出来。
Pod 的 API 是 core v1 而 Deployment 是 apps v1

可以直接通过 Label 获取 Pod 信息

func GetPodByLabels(ctx context.Context, namespace string, labels map[string]string) (*corev1.PodList, error) {
   

    opts := metav1.ListOptions{
   
        LabelSelector: convertMapToSelector(labels),
    }

    return clientset.CoreV1().Pods(namespace).List(ctx, opts)
}

通过 Deployment 获取 Pod

Pod 与其他 Workloads 之间的关联是 弱关联 / 间接关联, 以 Deployment 为例。 Deployment 创建 ReplicaSet, ReplicaSet 创建 Pod

首先, 通过 clientsetGet 方法根据 Name 获取到 Deployment 对象, 在通过 Deployment 中的 Label 信息获取对应的 Pod 对象。 这里需要注意的是上述所讲的的 Pod 与 Deployment 之间的弱关联关系, 因为是通过标签匹配的,所以结果可能根本与 Deployment 无关。

假如现在有两个 Deployment 如下

# dep1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:   # 只有一组标签
    app: my-nginx-1
  name: my-nginx-1
# ... 省略
---

# dep2
kind: Deployment
metadata:
  creationTimestamp: null
  labels:   # 有两组标签, 其中 app 组与 dep1 相同
    app: my-nginx-1
    srv: my-nginx-2
  name: my-nginx-2
## ... 省略

如果单独的通过 app=my-nginx-1 标签来匹配,还会得到 dep2 的 Pod

kubectl get pod -l app=my-nginx-1

获取 ReplicaSet 再获取 Pod

因此, 在获取获取 Pod 信息之前, 应该先获取 ReplicaSet, 再获取 Pod

通过 deployment 的 label 获取 ReplicaSet

# kubectl get rs -l app=my-nginx-1

NAME                    DESIRED   CURRENT   READY   AGE
my-nginx-1-6d9577949b   1         1         1       4d14h

得到 rs 详细信息如下

# kubectl get rs -o yaml my-nginx-1-6d9577949b
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  # ... 省略
  labels:
    app: my-nginx-1
    pod-template-hash: 6d9577949b
  # ... 省略

通过带有 rs 的 label 进行查询

# kubectl pod -l app=my-nginx-1,pod-template-hash=6d9577949b

NAME                          READY   STATUS    RESTARTS   AGE
my-nginx-1-6d9577949b-bhwlp   1/1     Running   0          4d14h

查询出来的 Pod 结果符合预期

# kubectl get pod my-nginx-1-6d9577949b-bhwlp -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-09-23T16:13:51Z"
  generateName: my-nginx-1-6d9577949b-
  labels:
    app: my-nginx-1
    pod-template-hash: 6d9577949b
# ... 省略
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
27天前
|
存储 Kubernetes 调度
【赵渝强老师】什么是Kubernetes的Pod
Pod 是 Kubernetes 中的基本逻辑单位,代表集群上的一个应用实例。它可以由一个或多个容器组成,并包含数据存储和网络配置等资源。Pod 支持多种容器执行环境,如 Docker。Kubernetes 使用 Pod 管理容器,具有简化部署、方便扩展和调度管理等优点。视频讲解和图示详细介绍了 Pod 的组成结构和使用方式。
|
2月前
|
Kubernetes API 调度
k8s中节点无法启动Pod
【10月更文挑战第3天】
107 6
|
27天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
27天前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
|
27天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
27天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
27天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
28天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
160 1
|
1月前
|
Kubernetes Nacos 微服务
探讨了在Kubernetes中使用Nacos v2.2.3时,强制删除Pod后Pod仍存在的常见问题
本文深入探讨了在Kubernetes中使用Nacos v2.2.3时,强制删除Pod后Pod仍存在的常见问题。通过检查Pod状态、事件、配置,调整Nacos和Kubernetes设置,以及手动干预等步骤,帮助开发者快速定位并解决问题,确保服务稳定运行。
53 2
|
1月前
|
存储 运维 Kubernetes
云端迁移:备份中心助力企业跨云迁移K8s容器服务平台
本文将简要介绍阿里云容器服务ACK的备份中心,并以某科技公司在其实际的迁移过程中遇到具体挑战为例,阐述如何有效地利用备份中心来助力企业的容器服务平台迁移项目。