kubect get 资源名 -o go-template可以用来获取资源里的某个属性值。
在前一篇文章里有两处用到了go-template,以这两处为例子,来说明go-template的用法
第一处,从kubectl get services/webapp1-clusterip-targetport-svc 的结果中获取clusterIP
export CLUSTER_IP=$(kubectl get services/webapp1-clusterip-targetport-svc -o go-template='{{(.spec.clusterIP)}}')
echo CLUSTER_IP=$CLUSTER_IP
我们来看是如何获得的,为什么语法会是 kubectl get services/webapp1-clusterip-targetport-svc -o go-template='{{(.spec.clusterIP)}}'
首先,看kubectl get services/webapp1-clusterip-targetport-svc会获得什么结果,我们用yaml文件来保存这个结果
kubectl get services/webapp1-clusterip-targetport-svc -o yaml >service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"webapp1-clusterip-targetport"},"name":"webapp1-clusterip-targetport-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"targetPort":80}],"selector":{"app":"webapp1-clusterip-targetport"}}}
creationTimestamp: "2021-12-10T07:27:09Z"
labels:
app: webapp1-clusterip-targetport
name: webapp1-clusterip-targetport-svc
namespace: default
resourceVersion: "5023"
selfLink: /api/v1/namespaces/default/services/webapp1-clusterip-targetport-svc
uid: 961594e4-598a-11ec-bc55-0242ac11000f
spec:
clusterIP: 10.100.86.150
ports:
- port: 8080
protocol: TCP
targetPort: 80
selector:
app: webapp1-clusterip-targetport
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
{{.spec.clusterIP}}中的.表示对文件中字段的访问
如果要遍历的是一个数组,比如ports(子对象以 - 开头),则用range end来表示。要遍历ports数组里的port,用如下来表示(用port举例不恰当)
{{range.spec.ports}}{{.port}}{{end}}
range是遍历的范围
.spec.ports是被遍历的数组
{{.port}}是数组里的元素
{{end}}表示结束
如果有多个port,只访问第一个port,用index 为0来表示
{{(index.spec.ports 0).port}}
访问第二个port:
{{(index.spec.ports 1).port}}
现有如下例子,对比一下--output=jsonpath={.items..metadata.name}的用法:
pod=$(kubectl get pods --selector="name=bad-frontend" --output=jsonpath={.items..metadata.name}) kubectl describe pod $pod
再加一个例子, go-template中range end, if end的用法
export PORT=$(kubectl get svc hello-webapp -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}')
解析如下:
spec.ports是个数组,所以用range, {{range.}}和{{end}}是成对出现的。最后一个{{end}}是和{{range}}对应的。
{{if .nodePort}}{{.nodePort}}{{end}}是if判断语句,{{if .nodePort}}为true,则执行下面的语句{{.nodePort}},意为取ports数组下的nodePort的值,否则{{end}}。注意if判断语句也是和end成对出现的
浙公网安备 33010602011771号