What happened (please include outputs or screenshots):
Following the example/pod_exec.py and execute a shell inside container
import time
from kubernetes import config
from kubernetes.client import Configuration
from kubernetes.client.api import core_v1_api
from kubernetes.client.rest import ApiException
from kubernetes.stream import stream
def exec_commands(api_instance):
name = 'busybox-test'
resp = None
try:
resp = api_instance.read_namespaced_pod(name=name,
namespace='default')
except ApiException as e:
if e.status != 404:
print("Unknown error: %s" % e)
exit(1)
if not resp:
print("Pod %s does not exist. Creating it..." % name)
pod_manifest = {
'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {
'name': name
},
'spec': {
'containers': [{
'image': 'busybox',
'name': 'sleep',
"args": [
"/bin/sh",
"-c",
"while true;do date;sleep 5; done"
]
}]
}
}
resp = api_instance.create_namespaced_pod(body=pod_manifest,
namespace='default')
while True:
resp = api_instance.read_namespaced_pod(name=name,
namespace='default')
if resp.status.phase != 'Pending':
break
time.sleep(1)
print("Done.")
exec_command = ['/bin/sh']
resp = stream(api_instance.connect_get_namespaced_pod_exec,
name,
'default',
command=exec_command,
stderr=True, stdin=True,
stdout=True, tty=False,
_preload_content=False)
commands = [
"/start.sh",
]
while resp.is_open():
resp.update(timeout=1)
if resp.peek_stdout():
print("STDOUT: %s" % resp.read_stdout())
if resp.peek_stderr():
print("STDERR: %s" % resp.read_stderr())
if commands:
c = commands.pop(0)
print("Running command... %s\n" % c)
resp.write_stdin(c + "\n")
else:
print('else')
#break
print('resp closed')
resp.close()
def main():
config.load_kube_config()
c = Configuration()
c.assert_hostname = False
Configuration.set_default(c)
core_v1 = core_v1_api.CoreV1Api()
exec_commands(core_v1)
if __name__ == '__main__':
main()
The start.sh in the busybox container
echo hello
sleep 10s
echo world
exit 1
From the output we can see that the start.sh never completes after command execution complete.
Running command... /start.sh
STDOUT: hello
else
else
else
else
else
else
else
else
else
else
STDOUT: world
else
else
else
else
else
else
^CTraceback (most recent call last):
File "test.py", line 93, in <module>
main()
File "test.py", line 89, in main
exec_commands(core_v1)
File "test.py", line 65, in exec_commands
resp.update(timeout=1)
File "/root/miniconda3/envs/ray/lib/python3.7/site-packages/kubernetes/stream/ws_client.py", line 201, in update
(self.sock.sock, ), (), (), timeout)
KeyboardInterrupt
What you expected to happen:
What I expected is the stream response should be closed after start.sh execution complete.
Environment:
- Kubernetes version (
kubectl version):
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:48:36Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
- OS (e.g., MacOS 10.13.6):
Linux 3.10.0-957.1.3.el7.x86_64
- Python version (
python --version)
Python 3.7.7
- Python client version (
pip list | grep kubernetes)
kubernetes 11.0.0
What happened (please include outputs or screenshots):
Following the example/pod_exec.py and execute a shell inside container
The start.sh in the busybox container
From the output we can see that the start.sh never completes after command execution complete.
What you expected to happen:
What I expected is the stream response should be closed after start.sh execution complete.
Environment:
kubectl version):python --version)Python 3.7.7
pip list | grep kubernetes)kubernetes 11.0.0