本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

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 規約中的其他欄位,則不受支援。

致謝

特別感謝所有對該功能進行評審和提出意見的貢獻者,從最初的構想到最終的實現(按字母順序排列):