Kubernetes 1.31:kubectl debug 中的自定义性能分析晋升至 Beta 版
在集群中对 Pod 和节点进行故障排除有多种方法。其中 kubectl debug
是最简单、使用最广泛且最突出的一种。它提供了一组静态配置文件,每个配置文件适用于不同类型的角色。例如,从网络管理员的角度来看,调试节点应该像这样简单:
$ 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"
目前,在 kubectl debug 中,复制 Pod 是唯一支持调试这种 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
命令有三个方面:使用临时容器进行调试、复制 Pod 和调试节点。这些方面最大的交集是 Pod 中的容器规范。这就是为什么自定义配置文件仅支持修改在 containers
中定义的字段。这导致了一个限制,即如果用户需要修改 Pod 规范中的其他字段,则不支持。
致谢
特别感谢所有为此功能提供评审和评论的贡献者,从最初的构想到实际实现(按字母顺序排列)