如何獲取已部署的 Kubernetes 對象的 YAML
一、概述
Kubernetes 已經成為部署容器化應用程序的事實標準。它允許我們以命令式和聲明式的方式創建對象。
命令式方式允許我們直接從命令行創建 Kubernetes 對象,而使用聲明式方式,我們需要在清單文件中定義配置。大多數人更喜歡聲明式的方式,因為它允許我們通過版本控制系統維護配置。
通常,我們需要獲取已部署的 Kubernetes 對象的詳細信息以調試應用程序問題。在這種情況下,我們可以使用kubectl get
命令。除此之外,我們還可以使用命令的–output
選項以各種格式顯示輸出。
在本教程中,我們將討論如何以 YAML 和其他格式獲取 Kubernetes 對象的配置。那麼,讓我們開始吧。
2. 設置示例
首先,讓我們為部署創建一個新的 Kubernetes 命名空間:
$ kubectl create ns nginx-demo
namespace/nginx-demo created
接下來,我們將使用命令式方法創建 Kubernetes 部署對象:
$ kubectl create deployment nginx --image=nginx:stable-alpine3.17-slim -n nginx-demo
deployment.apps/nginx created
在這個例子中,我們創建了一個NGINX部署對象,它最終在給定的命名空間中創建了一個 Pod。
最後,讓我們驗證部署是否已創建 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 地址、運行 Pod 的 Kubernetes 節點、就緒門等。
4. 以 YAML 格式顯示輸出
在前面的示例中,我們使用wide
選項來顯示有關 Kubernetes 對象的其他詳細信息。然而,有時我們需要獲取已部署的 Kubernetes 對象的完整清單。在這種情況下,我們可以使用-o
選項指定yaml
參數。
為了理解這一點,讓我們顯示nginx
部署對象的清單:
$ 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": {
在此示例中,我們可以觀察到相同的輸出以 JSON 格式顯示。
YAML 和 JSON 格式都是可讀的。但是,JSON 格式更易於解析。事實上, kubectl
允許我們從 JSON 對像中過濾特定的字段。在下一節中,我們將看到一個實際的例子。
6.從JSON對像中過濾特定字段
在上一節中,我們看到瞭如何以 JSON 格式顯示完整的清單。但是,有時我們想從 JSON 對像中提取特定字段。在這種情況下,我們可以使用包含在花括號 ({}) 中的 JSONPath 表達式。
為了理解這一點,讓我們從 Deployment 對像中提取kind
字段:
$ kubectl get deploy nginx -n nginx-demo -o jsonpath='{.kind}'
Deployment
在這裡,我們使用了一個簡單的 JSONPath 表達式來說明用法。但是, 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
在這裡,我們使用逗號分隔的列表來指定我們想要查看的多個自定義字段。每個單獨的字段然後由冒號(:)
分隔,其中左側部分代表我們的自定義列標題,右側部分代表我們要顯示其值的實際字段。
通過這種方式, kubectl
允許我們根據需要更改輸出字段。
8.清理
與任何其他對像一樣,Kubernetes 對像也會消耗系統資源,因此最好在不需要時清理它們。刪除錯誤的 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 清單。
首先,我們使用寬輸出格式來顯示附加字段。接下來,我們討論了獲取 YAML 和 JSON 格式的輸出。然後,我們看到瞭如何從 JSON 對像中提取特定字段。
最後,我們討論了使用custom-columns
選項更改輸出字段。