如何在 Kubernetes 中格式化输出?

How to format the output in Kubernetes?

我想获取命令的特定输出,例如获取服务的节点端口和负载均衡器。我该怎么做?

关于究竟想从 Kubernetes 中检索什么的问题非常缺乏,但我认为我可以提供一个很好的基线。

当您使用 Kubernetes 时,您很可能正在使用 kubectlkubeapi-server 交互。

可用于从集群检索信息的一些命令:

  • $ kubectl get RESOURCE --namespace NAMESPACE RESOURCE_NAME
  • $ kubectl describe RESOURCE --namespace NAMESPACE RESOURCE_NAME

示例:

假设您有一个类型为 LoadBalancerService(我编辑了一些输出以提高可读性):

  • $ kubectl get service nginx -o yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  clusterIP: 10.2.151.123
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30531
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: A.B.C.D

从该输出中获取 nodePort 可以像这样完成:

  • kubectl get svc nginx -o jsonpath='{.spec.ports[].nodePort}'
30531

从该输出中获取 loadBalancer IP 可以像这样完成:

  • kubectl get svc nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}"
A.B.C.D

您还可以将 kubectlcustom-columns 一起使用:

  • kubectl get service -o=custom-columns=NAME:metadata.name,IP:.spec.clusterIP
NAME         IP
kubernetes   10.2.0.1
nginx        10.2.151.123

有很多方法可以使用 kubectl 检索数据,您可以通过以下方式阅读更多信息:

  • kubectl get --help:

-o, --output='': Output format. One of: json|yaml|wide|name|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See custom columns, golang template and jsonpath template.


其他资源:

如果您只想提取单个值,也许作为脚本的一部分,那么您要搜索的是 -ojsonpath,例如这个例子:

kubectl get svc service-name -ojsonpath='{.spec.ports[0].port}'

这将提取服务中列出的第一个端口的值 specs

文档 - https://kubernetes.io/docs/reference/kubectl/jsonpath/


如果你想提取一个对象的完整定义,比如一个服务,那么你要搜索的是-oyaml例如这个例子:

kubectl get svc service-name -oyaml

这将以 yaml 格式输出整个服务定义。


如果您想获得对资源(例如服务)的更用户友好的描述,那么您正在搜索描述命令,例如这个例子:

kubectl describe svc service-name

文档 - https://kubernetes.io/docs/reference/kubectl/overview/#output-options