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 对象的配置信息,提高调试和运维效率。