• 云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)


    前言:

    kubernetes是什么大家应该都知道,不用在这赘述了,其中的kubectl命令是我们和kubernetes集群交互的命令行工具,kubectl get 是获取resources也就是资源的各种信息的命令,那么,在实际的集群使用中,我们应该关心资源的哪些维度呢?如何更加优雅的获得我们想知道的信息呢?本文就此将进行一个深入的探讨,以实际的问题来演示。

    一,

    现在有一个kubernetes集群,假设pod非常多,如何查询出所有pod并按其名称排序?

    下面的命令可以看到,第二个命令就是按名字排序了,那么,为什么是--sort-by={.metadata.name}呢?其实主要原因是sort-by后面接的是jsonpath

    1. [root@master ~]# k get po -A
    2. NAMESPACE NAME READY STATUS RESTARTS AGE
    3. default busybox 0/1 ContainerCreating 0 11s
    4. default nginx 1/1 Running 0 7m29s
    5. kube-system coredns-76648cbfc9-lb75g 1/1 Running 3 17d
    6. kube-system kube-flannel-ds-mhkdq 1/1 Running 10 17d
    7. kube-system kube-flannel-ds-mlb7l 1/1 Running 11 17d
    8. kube-system kube-flannel-ds-sl4qv 1/1 Running 2 17d
    9. [root@master ~]# k get po -A --sort-by={.metadata.name}
    10. NAMESPACE NAME READY STATUS RESTARTS AGE
    11. default busybox 0/1 Completed 2 37s
    12. kube-system coredns-76648cbfc9-lb75g 1/1 Running 3 17d
    13. kube-system kube-flannel-ds-mhkdq 1/1 Running 10 17d
    14. kube-system kube-flannel-ds-mlb7l 1/1 Running 11 17d
    15. kube-system kube-flannel-ds-sl4qv 1/1 Running 2 17d
    16. default nginx 1/1 Running 0 7m55s

    二,

    查询所有的pod,按其生成的时间从远到近和从近到远排序:

    1. [root@master ~]# kubectl get po --sort-by={.metadata.creationTimestamp} -A
    2. NAMESPACE NAME READY STATUS RESTARTS AGE
    3. kube-system kube-flannel-ds-mhkdq 1/1 Running 10 17d
    4. kube-system kube-flannel-ds-mlb7l 1/1 Running 11 17d
    5. kube-system kube-flannel-ds-sl4qv 1/1 Running 2 17d
    6. kube-system coredns-76648cbfc9-lb75g 1/1 Running 3 17d
    7. default nginx 1/1 Running 0 24m
    8. default busybox 0/1 Completed 8 16m
    9. [root@master ~]# kubectl get po --sort-by={metadata.creationTimestamp} -A --no-headers | tac
    10. default busybox 0/1 CrashLoopBackOff 7 16m
    11. default nginx 1/1 Running 0 23m
    12. kube-system coredns-76648cbfc9-lb75g 1/1 Running 3 17d
    13. kube-system kube-flannel-ds-sl4qv 1/1 Running 2 17d
    14. kube-system kube-flannel-ds-mlb7l 1/1 Running 11 17d
    15. kube-system kube-flannel-ds-mhkdq 1/1 Running 10 17d

    三,

    查询所有pod,按重启次数排序,这个命令还是很实用的,可以看到,busybox在不停的重启哦

    1. [root@master ~]# kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' -A
    2. NAMESPACE NAME READY STATUS RESTARTS AGE
    3. default nginx 1/1 Running 0 64m
    4. kube-system kube-flannel-ds-sl4qv 1/1 Running 2 17d
    5. kube-system coredns-76648cbfc9-lb75g 1/1 Running 3 17d
    6. kube-system kube-flannel-ds-mhkdq 1/1 Running 10 17d
    7. kube-system kube-flannel-ds-mlb7l 1/1 Running 11 17d
    8. default busybox 0/1 CrashLoopBackOff 15 56m

     四,

    (1)列出所有命名空间下的所有pod所使用的镜像,并按名称排序,并统计镜像使用的次数:

    1. [root@master ~]# kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |tr -s '[[:space:]]' '\n' |sort |uniq -c
    2. 1 busybox
    3. 1 nginx:1.18
    4. 3 quay.io/coreos/flannel:v0.13.0
    5. 1 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0

    (2)不统计使用次数,不排序,仅仅列出pod使用的镜像:

    1. [root@master ~]# kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |tr -s '[[:space:]]' '\n'
    2. busybox
    3. nginx:1.18
    4. registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
    5. quay.io/coreos/flannel:v0.13.0
    6. quay.io/coreos/flannel:v0.13.0
    7. quay.io/coreos/flannel:v0.13.0

    (3)查询单个pod所使用的镜像:

    首先选定一个pod,下面将要选择 coredns-76648cbfc9-lb75g:

    1. [root@master ~]# k get po -A
    2. NAMESPACE NAME READY STATUS RESTARTS AGE
    3. default busybox 0/1 CrashLoopBackOff 25 105m
    4. default nginx 1/1 Running 0 112m
    5. kube-system coredns-76648cbfc9-lb75g 1/1 Running 3 17d
    6. kube-system kube-flannel-ds-mhkdq 1/1 Running 10 17d
    7. kube-system kube-flannel-ds-mlb7l 1/1 Running 11 17d
    8. kube-system kube-flannel-ds-sl4qv 1/1 Running 2 17d

     查看pod   coredns-76648cbfc9-lb75g所使用的image

    1. [root@master ~]# k get po coredns-76648cbfc9-lb75g -o jsonpath="{.spec.containers[*].image}" -n kube-system |uniq -c
    2. 1 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0

    (4)改用go-template模板形式查看所有pod使用的镜像(此条查询等价于(1)):

    1. [root@master ~]# kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}" |tr -s '[[:space:]]' '\n' |sort |uniq -c
    2. 1 busybox
    3. 1 nginx:1.18
    4. 3 quay.io/coreos/flannel:v0.13.0
    5. 1 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0

    五,

    自定义模式查询

    1. [root@master ~]# kubectl get pod nginx -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
    2. CONTAINER IMAGE
    3. nginx nginx:1.18

    下面这个命令大写的CONTAINER和IMAGE是自己定义的column,可随意更改 

    1. [root@master ~]# kubectl get pod kube-flannel-ds-mhkdq -n kube-system -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
    2. CONTAINER IMAGE
    3. kube-flannel quay.io/coreos/flannel:v0.13.0

     

    六,

    jq简化查询方式

    注:jq是一个软件,jsonquery的简写。该软件十分轻量化,centos下安装命令为:yum install jq -y 需要配置epel源。

    1. [root@master ~]# k get po nginx -o json|jq .status.containerStatuses
    2. [
    3. {
    4. "containerID": "docker://b177cec0fab830856897aca55643c753d45f349ac32f7d7f9734542935d7529a",
    5. "image": "nginx:1.18",
    6. "imageID": "docker-pullable://nginx@sha256:e90ac5331fe095cea01b121a3627174b2e33e06e83720e9a934c7b8ccc9c55a0",
    7. "lastState": {},
    8. "name": "nginx",
    9. "ready": true,
    10. "restartCount": 0,
    11. "started": true,
    12. "state": {
    13. "running": {
    14. "startedAt": "2022-09-14T01:33:12Z"
    15. }
    16. }
    17. }
    18. ]

    使用grep和awk命令可过滤出需要的数据(此例是打印出nginx这个pod所使用的镜像):

    1. [root@master ~]# k get po nginx -o json|jq .status.containerStatuses | grep "\"|awk '{print $2}'
    2. "nginx:1.18",

    以上为方法,可打印出该pod运行在哪个主机节点的IP:

    1. [root@master ~]# k get po nginx -o json|jq |grep hostIP|grep -v "f"
    2. "hostIP": "192.168.217.16",
    3. [root@master ~]# k get po -A -owide
    4. NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    5. default busybox 0/1 CrashLoopBackOff 51 4h1m 10.244.1.10 k8s-node1
    6. default nginx 1/1 Running 0 4h8m 10.244.0.17 k8s-master

    同样,查询kube-flannel-ds-mhkdq这个pod运行在哪个主机上也是十分方便的:

    1. [root@master ~]# k get po kube-flannel-ds-mhkdq -n kube-system -o json|jq |grep hostIP|grep -v "f"
    2. "hostIP": "192.168.217.17",

    综上可以得出,jq可以简化我们的查询工作,不需要编写繁杂的正则表达式了。

  • 相关阅读:
    Android实现自定义圆角边框渐变
    Server-Sent Events(以下简称 SSE)及event-source-polyfill使用
    CSS滚动条详解(::-webkit-scrollbar )
    Jmeter用于接口测试中,关联如何实现
    【iOS】——分类、扩展和关联对象
    基于Android健身预约系统APP开发
    python flask 简单应用开发
    2022牛客多校第一场补题
    2022-2028全球有机硅醇酸面漆行业调研及趋势分析报告
    Python刷算法题常见内置函数、方法技巧【最全汇总】
  • 原文地址:https://blog.csdn.net/alwaysbefine/article/details/126836226