本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

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 规约中的其他字段,则不受支持。

致谢

特别感谢所有对该功能进行评审和提出意见的贡献者,从最初的构想到最终的实现(按字母顺序排列):