kubectl技巧之通过go-template截取属性
在使用kubectl get获取资源信息的时候,可以通过-o(--output简写形式)指定信息输出的格式,如果指定的是yaml或者json输出的是资源的完整信息,实际工作中,输出内容过少则得不到我们想要的信息,输出内容过于详细又不利于快速定位的我们想要找到的内容,其实-o输出格式可以指定为go-template然后指定一个template,这样我们就可以通过go-template获取我们想要的内容.go-template与kubernetes无关,它是go语言内置的一种模板引擎.这里不对go-template做过多解释,仅介绍在kubernetes中获取资源常用的语法,想要获取更多内容,大家可以参考相关资料获取帮助.
基本语法
- go-template语法整体风格类似handlebars模板引擎语法,通过
{{}}来访问变量 
以如下方式来访问预定义的变量”foo”:
{{ foo }}
- 使用空格来分隔参数
 
以如下方式来调用具有输入1,2的add函数:
{{ add 1 2 }}
- 通过.符号来访问方法和字段
 
以如下方式来访问Foo的参数”bar”:
{{ .Foo.bar }}
变量
- 通过引用变量名称来访问该变量。
 
{{foo}}
- 变量也同样可以被定义和引用。
 
{{ $address := "123 Main St."}}
{{ $address }}
函数
go template支持非常多的函数,这里不再详细介绍,仅介绍与获取kubernetes资源对象相关的range
就像Go一样,Go模板中大量的使用了range来遍历map,array或者slice。以下内容是使用range的不同例子。
- 例子1:通过使用上下文
 
