本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.31: Kubectl Debug 中的自定義效能分析功能進階至 Beta
在叢集中排查 Pod 和節點故障的方法有很多。然而,kubectl debug
是最簡單、使用頻率最高、最突出的方法之一。它提供了一組靜態的效能分析配置(profile),每種配置都服務於不同的角色。例如,從網路管理員的角度來看,除錯節點應該像這樣簡單:
$ kubectl debug node/mynode -it --image=busybox --profile=netadmin
另一方面,靜態的效能分析配置也帶來了固有的僵化性,這對某些 Pod 來說,與其易用性相反,會產生一些問題。因為有各種各樣的 Pod(或節點),它們都有自己特定的需求,不幸的是,有些問題僅透過靜態的效能分析配置是無法除錯的。
以一個簡單的 Pod 為例,它包含一個容器,其健康狀況依賴於一個環境變數:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: customapp:latest
env:
- name: REQUIRED_ENV_VAR
value: "value1"
目前,複製 Pod 是 `kubectl debug` 中唯一支援除錯此 Pod 的機制。此外,如果使用者需要將 `REQUIRED_ENV_VAR` 修改為其他值以進行高階故障排查,該怎麼辦?目前沒有機制可以實現這一點。
自定義效能分析
自定義效能分析是在 `kubectl debug` 中引入的一項新功能,可透過 `--custom` 標誌使用,以提供可擴充套件性。它接受 YAML 或 JSON 格式的部分 `Container` 規約。為了透過建立一個臨時容器來除錯上面的 example-container,我們只需定義以下 YAML:
# partial_container.yaml
env:
- name: REQUIRED_ENV_VAR
value: value2
並執行:
kubectl debug example-pod -it --image=customapp --custom=partial_container.yaml
這是另一個在 JSON 格式中一次性修改多個欄位的示例(更改埠號、新增資源限制、修改環境變數):
{
"ports": [
{
"containerPort": 80
}
],
"resources": {
"limits": {
"cpu": "0.5",
"memory": "512Mi"
},
"requests": {
"cpu": "0.2",
"memory": "256Mi"
}
},
"env": [
{
"name": "REQUIRED_ENV_VAR",
"value": "value2"
}
]
}
約束
無節制的擴充套件性會損害可用性。因此,自定義效能分析不允許修改某些欄位,例如命令(command)、映象(image)、生命週期(lifecycle)、卷裝置(volume devices)和容器名稱(container name)。未來,如果需要,可能會將更多欄位新增到不允許修改的列表中。
限制
kubectl debug
命令有 3 個方面:使用臨時容器進行除錯、Pod 複製和節點除錯。這些方面最大的交集是 Pod 內的容器規約。因此,自定義效能分析僅支援修改 `containers` 中定義的欄位。這就產生了一個限制,即如果使用者需要修改 Pod 規約中的其他欄位,則不受支援。
致謝
特別感謝所有對該功能進行評審和提出意見的貢獻者,從最初的構想到最終的實現(按字母順序排列):