1. 概述

在本教程中,我们将学习如何使用 kubectl 命令行工具的各种输出格式化选项。通过这些格式,我们可以更灵活地查看 Kubernetes 集群中的资源信息。

2. 格式化 kubectl 命令输出

kubectl 是与 Kubernetes 集群交互的主要工具之一。例如,我们可以通过 kubectl get 子命令获取集群中的资源信息。默认情况下,kubectl get pods 会以表格形式展示默认命名空间下的 Pod 列表:

$ kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
example-pod   1/1     Running   0          50s

这适用于快速查看关键信息。但当我们需要更详细的数据或自定义输出格式时,可以使用 kubectl 提供的多种输出格式,包括:

  • -o wide:扩展表格输出
  • -o json / -o yaml:完整资源信息输出
  • jsonpath / custom-columns / go-template:自定义字段输出

为了演示,我们先创建一个简单的 Pod 示例:

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: example
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
EOF
pod/example-pod created

接下来,我们将逐一介绍各种输出格式。

3. 扩展表格输出(Wide)

使用 -o wide 可以展示更多列信息,适用于快速查看额外字段:

$ kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
example-pod   1/1     Running   0          19m   10.244.0.99   kind-control-plane   <none>           <none>

对于 Pod 来说,-o wide 会额外显示 IP、节点名、提名节点和就绪门等字段。

4. 完整资源信息输出(JSON / YAML)

4.1 JSON 格式

使用 -o json 可以输出完整的资源信息(JSON 格式):

$ kubectl get -o json pods
{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "kind": "Pod",
            "metadata": {
                "annotations": {
                    "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},..."
                },
                "creationTimestamp": "2024-03-02T01:16:33Z",
                "labels": {
                    "app": "example"
                },
                "name": "example-pod",
...

常用于结合 jq 工具进行进一步处理。

4.2 YAML 格式

使用 -o yaml 输出 YAML 格式的完整资源信息:

$ kubectl get -o yaml pods
apiVersion: v1
items:
- apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},...
    creationTimestamp: "2024-03-02T01:16:33Z"
    labels:
      app: example
...

适合用于调试或生成资源模板。

5. 自定义输出格式

kubectl 支持多种方式来自定义输出内容,适用于提取特定字段或构造特定格式。

5.1 JSONPath

使用 JSONPath 表达式提取特定字段值:

$ kubectl get pods -o "jsonpath={.items[0].metadata.name}"
example-pod

该命令提取第一个 Pod 的名称。

✅ 提示:并非所有 JSONPath 操作符都支持,详见 官方文档

5.2 自定义列(Custom Columns)

通过定义字段路径,构建自定义列:

$ kubectl get pods -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image
NAME          IMAGE
example-pod   nginx:latest

每个列定义由列名和字段路径组成,用冒号分隔,列之间用逗号分隔。

5.3 Go 模板(Go Template)

使用 Go 模板语言构造更复杂的输出:

$ kubectl get pods -o go-template='{{range .items}}{{.metadata.name}} {{.metadata.namespace}}{{end}}'
example-pod default

可结合 range 遍历多个资源,使用 printf "\n" 实现换行:

$ kubectl get pods -o go-template='{{range .items}}{{.metadata.name}} {{printf "\n"}}{{.metadata.namespace}}{{end}}'
example-pod
default

5.4 表达式文件化

对于复杂表达式,建议将其保存为文件再引用:

$ echo '{.items[0].metadata.name}' >> get-resource-name.jsonpath

然后使用 -o jsonpath-file 引用:

$ kubectl get pods -o jsonpath-file=get-resource-name.jsonpath
example-pod

对于 go-templatecustom-columns,分别使用:

  • -o go-template-file
  • -o custom-columns-file

6. 实战技巧(Recipes)

6.1 从 Secret 中提取特定值

Secret 资源中可能包含多个键值对,使用 Go 模板提取特定字段:

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
stringData:
  monitoringApikey: b8ea6ae7cf54af7
  databasePassword: dbadmin123
EOF

提取 monitoringApikey 的值:

$ kubectl get secret example-secret -o go-template='{{.data.monitoringApikey}}' | base64 --decode
b8ea6ae7cf54af7

⚠️ 注意:Secret 数据默认以 Base64 编码存储,需解码后使用。

6.2 根据条件过滤资源

使用 Go 模板实现条件过滤,例如只输出类型为 NodePort 的 Service:

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: example-service-nodeport
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort

---
apiVersion: v1
kind: Service
metadata:
  name: example-service-clusterip
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

---
apiVersion: v1
kind: Service
metadata:
  name: example-service-loadbalancer
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
EOF

使用 Go 模板进行过滤:

$  kubectl get svc -o go-template='{{ range .items }}{{ if eq .spec.type "NodePort" }}{{ .metadata.name }}{{ printf "\n" }}{{ end }}{{ end }}'
example-service-nodeport

Go 模板支持的比较操作符包括:

  • eq:等于
  • ne:不等于
  • gt:大于
  • ge:大于等于
  • lt:小于
  • le:小于等于

7. 总结

本文介绍了 kubectl 命令的多种输出格式选项:

  • wide:扩展列输出,适合查看更多字段
  • json / yaml:完整资源信息,适合调试或自动化处理
  • jsonpath / custom-columns / go-template:灵活定制输出,满足复杂查询需求

通过这些格式化选项,我们可以:

✅ 快速查看资源关键信息
✅ 提取特定字段进行分析
✅ 过滤并格式化输出结果,提高操作效率

掌握这些技巧,能显著提升你在 Kubernetes 环境下的工作效率。


原始标题:Guide to kubectl Output Formatting