kubernetes集群管理命令(三)
前面两节我们由浅入深介绍了不少kubernetes管理比较常用的命令.本节我们通过案例讲解一些需要更为复杂的操作才能完成的命令.
选择一个deployment下的所有pod
前面讲到过,kubernetes的deployment和pod的命令上有关联关系,我们可以通过查看deployment的名称,然后记下来,然后再查找所有的pod通过grep输入deploy的名称为关键字进行过滤.
比如集群中有以下deployment
[centos@k8s-master ~]$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
easymock-dep 1/1 1 1 21h
helloworld 1/1 1 1 88m
redis-cache 0/3 3 0 6h5m
sagent 3/3 3 3 2d1h
stodagent 3/3 3 3 6d23h
trackingapi-gateway-dep 1/1 1 1 28d
如果我们想要找helloworld所控制的pod,我们就可以通过以下命令来达到效果
[centos@k8s-master ~]$ kubectl get pod|grep helloworld
helloworld-66fc98fd57-lc7tm 1/1 Running 0 89m
但是这种匹配可能是不准确的,如果仅仅是查看可能没问题,但是在编程环境中这样做显然不是好的办法.前面我们提到过先通过kubectl get deploy helloworld -ojson
然后通过jq
工具拿到selector,然后使用kubectl get pod -l=查找到的标签
.这里标签需要我们手动输入,因为选择器里过滤到的结果是"key":"value"
格式,而-l接受的格式为key=value
形式,当然我们也可以通过简单的命令转换以上两种格式.但是选择器里也可能包含多个标签(如下面示例),这样我们通过简单命令很难处理了.
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq .spec.selector.matchLabels
{
"app": "helloworld",
"version": "1.0"
}
下面我们一步步讲解如何通过可编程的方式根据以上信息选择名为helloworld
的deployment所控制的所有pod
首先,以上的键app
和version
都是由用户定义的,并且不知道共有多少个,我们没法直接通过.属性名
的方式获取到它,我们可以通过jq的to_entries
把它转为键值数组,数组是可以遍历的.操作如下:
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq '.spec.selector.matchLabels|to_entries'
[
{
"key": "app",
"value": "helloworld"
},
{
"key": "version",
"value": "1.0"
}
]
这样数组里的所有对象都包含两个键值,且键是固定的(分别为key和value),这样key我们就都全知道了.下面我们把它们组装成app=helloworld
这样形式,以便kubectl get po
的-l
参数可用
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value)"'
"app=helloworld"
"version=1.0"
以上的操作有一点很关键那就是使用to_entries
函数把对象转为数组.后面管道跟.[]
获取数组对象.后面我们把结果放在""
把结果拼接为字符串这里\
为jq的语法,在字符串里使用""可以把后面跟的括号内的内容识别为命令,而不是普通字符串.
这样基本满足要求了,但是有多个label时,-l
接收的参数形式为lable1=value1,label2=value2
这样形式的.因此我们要删除这两个字符串的换行符,把它们合并到一行,并且中间加一个逗号.
以上字符串外面都包了一层引号(
""
),虽然-l
变量也可以接收带引号的,但是也可以不要引号,jq里通过参数-r(aw)
来获取原始字符串,要把结果合并为一行则使用-j(oin)
,改造后的命令如下
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'
app=helloworld,version=1.0,
以上结果基本上达到预期效果,只是最后面多了一个逗号,我们可以接一个sed管道把它去掉
kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'|sed "s/.$//"
app=helloworld,version=1.0
我们把它赋值给一个变量,然后在选择pod的时候使用它
[centos@k8s-master ~]$ label=$( kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'|sed "s/.$//")
[centos@k8s-master ~]$ kubectl get pod -l=$label
NAME READY STATUS RESTARTS AGE
helloworld-66fc98fd57-lc7tm 1/1 Running 0 3h22m
显示集群中所有pod的标签
把集群中所有的pod全部列出来非常容易.使用kubectl get pod --all-namespace
即可.重要的是我们要循环遍历所有的pod,把它们的名称和标签信息过滤出来展示.
前面我们说过,在使用kubectl get pod
时如果使用-o=name
便可以只列出pod的名称.它并不是简单地把kubectl get po
命令展示的名称过滤出来,而是通过资源类型/资源名称
的方式展示.比如有个pod名称叫作consul-0
,使用kubectl get pod -o=name
展示出来它的名称为pod/consul-0
,这样我们就可以直接使用kubectl get
来获取到它
[centos@k8s-master ~]$ kubectl get pod/consul-0
NAME READY STATUS RESTARTS AGE
consul-0 1/1 Running 0 3d2h
k8s除了支持kubectl get+资源类型+资源名称外,还支持
kubectl get 资源类型/资源名称
这种形式.虽然平时我们不经常这样写,但是有特定场景下非常有用.
这样,我们就可以遍历kubectl get pod -o=name
的结果,在循环中取出每个pod的编排信息,然后从中过滤出我们想要的信息(即pod的标签信息),操作和上面获取matchLabels
有很多类似的地方.
关键代码如下:
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"'; done
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-0
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-1
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-2
app=easymock
pod-template-hash=84767b6f75
app=helloworld
pod-template-hash=d5d5c5866
version=1.0
app=helloworld
pod-template-hash=d5d5c5866
version=1.0
app=helloworld
...
以上循环获取到的每一个pod的名称,然后遍历他们,取出它们的.metadata.labels
字段,后面是对键值的重新组装,和上面获取deploy下的pod一节的操作类似.
从输出结果中可以看出,我们只输出的所有pod的标签,这样可读性是非常差的,我们也无法确定某一个标签归属于哪一个pod.我们需要把它们的名字也输出:
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"'; done
Labels for pod/consul-0
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-0
Labels for pod/consul-1
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-1
Labels for pod/consul-2
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-2
Labels for pod/easymock-dep-84767b6f75-l84r4
app=easymock
pod-template-hash=84767b6f75
Labels for pod/helloworld-d5d5c5866-24nzr
app=helloworld
pod-template-hash=d5d5c5866
version=1.0
...
这查比前面清析一些了,但是仍然不是十分容易识别,我们在遍历的时候每个item结束后输出一个空行,这样把不同的结果用空行隔离开来,可读性更高.
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"';printf "\n"; done
Labels for pod/consul-0
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-0
Labels for pod/consul-1
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-1
Labels for pod/consul-2
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-2
Labels for pod/easymock-dep-84767b6f75-l84r4
app=easymock
pod-template-hash=84767b6f75
这样基本ok了,我们使用grep把名称着色显示,这样在屏幕上的输出可读性就更高了.
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"|grep --color -E '[^/]+$'; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"';printf "\n"; done
Labels for pod/consul-0
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-0
Labels for pod/consul-1
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-1
Labels for pod/consul-2
app=consul
controller-revision-hash=consul-744777c4bd
statefulset.kubernetes.io/pod-name=consul-2
大家从上面文本中可能并看不出差别,但是如果是在linux终端就可以看到pod的名称都被着色显示了.
kubernetes集群管理命令(三)的更多相关文章
- kubernetes集群管理命令(二)
系列目录 上一节我们介绍了一些基本的命令,这一节我们介绍一些更为复杂的命令. pod排序 使用kubectl get pod获取pod资源默认是以名称排序的,有些时候我们可能希望按其它顺序排序.比如说 ...
- Kubernetes集群管理工具kubectl命令技巧大全
一. kubectl概述 Kubectl是用于控制Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署. kubectl命令的语法如下 ...
- kubernetes集群管理常用命令一
系列目录 我们把集群管理命令分为两个部分,第一部分介绍一些简单的,但是可能是非常常用的命令以及一些平时可能没有碰到的技巧.第二部分将综合前面介绍的工具通过示例来讲解一些更为复杂的命令. 列出集群中所有 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第01章 - 创建CA证书和kubectl集群管理命令
文章目录 1.kubernetes集群部署 1.0.创建CA证书和秘钥 1.0.0.安装cfssl工具 1.0.1.创建根证书 1.0.2.创建证书签名请求文件 1.0.3.生成CA证书和秘钥 1.0 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.6.集群管理命令
3.6. 集群管理命令 3.6.1. RAC的启动与关闭 oracle rac默认会开机自启动,如需维护时可使用以下命令: 关闭: crsctl stop cluster 停止本节点集群服务 crsc ...
- 美团点评Kubernetes集群管理实践
背景 作为国内领先的生活服务平台,美团点评很多业务都具有非常显著.规律的”高峰“和”低谷“特征.尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长.这对集群中心的资源弹性和可用性有非常高的要 ...
- 052.Kubernetes集群管理-故障排错指南
一 故障指南 1.1 常见问题排障 为了跟踪和发现在Kubernetes集群中运行的容器应用出现的问题,常用如下查错方法: 查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事 ...
- 049.Kubernetes集群管理-集群监控Metrics
一 集群监控 1.1 Metrics Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的 ...
- 基于Python+Django的Kubernetes集群管理平台
➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...
随机推荐
- Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!
因为Axis2同时支持SOAP和RESTful的WebService开发. 我的目标主要是RESTful,这里简单记录一个SOAP的小例子: 原文地址:https://jingyan.baidu.co ...
- 关于sql语句实现将'1,2,3'转1,2,3等竖横转换问题
这是本人的第一个博客,以后会及时整理遇到的问题,方便和大家进行交流. 第一次也不知道说什么了,直接进入正题吧. 因为我的数据在设计时候数据源是竖列存的,满足条件的数据是横列存的.如下图所示: 我要筛选 ...
- Problem 2111 Min Number
...
- net9:图片变成二进制流存入XML文档,从XML文档中读出图片以及从XML文档中读取并创建图片文件
原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] fileToXml类: using System;using System.Data;using System.C ...
- CAR_TUNE_VALUE 校準
CAR_TUNE_VALUE 是用來校準 流過電池上的電流 與 系統偵測到的電流 的一致性, 假電 若您是使用假電, 請拔除零件, 僅留下必要元件,如thermal電阻,ID 電阻, 減少量測 fue ...
- 回调函数 typedef bool (*IsUsed)(const string &name,boost::shared_ptr<ShpGeometry> oneGeometry);
就是指向函数的指针. 回调函数,表示了一个函数的地址,将函数作为参数进行使用.参考百度百科:http://baike.baidu.com/view/414773.htm 常用的大概就是在sort函数中 ...
- 总结下常用js中的小语法和技巧
1,数组对象遍历 对一个级数对象进行遍历,取出每个值 var arr={ "result":[ {"time":"2018-10-24 12:12:1 ...
- jenkins集群节点构建maven(几乎是坑最多的)
业务量变大时,单台的jenkins进行自动化构建部署,就显得没那么灵活,jenkins的集群并非像web服务器.mysql集群那样,jenkins的集群无需在额外的主机安装jenkins,但是用于ja ...
- gitlab升级、汉化、修改root密码
1.gitlab升级 # 查看当前版本 head -1 /opt/gitlab/version-manifest.txt gitlab-ce 8.9.5 grep "^external_ur ...
- Django-自己写的py文件调用models&Non-ASCII character报错&url接收参数
1.这个设置是网上能查到的最多的,但是没解决我的问题: Django的models.py在外部独立使用,新建一个文件夹,和monitor1目录平级 import sys,os sys.path.app ...