{{ range array }}
    {{ . }}
{{ end }}
例子2:通过声明value变量的名称
{{range $element := array}}
    {{ $element }}
{{ end }}
例子3:通过同时声明key和value变量名称
{{range $index, $element := array}}
    {{ $index }}
    {{ $element }}
{{ end }
go template就简单介绍到这里,下面通过两个示例来说明如何获取对象的某一属性或者遍历对象的集合属性中的某一字段
go template获取资源属性具体信息
- 示例1 获取pod IP
 
[centos@k8s-master consul]$ kubectl get pod helloworld-7fdc8d9855-ncfdz -oyaml
apiVersion: v1
kind: Pod
metadata:
 ......
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2019-03-13T04:34:03Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2019-03-13T04:34:08Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2019-03-13T04:34:08Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2019-03-13T04:34:03Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://7d9e68920d0373df278602b976e2757be7c77c5860e32598193cc3d06d635eb5
    image: tutum/hello-world:latest
    imageID: docker-pullable://tutum/hello-world@sha256:0d57def8055178aafb4c7669cbc25ec17f0acdab97cc587f30150802da8f8d85
    lastState: {}
    name: helloworld
    ready: true
    restartCount: 0
    state:
      running:
        startedAt: "2019-03-13T04:34:07Z"
  hostIP: 192.168.122.73
  phase: Running
  podIP: 10.244.1.3
  qosClass: BestEffort
  startTime: "2019-03-13T04:34:03Z"
......
以上是我通过kubectl get pod pod名称获取到的pod的信息,如果仅想要获取关于pod的ip的信息,可以通过如下命令
get pod helloworld-7fdc8d9855-ncfdz -o go-template --template='{{.status.podIP}}'
10.244.1.3
podIP属性在status对象里,因此通过以上语法可获得pod的ip
示例2 获取pod使用镜像的ip
我们知道,一个pod里可能包含多个容器,因此一个pod在创建时可能使用了一个以上的镜像,我们看下资源结构
[centos@k8s-master consul]$ kubectl get po helloworld-7fdc8d9855-ncfdz  -oyaml
apiVersion: v1
kind: Pod
......
spec:
  containers:
  - image: tutum/hello-world
    imagePullPolicy: Always
    name: helloworld
    ports:
    - containerPort: 80
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-4ctj2
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: k8s-node1
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: default-token-4ctj2
    secret:
      defaultMode: 420
      secretName: default-token-4ctj2
......
当然,以上pod里仅使用了一个镜像,但是它包含在containers数组属性里,因此通过.属性名的方式获取获取到结果,我们需要遍历这个数组,然后输出其中的对象.
 kubectl get po helloworld-7fdc8d9855-ncfdz  -o go-template --template='{{range .spec.containers}}{{.image}}{{end}}'
tutum/hello-world[
以上首先通过range获取数组,然后像获取普通属性一样获取数组里对象的image属性.最后加上end标识,表示操作结束.
命令kubectl get po -o go-template --template=xxx可以简写为
kubectl get po -o=go-template=格式模板
kubectl技巧之通过go-template截取属性的更多相关文章
- kubectl技巧之通过jsonpath截取属性
		
系列目录 前面一节我们介绍了使用go-template截取属性,go-template功能非常强大,可以定义变量,使用流程控制等,这是jsonpath所不具备的.然而,jsonpth使用的时候更为灵活 ...
 - kubernetes管理之使用yq工具截取属性
		
系列目录 前面我们讲解过使用go-template或者jsonpath格式(kubectl get 资源 --output go-tempalte(或jsonpath))来截取属性的值,并且我们比较了 ...
 - kubectl技巧之查看资源列表,资源版本和资源schema配置
		
系列目录 在kubernetes里,pod,service,rs,rc,deploy,resource等对象都需要使用yaml文件来创建,很多时候我们都是参照照官方示例或者一些第三方示例来编写yaml ...
 - kubernetes集群管理之通过jq来截取属性
		
系列目录 首先要声明,这里的jq并不是批前端框架里的jquery,而是一个处理json的命令行工具. jq工具相比yq,它更加成熟,功能也更加强大,主要表现在以下几个方面 支持递归查找(我点对我们平时 ...
 - js 技巧 (六)JavaScript[对象.属性]集锦
		
JavaScript[对象.属性]集锦 SCRIPT 标记 用于包含javascript代码. 语法 属性 LANGUAGE 定义脚本语言 SRC 定义一个URL用以指定以.JS结尾的文件 windo ...
 - Linux运维之——每日小技巧,使用awk命令截取每行的指定列数据
		
获取/etc/passwd目录下的UID值小于10的数,并输出第一.三列 [root@:vg_adn_tidbCkhsTest:172.31.30.62 ~]#cat /etc/passwd | aw ...
 - Freemarker的常用技巧总结
		
Freemarker的常用技巧总结 Freemarker视频教程 1,截取字符串 有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度 < lt. ...
 - web app开发技巧总结 (share)
		
(转自http://hi.baidu.com/kuntakinte/item/ca92d6e5edae9fc0bbf37d08) 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联 ...
 - webApp前端开发技巧总结
		
自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备.我相信各位童鞋应该和我一个样子, ...
 
随机推荐
- HDU——1027Ignatius and the Princess II(next_permutation函数)
			
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
 - NBOJv2——Problem 1037: Wormhole(map邻接表+优先队列SPFA)
			
Problem 1037: Wormhole Time Limits: 5000 MS Memory Limits: 200000 KB 64-bit interger IO format: ...
 - PHP中的验证码类(完善验证码)
			
运行结果: <!--vcode.class.php--> <?php class Vcode { private $width; //宽 private $height; //高 p ...
 - 关于pymongo的一些说明
			
问题 一: 在pymongo中使用find是得到1个游标对象的,如果你想实现MongoDB shell中find操作,例如: > db.test.find() { "_id" ...
 - 【CF732D】Exams(线性扫描,贪心,二分)
			
题意:有m门需要过的课程,n天的时间可以选择复习.考试(如果的d[i]为0则只能复习),一门课至少要复习a[i]天才能通过(可以不连续的复习得到a[i]),问最早什么时候可以把所有课程都通过,如果不能 ...
 - es6总结(八)--模块化-import
 - FileUtils删除文件的工具类
			
前提是知道文件在哪个文件夹下面然后到文件夹下面删除文件,如果文件夹也需要传参数需要对下面方法进行改造. ( 需要借助于commons-io.jar和ResourceUtils.java ) 1.De ...
 - Java通过开启线程池实现多线程
			
计算1..100 和1...200 的和,使用线程池开启两个线程 调用Executors类的newFixedThreadPool方法参数是线程池容纳的线程数量 这里是2 返回的对象是 Executo ...
 - AC日记——[Sdoi2013]森林 bzoj 3123
			
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3216 Solved: 944[Submit][Status] ...
 - Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)
			
题目链接 Tree and Queries 题目大意 给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...