开发 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 信息

/internal/k8sdao/pod.go

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

/internal/k8sdao/replicaset.go

因此, 在获取获取 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
# ... 省略
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
前端开发 编解码 数据格式
浅谈响应式编程在企业级前端应用 UI 开发中的实践
浅谈响应式编程在企业级前端应用 UI 开发中的实践
24 0
浅谈响应式编程在企业级前端应用 UI 开发中的实践
|
1月前
|
Kubernetes 应用服务中间件 nginx
提升K8S故障排除效率:详解Pod内抓包的高效策略!
提升K8S故障排除效率:详解Pod内抓包的高效策略!
36 0
|
1天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
36 1
|
6天前
|
Kubernetes Perl 容器
在 Kubernetes 中重启 pod 的 3 种方法
【4月更文挑战第25天】
17 1
在 Kubernetes 中重启 pod 的 3 种方法
|
8天前
|
Kubernetes 测试技术 Docker
K8S中Deployment控制器的概念、原理解读以及使用技巧
K8S中Deployment控制器的概念、原理解读以及使用技巧
|
8天前
|
Kubernetes 网络协议 调度
kubernetes最小调度单元pod详解(二)
kubernetes最小调度单元pod详解(二)
|
8天前
|
Kubernetes 应用服务中间件 调度
kubernetes最小调度单元pod详解(一)
kubernetes最小调度单元pod详解(一)
|
24天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
31 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
24天前
|
Kubernetes 固态存储 调度
Kubernetes节点亲和性分配Pod
Kubernetes节点亲和性分配Pod
30 0
Kubernetes节点亲和性分配Pod
|
24天前
|
存储 Kubernetes 调度
Kubernetes Pod生命周期
Kubernetes Pod生命周期
32 0
Kubernetes Pod生命周期

推荐镜像

更多