1. 概述

Kubernetes 已成为容器化应用部署的行业标准。它支持我们通过命令式和声明式两种方式创建对象。

命令式方式允许我们直接通过命令行创建 Kubernetes 对象,而声明式方式则需要我们通过一个配置清单文件来定义。大多数人更倾向于使用声明式方式,因为这样可以通过 版本控制系统 来管理配置。

在调试应用问题时,我们经常需要查看已部署的 Kubernetes 对象的详细信息。这时我们可以使用 kubectl get 命令来获取对象信息。同时,我们还可以通过该命令的 –output 参数,将输出格式化为多种格式。

在本教程中,我们将讨论如何以 YAML 及其他格式获取 Kubernetes 对象的配置信息。现在,我们开始吧。

2. 示例环境搭建

首先,我们为本次部署创建一个新的 Kubernetes 命名空间:

$ kubectl create ns nginx-demo
namespace/nginx-demo created

接着,我们使用命令式方式创建一个 Kubernetes Deployment 对象:

$ kubectl create deployment nginx --image=nginx:stable-alpine3.17-slim -n nginx-demo
deployment.apps/nginx created

在这个例子中,我们创建了一个 NGINX 的 Deployment 对象,它最终会在指定的命名空间中创建一个 Pod。

最后,我们验证 Deployment 是否成功创建了 NGINX Pod:

$ kubectl get pods -n nginx-demo
NAME                    READY   STATUS    RESTARTS   AGE
nginx-9bd595477-dwz45   1/1     Running   0          101s

至此,我们已经完成了环境搭建。本教程后续部分将使用这些 Deployment 和 Pod 对象来展示不同格式的输出。

⚠️ 说明:本教程使用 Pod 和 Deployment 来演示命令的使用方法,但该方法适用于任意 Kubernetes 对象

3. 以宽格式显示输出

我们可以使用 get 命令来查看 Kubernetes 对象的信息。但默认情况下,只显示基础字段。来看一个例子:

$ kubectl get pods -n nginx-demo
NAME                    READY   STATUS    RESTARTS   AGE
nginx-9bd595477-dwz45   1/1     Running   0          8m33s

上面的输出展示了 Pod 的基本信息,但在某些场景下,这些信息可能不够用。此时,我们可以使用 wide 参数来获取更多细节:

$ kubectl get pods -n nginx-demo -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE                  NOMINATED NODE   READINESS GATES
nginx-9bd595477-dwz45   1/1     Running   0          15m   10.244.0.5   naren-control-plane   <none>           <none>

可以看到,输出中新增了 Pod 的 IP、所在节点、就绪门等信息。

4. 以 YAML 格式显示输出

在上一节中,我们使用 wide 参数获取了更多字段。但有时我们需要获取对象的完整配置清单。这时,可以使用 -o yaml 参数来获取完整的 YAML 输出。

nginx Deployment 为例,我们查看其完整 YAML 配置:

$ kubectl get deploy nginx -n nginx-demo -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2023-05-22T16:36:25Z"
  generation: 1
  labels:
    app: nginx
  name: nginx

可以看到,输出中包含了比默认格式多得多的信息。

⚠️ 注意:YAML 输出可能非常长,为便于阅读,此处省略了部分内容。

完整的输出中,status 字段展示了对象的当前状态:

status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2023-05-22T16:36:25Z"
    lastUpdateTime: "2023-05-22T16:36:25Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2023-05-22T16:36:24Z"
    lastUpdateTime: "2023-05-22T16:36:25Z"
    message: ReplicaSet "nginx-9bd595477" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

5. 以 JSON 格式显示输出

同样,我们也可以让 kubectl 输出对象的 JSON 格式清单。只需使用 -o json 参数即可:

$ kubectl get deploy nginx -n nginx-demo -o json | head
{
    "apiVersion": "apps/v1",
    "kind": "Deployment",
    "metadata": {
        "annotations": {
            "deployment.kubernetes.io/revision": "1"
        },
        "creationTimestamp": "2023-05-22T16:36:25Z",
        "generation": 1,
        "labels": {

可以看到,输出内容与 YAML 格式一致,只是换成了 JSON 格式。

JSON 和 YAML 都具有可读性,但 JSON 更容易被程序解析。事实上,kubectl 还支持我们从 JSON 输出中筛选特定字段。下一节我们来演示如何实现。

6. 从 JSON 输出中筛选特定字段

上一节我们展示了如何输出完整的 JSON 格式清单。但在某些场景下,我们只想提取 JSON 中的某个字段。这时可以使用 JSONPath 表达式。

以提取 Deployment 的 kind 字段为例:

$ kubectl get deploy nginx -n nginx-demo -o jsonpath='{.kind}'
Deployment

我们使用了一个简单的 JSONPath 表达式来提取字段,实际上,jsonpath 支持非常复杂的表达式。

✅ 提示:你可以参考 Kubernetes 官方文档 获取完整支持的表达式列表。

7. 自定义输出字段

此外,我们还可以自定义 kubectl 的输出字段。例如,重命名默认的列头字段。

使用 -o custom-columns 参数,我们可以自定义输出列,例如展示对象类型、名称和命名空间:

$ kubectl get deploy nginx -n nginx-demo -o custom-columns="Kind:.kind,Name:.metadata.name,Namespace:.metadata.namespace"
Kind         Name    Namespace
Deployment   nginx   nginx-demo

这里我们使用逗号分隔多个字段定义,每个字段用冒号 (:) 分隔。冒号左侧是自定义列头,右侧是实际字段路径。

通过这种方式,我们可以灵活定制输出内容。

8. 清理资源

和所有资源一样,Kubernetes 对象也会占用系统资源。如果不再需要,建议及时清理。⚠️ 删除错误的对象可能导致严重问题,因此操作前务必确认。

我们使用 delete 命令删除 Deployment 和 Namespace:

$ kubectl delete deployment nginx -n nginx-demo
deployment.apps "nginx" deleted

$ kubectl delete namespace nginx-demo
namespace "nginx-demo" deleted

9. 总结

在本文中,我们学习了如何获取已部署 Kubernetes 对象的 YAML 配置清单。

我们依次演示了:

  • 使用 -o wide 显示更多字段
  • 使用 -o yaml 获取完整的 YAML 配置
  • 使用 -o json 获取 JSON 格式的对象清单
  • 使用 jsonpath 提取 JSON 中的特定字段
  • 使用 custom-columns 自定义输出列

通过这些技巧,我们可以更灵活地查看和处理 Kubernetes 对象的配置信息,提高调试和运维效率。


原始标题:How to Get the YAML of a Deployed Kubernetes Object