我在 AWS 上使用 python kubernetes 3.0.0 库和 kubernetes 1.6.6。
我的 pod 可以很快消失。有时,当我尝试执行它们时,我会收到 ApiException Handshake status 500
错误状态。
集群配置
以及kube config
都会发生这种情况。
当 pod/container 不存在时,我收到 404
错误,这是合理的,但 500
是内部服务器错误
。我在 kube-apiserver.log
中没有收到任何 500
错误,但我确实找到了 404
错误。
这是什么意思,有人能指出我正确的方向吗?
最佳答案
我知道这个问题有点老了,但我想我会分享我在尝试使用 python/kubernetes Attach/exec 进行几个调试案例时发现的内容(因为这在我能找到的任何地方都没有记录)。
据我所知,这都是为了使关键字参数与实际的容器配置相匹配,而不是您希望容器执行的操作。
使用 kubectl run
创建 Pod 时,如果您不使用-i --tty
标志(指示交互式/TTY 分配),然后尝试设置 tty
或stdin
标记为 True
在你的函数中,然后你会得到一个神秘的 500 错误,没有其他调试信息。如果您需要使用stdin
和tty
并且您正在使用配置文件(而不是运行),然后确保 set the stdin
and tty
flags to true
in spec.containers
.
运行时resp.readline_stdout()
,如果您得到 OverflowError: timestamp too large to convert to C _PyTime_t
,设置关键字参数timeout=<any integer>
。默认情况下,超时变量默认为 None,这在该函数中是无效值。
如果运行 Attach/exec 命令并收到 APIException 和状态代码 0,则错误 Reason: hostname 'X.X.X.X' doesn't match either of...
,请注意,似乎与 Python 2 不兼容。适用于 Python 3。最终应该修补。
我可以确认当 pod 不存在时,404 代码是通过 ApiException 抛出的。
如果您遇到神秘错误 upgrade request required
,请注意,您需要使用 kubernetes.stream.stream
函数来包装对 Attach/exec 的调用。你可以看到这个issue on GitHub和 this example code帮助您度过这一部分。
这是我的示例:resp = kubernetes.stream.stream(k8s.connect_get_namespaced_pod_attach, name='alpine-python-2', namespace="default", stderr=True, stdin=True, stdout=True, tty=True, _preload_content=False)
请注意 _preload_content=False
在 attach
中至关重要命令,否则调用将无限期地阻塞。
我知道这可能比您想要的信息更多,但希望至少其中一些会对您有所帮助。
关于python - kubectl exec 返回 `Handshake status 500`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789946/