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

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

前言:

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

一,

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

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

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

二,

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

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

三,

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

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

四,

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

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

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

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

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

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

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

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

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

(4)改用go-template模板形式查看所有pod使用的镜像(此条查询等价于(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
      1 busybox
      1 nginx:1.18
      3 quay.io/coreos/flannel:v0.13.0
      1 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0

五,

自定义模式查询

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

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

[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
CONTAINER      IMAGE
kube-flannel   quay.io/coreos/flannel:v0.13.0

 

六,

jq简化查询方式

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

[root@master ~]# k get po nginx -o json|jq .status.containerStatuses
[
  {
    "containerID": "docker://b177cec0fab830856897aca55643c753d45f349ac32f7d7f9734542935d7529a",
    "image": "nginx:1.18",
    "imageID": "docker-pullable://nginx@sha256:e90ac5331fe095cea01b121a3627174b2e33e06e83720e9a934c7b8ccc9c55a0",
    "lastState": {},
    "name": "nginx",
    "ready": true,
    "restartCount": 0,
    "started": true,
    "state": {
      "running": {
        "startedAt": "2022-09-14T01:33:12Z"
      }
    }
  }
]

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

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

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

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

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

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

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
25 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
10天前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
116 10
|
15天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
29天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
29天前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
42 1
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
22天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
20天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。