如何通过 kubectl 获取环境中所有 pod 名称,需要 cut 掉 pod name 中的随机字符串

2021-03-01 20:01:10 +08:00
 css3

想拿到那些固定的 pod 名,排除掉 pod name 里边的随机串, 环境上的 pod name 有的没有随机串,有的有 1 个随机串,而有的有 2 个随机串

# kubect get pod --all-namespaces

kube-system   mysql-pro-537tp                      1/1     Running   2          6d6h
kube-system   zookeeper-75469dcbcc-5f6g0                                  1/1     Running   0          3d22h
produce    prometheus-pro-0                                          3/3     Running   0          3d22h
default    operator-8bb5bfdc64                      1/1     Running   0          3d22h

希望通过命令能够输出:

mysql-pro
zookeeper
prometheus-pro-0
operator
2375 次点击
所在节点    程序员
21 条回复
joApioVVx4M4X6Rf
2021-03-01 20:08:23 +08:00
数字开头的 cat 掉
NaVient
2021-03-01 20:10:15 +08:00
kubectl get deploy/rs
Aliencn
2021-03-01 20:11:04 +08:00
kubectl get deployment -A
css3
2021-03-01 20:12:52 +08:00
@NaVient pod 数和 deploy 数量都不相等
scnace
2021-03-01 20:23:57 +08:00
加 label 或者 annotation,然后从里面拿(逃
int64ago
2021-03-01 21:22:17 +08:00
其实 prometheus-pro-0 的 0 本质和 mysql-pro-537tp 里的 537tp 并没啥区别

分别是 statefulSets 和 deployments 生成的,所以它们应该是平行的概念,你为啥输出要却区别对待了呢?

---

单看你需求,我感觉你需要的是 workloads 的 name,但是你的描述本身很奇怪
momocraft
2021-03-01 21:25:06 +08:00
你知道这些随机串是哪来的吗 从来源下手可能简单点
css3
2021-03-01 21:51:38 +08:00
@int64ago 不一样,statefulSets 和 deployments 生成的分别是 10 位和 5 位的随机串,prometheus-pro-0 是 pod name 就叫这个,未加 statefulSets 和 deployments
int64ago
2021-03-01 22:08:48 +08:00
@css3 #8 你再看看 StatefulSet 吧

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#ordinal-index

For a StatefulSet with N replicas, each Pod in the StatefulSet will be assigned an integer ordinal, from 0 up through N-1, that is unique over the Set.
int64ago
2021-03-01 22:11:27 +08:00
kubectl get statefulsets -A | grep prometheus

你会看到的
kaneg
2021-03-01 22:41:44 +08:00
int64ago 说的是对的,statefulset 生成的 pod 是 service 名字-递增的数字
Shakeitin
2021-03-01 23:00:48 +08:00
pattern=$(echo ${$(kubectl get deploy,ds,sts -oname |awk -F'/' '{printf "%s|", $2}')%?})
for i in $(echo $(kubectl get po -o name |grep -oE $pattern) $(kubectl get po -o name |awk -F'/' '{print $2}' |grep -vE $pattern));do echo $i;done

打印所有 pod 名称,去掉了名称中由 deploy 、ds 、sts 产生的附加部分
希望保留 sts 附加的序号的话,第一句中去掉 ",sts"
css3
2021-03-02 10:02:58 +08:00
@kaneg 谢谢老哥指点,我学习一下
@Shakeitin 老哥,好像报错呀-bash: ${$(kubectl get deploy,ds,sts -oname |awk -F'/' '{printf "%s|", $2}')%?}: bad substitution
lework1234
2021-03-02 11:50:26 +08:00
使用 jq
```bash
kubectl get pods -A -o json | jq -r '.items[] | if .metadata.ownerReferences[0].kind == "ReplicaSet" then .metadata.name[:-16] | sub("-$"; "") elif .metadata.ownerReferences[0].kind == "DaemonSet" or .metadata.ownerReferences[0].kind == "Job" then .metadata.name[:-6] else .metadata.name end' | sort | uniq
```
Shakeitin
2021-03-02 15:28:45 +08:00
pattern=$(kubectl get deploy,ds,sts -oname |awk -F'/' '{printf "%s|", $2}' |sed s'/.$//')
for i in $(echo $(kubectl get po -o name |grep -oE $pattern) $(kubectl get po -o name |awk -F'/' '{print $2}' |grep -vE $pattern));do echo $i;done

@css3
之前在 zsh 上跑的。。
css3
2021-03-02 16:11:23 +08:00
@Shakeitin 老哥,稳的一批啊,感谢
css3
2021-03-02 16:18:47 +08:00
@Shakeitin 我可能得采用另外的方案了,这玩意儿去掉后,发现一堆一堆的重复😂
Shakeitin
2021-03-02 19:56:45 +08:00
@css3 #17 deploy 、ds 、sts 、job 、cronjob 这些“高阶对象” 会自动创建 pod,所以会在 pod 后加字符串作为标识

我那个命令是在 pod 上删去了多余的字符串,如果本来某个 deploy 创建了多个 pod,在删去那些标识之后自然会重复。。

第二行命令后加个 "| uniq" 不就去重了么。。
css3
2021-03-02 23:20:50 +08:00
@Shakeitin 好的,谢谢老哥,我试试
css3
2021-03-02 23:21:13 +08:00
@lework1234 感谢老哥

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/757415

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX