Kubernetes 1.31:Kubectl Debug 中的自訂效能分析功能晉升 Beta 版

有許多方法可以對叢集中的 Pod 和節點進行故障排除。然而,kubectl debug 是最簡單、最常用且最突出的方法之一。它提供一組靜態設定檔,每個設定檔適用於不同的角色。例如,從網路管理員的角度來看,偵錯節點應該像這樣簡單

$ kubectl debug node/mynode -it --image=busybox --profile=netadmin

另一方面,靜態設定檔也帶來固有的僵化性,這與它們的易用性相反,對某些 Pod 產生一些影響。因為有各種各樣的 Pod(或節點)都有其特定的需求,不幸的是,有些 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 為其他值以進行進階故障排除,該怎麼辦?沒有機制可以實現這一點。

自訂設定檔

自訂設定檔是 --custom 標誌下提供的新功能,在 kubectl debug 中引入以提供擴展性。它期望 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 規格中的其他欄位,則不支援。

致謝

特別感謝所有從最初構想到實際實施(按字母順序排列)審閱和評論此功能的貢獻者