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成对出现的

 

posted on 2021-12-10 15:43  吃鱼高手  阅读(946)  评论(0)    收藏  举报