当前位置:首页 > 问答 > 正文

用Curl那些命令来折腾Kubernetes调试,真心挺实用的!

直接上干货,这些都是用Curl这把“瑞士军刀”直接跟Kubernetes API服务器对话的实用技巧,能让你在不依赖kubectl的情况下,更底层、更灵活地排查问题,咱们就假设你已经有一个有效的Kubernetes配置,知道怎么用kubectl,现在想玩点更直接的。

第一步:准备好你的“通行证”

Curl要跟Kubernetes API服务器(就是K8s的老大)安全地聊天,需要三样东西,它们通常都在~/.kube/config文件里:

  1. API服务器地址:就像K8s总部的地址,https://192.168.1.100:6443
  2. 证书:用来证明你是你,主要是客户端证书(client-certificate-data)和客户端密钥(client-key-data),config文件里这些内容是Base64编码的,你需要先把它们解码成文件。
  3. Token:有时候也用Bearer Token来认证,特别是用ServiceAccount的时候。

一个最基础的Curl命令骨架长这样:

curl --cacert /path/to/ca.crt --cert /path/to/client.crt --key /path/to/client.key https://your-api-server-ip:6443/api/v1/pods

但每次都这么写太麻烦了,更简单的方法是直接用kubectl帮你代理,让它来处理所有烦人的认证问题。

实用技巧:让kubectl给你当“翻译官”

打开一个终端,运行:

kubectl proxy

这个命令会在你的本地(0.0.1:8001)启动一个代理服务器,这个代理会自动帮你处理所有认证,然后你再用Curl的时候,就只需要像这样访问本地地址就行了,简单到飞起:

curl http://localhost:8001/api/v1/pods

下面所有例子,我们都用这种省事儿的方法。

实战开始:用Curl看透K8s

看看集群里都有啥资源类型

刚接手一个新集群,或者记不清资源全称的时候,这个命令能列出所有可用的API路径,相当于一份“资源菜单”。

curl -s http://localhost:8001/apis | jq '.groups[].name'

(这里用了 jq 来解析漂亮的JSON输出,如果没安装,可以去掉 | jq ... 直接看原始JSON,或者用 grep 过滤)

获取所有命名空间的Pod列表

这是最常用的操作之一,相当于 kubectl get pods --all-namespaces

curl -s http://localhost:8001/api/v1/pods | jq '.items[] | .metadata.namespace + "/" + .metadata.name'

这条命令会列出所有Pod,格式是 命名空间/Pod名字,一目了然。

获取某个特定Pod的详细信息

用Curl那些命令来折腾Kubernetes调试,真心挺实用的!

当你怀疑某个Pod有问题时,直接获取它的完整配置和状态,信息比 kubectl describe 更原始、更全面。

curl -s http://localhost:8001/api/v1/namespaces/default/pods/your-pod-name

default 换成你的命名空间,your-pod-name 换成具体的Pod名,返回的JSON里包含了Pod的一切:状态、IP、容器状态、事件等等,你可以用 jq 精准提取信息,比如只看状态:

curl -s http://localhost:8001/api/v1/namespaces/default/pods/your-pod-name | jq '.status'

直接看Pod的日志

有时候容器起不来,kubectl logs 可能报错,你可以尝试直接通过API获取日志,这能绕过一些kubectl的逻辑。

curl -s http://localhost:8001/api/v1/namespaces/default/pods/your-pod-name/log

如果Pod里有多个容器,你需要指定容器名:

curl -s "http://localhost:8001/api/v1/namespaces/default/pods/your-pod-name/log?container=your-container-name"

模拟“kubectl exec”进入容器

这个稍微复杂点,因为需要升级协议到WebSocket,Curl本身不支持WebSocket,但我们可以用它来发起一个升级请求,虽然不能真正交互,但可以用来测试权限或者看错误信息。

curl -i -N -H "Connection: Upgrade" -H "Upgrade: SPDY/3.1" -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" "http://localhost:8001/api/v1/namespaces/default/pods/your-pod-name/exec?command=/bin/sh&stdin=true&stdout=true&stderr=true&tty=true"

这个命令会返回一个HTTP 101 Switching Protocols的响应,证明API服务器是允许这种操作的,真要实现完整的exec,你需要用支持WebSocket的客户端库。

查看集群事件

用Curl那些命令来折腾Kubernetes调试,真心挺实用的!

事件(Events)是排查问题的重要线索,相当于系统的“流水账”。

curl -s http://localhost:8001/api/v1/namespaces/default/events | jq '.items[] | {type: .type, reason: .reason, message: .message, from: .source.component, time: .firstTimestamp}'

这样看事件,比 kubectl get events 更结构化,方便过滤。

诊断API资源路径

如果你不确定某个自定义资源(Custom Resource)的API路径是什么,可以直接访问API根路径来查找。

curl -s http://localhost:8001/apis | jq -r '.groups[].preferredVersion.groupVersion'

然后根据返回的组版本信息,再去探索,比如对于 apps/v1 的Deployment:

curl -s http://localhost:8001/apis/apps/v1/deployments

直接删除资源,实现快速清理

强制删除一个卡在“Terminating”状态的Pod(慎用!)。

curl -X DELETE --header "Content-Type: application/json" --data '{"gracePeriodSeconds":0, "propagationPolicy":"Background"}' http://localhost:8001/api/v1/namespaces/default/pods/your-stuck-pod

这相当于 kubectl delete pod your-stuck-pod --force --grace-period=0警告:这可能会破坏数据,只在确定没问题时使用。

总结一下

用Curl直接操作Kubernetes API,好处是直接、透明,让你摆脱kubectl的“魔法”,真正理解K8s底层是如何工作的,这对于调试一些复杂的权限问题、网络问题,或者当你只有一个API服务器地址和证书而无法安装kubectl的环境(比如某些CI/CD流水线)中特别有用。

kubectl proxy 是你的好朋友,它能让你省去大部分证书配置的麻烦,结合 jq 这个强大的JSON处理工具,你就能像外科手术一样精准地获取和操作Kubernetes集群里的任何资源了,多练练手,你会发现K8s的世界变得更清晰了。