I have not been successfully in getting the actual state of pod when it changes states. From my code below, it is stuck in the waiting
and in my terminal ContainerCreating
is stuck in an endless loop.
for event in watch.stream(func=v1.list_namespaced_pod, namespace=ns, timeout_seconds=120):
response = event['object'].status
pod_data = {
"name": data.container_statuses[0].name,
"status": data.container_statuses[0].state,
"phase": data.phase,
}
if f'{pod_name}' in data[0]['name']:
running = data[0]['status'].running
wait = data[0]['status'].waiting
while wait != None:
print(f"waiting for {pod_name} state to Running...")
print(wait.reason)
time.sleep(10)
if running.started_at != None:
print("State has changed to Running. Pod has been created and started... ' ")
watch.stop()
What is the best approach to get the current state of my pod? I have a copy action that is triggered when the state changes from Pending
to Running
.
ContainerCreating
ContainerCreating
ContainerCreating
ContainerCreating
ContainerCreating
ContainerCreating
ContainerCreating
ContainerCreating
ContainerCreating
I have also tried using event['object'].status.phase
. But it's still stuck in the loop.
'container_statuses': [{'container_id': 'container-xxx',
'image': 'image-xxx',
'image_id': 'image-xxxx',
'last_state': {'running': None,
'terminated': None,
'waiting': None},
'name': 'hub',
'ready': True,
'restart_count': 0,
'state': {'running': {'started_at': datetime.datetime(2020, 4, 11, 8, 15, 53, tzinfo=tzutc())},
'terminated': None,
'waiting': None}}],
'host_ip': 'xx.xx.xx.xxx',
'init_container_statuses': None,
'message': None,
'nominated_node_name': None,
'phase': 'Running',
'pod_ip': 'x.xx.xx.xxx',
'qos_class': 'Burstable',
'reason': None,
'start_time': datetime.datetime(2020, 4, 11, 23, 48, 1, tzinfo=tzutc())}
I might be doing something wrong in the python call or using the wrong kubernetes method. I am out of ideas at this point!
I think you can use watch.stop()
:
watch = kubernetes.watch.Watch()
core_v1 = k8s.CoreV1Api()
for event in watch.stream(func=core_v1.list_namespaced_pod,
namespace=namespace,
label_selector=label,
timeout_seconds=60):
if event["object"].status.phase == "Running":
watch.stop()
end_time = time.time()
logger.info("%s started in %0.2f sec", full_name, end_time-start_time)
return
# event.type: ADDED, MODIFIED, DELETED
if event["type"] == "DELETED":
# Pod was deleted while we were waiting for it to start.
logger.debug("%s deleted before it started", full_name)
watch.stop()
return