You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Kubernetes API执行pod exec并运行命令?

Kubernetes API执行Pod Exec的问题分析与替代方案

你的操作问题分析

curl命令的问题

Kubernetes的Pod Exec API依赖WebSocket协议实现双向交互,curl对WebSocket的原生支持非常有限,即使手动添加Upgrade等头信息,也无法完成完整的WebSocket握手和后续数据流传输。另外,SPDY协议早已被Kubernetes弃用,现在统一使用WebSocket,所以curl本身就不是适合的工具,返回Upgrade request required是预期结果。

wscat命令的问题

  1. 403错误:仅指定command=ls不够,Exec API必须明确声明stdin、stdout、stderr等参数(至少开启stdout),缺少这些参数会被API服务器拒绝。同时,wscat连接wss地址时需要跳过证书校验(类似curl的-k),否则可能因集群证书问题导致权限校验失败。
  2. 无输出:命令中的&在shell中会被解析为后台运行符号,导致URL被截断为wss://kubernetes.default.svc/.../exec?command=ls,后续的stdin=true等参数未传递给wscat,API服务器未收到完整请求参数,自然无输出。
  3. 协议错误:使用了https://协议,但WebSocket连接必须用wss://(加密WebSocket),因此触发协议不支持的错误。

不使用kubectl的替代方案

1. 使用websocat(推荐)

websocat是功能更完善的WebSocket客户端,能正确处理Kubernetes Exec API的握手和数据流。执行以下命令(注意用引号包裹URL避免shell解析问题):

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

websocat -H "Authorization: Bearer $TOKEN" --insecure "wss://kubernetes.default.svc/api/v1/namespaces/$NAMESPACE/pods/nginx-deployment-5c547569b4-jgm85/exec?command=ls&stdin=true&stdout=true&stderr=true&tty=false"
  • --insecure:跳过证书校验(和curl的-k作用一致)
  • stdin=true&stdout=true&stderr=true:明确开启标准输入输出和错误流
  • tty=false:非交互式执行命令,适合单次命令执行

2. 使用Kubernetes客户端库

用编程语言的Kubernetes客户端可更灵活调用Exec API,比如Python的kubernetes库:

from kubernetes import client, config
from kubernetes.stream import stream

# 加载集群内配置
config.load_incluster_config()
v1 = client.CoreV1Api()

# 执行exec命令
resp = stream(v1.connect_get_namespaced_pod_exec,
              name="nginx-deployment-5c547569b4-jgm85",
              namespace=NAMESPACE,
              command=["ls"],
              stderr=True, stdin=False,
              stdout=True, tty=False)
print(resp)

需先在Pod内安装依赖:pip install kubernetes

3. 用socat手动处理WebSocket握手(应急方案)

若无法安装工具,可临时用socat配合shell脚本完成握手,但后续需手动处理WebSocket帧编码,实际使用不推荐:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

printf "GET /api/v1/namespaces/$NAMESPACE/pods/nginx-deployment-5c547569b4-jgm85/exec?command=ls&stdin=true&stdout=true&stderr=true&tty=false HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer $TOKEN\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\n\r\n" | socat - OPENSSL:kubernetes.default.svc:443,verify=0

内容的提问来源于stack exchange,提问作者vin'm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:52:46