포드 내에서 컨테이너 다시 시작


112

test-1495806908-xn5jn2 개의 컨테이너 가있는 포드 가 있습니다. 나는 그들 중 하나를 다시 시작하고 싶습니다 container-test. 포드 내에서 단일 컨테이너를 다시 시작할 수 있습니까? 그렇지 않은 경우 포드를 어떻게 다시 시작합니까?

pod는 deployment.yamlwith를 사용하여 생성 되었습니다.

kubectl create -f deployment.yaml

답변:


144

단일 컨테이너를 다시 시작할 수 있습니까?

을 통해 kubectl는 아니지만 클러스터 설정에 따라 "속임수"및 docker kill the-sha-goes-here을 사용할 수 있습니다. 이로 인해 kubelet이 "실패한"컨테이너를 다시 시작하게됩니다 (물론 Pod의 다시 시작 정책이 이것이 수행해야하는 작업이라고 가정).

포드 다시 시작하려면 어떻게 해

이는 포드가 생성 된 방법에 따라 다르지만 제공 한 포드 이름에 따라 ReplicaSet의 감독하에있는 것처럼 보이므로 kubectl delete pod test-1495806908-xn5jnkubernetes가 그 자리에 새 포드를 만들 수 있습니다 (새 포드에는 다른 이름이므로 다시 kubectl get pods는 돌아올 것으로 기대하지 마십시오 test-1495806908-xn5jn)


7
기본 다시 시작 정책은 항상 다시 시작입니다
Hem

내가 이것을 할 수 있다면 : docker kill the-sha-goes-here, 왜 docker container restart the-sha-goes-here대신하지 않습니까? kubelet다시 시작하는 데 의존하는 이유는 무엇입니까? 어쨌든 진짜 문제는 docker컨테이너를 죽이는 명령 을 어디에서 실행 해야 하는가입니다. 에 could-shell, dockerK8S 클러스터에서 컨테이너를 표시하지 않습니다!
Nawaz

53

포드를 삭제하고 Kubernetes가 다시 생성하도록하는 대신 특정 컨테이너를 다시 시작하려는 경우가 있습니다.

kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5나를 위해 일하는 것.

( 아래 권장 사항에 따라 명령을에서 reboot로 변경했습니다 /sbin/killall5.)


28
모든 컨테이너에있는 것은 아닙니다 reboot. /sbin/killall5대신 실행하는 데 더 많은 행운이있었습니다 . 모든 프로세스를 죽이고 컨테이너가 종료됩니다.
Ingo Karkat 2018

1
그리고하지 모든 컨테이너는 루트 사용자를 가지고)
JuliSmz

4
-1, 왜냐하면 ... '재부팅'의 부작용으로 모든 프로세스를 종료하고 Kubernetes 복구를 수행하고 있습니다. 루트로 실행, 컨테이너의 바이너리 가용성, 활성화 된 restartPolicy 등 많은 가정을하고 있습니다. 또한 이것은 이상적이지 않은 프로세스 실패에 대한 로그를 복잡하게 만듭니다.
gertvdijk

1
그래서 alpine에는 killall이 없지만 / sbin / reboot는 훌륭하게 작동합니다. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot매력처럼 작동했습니다
Atifm

38

포드와 컨테이너는 모두 임시적이므로 다음 명령을 사용하여 특정 컨테이너를 중지하면 k8s 클러스터가 새 컨테이너를 다시 시작합니다.

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

그러면 SIGTERM컨테이너에서 실행되는 기본 프로세스 인 프로세스 1에 신호 가 전송됩니다 . 다른 모든 프로세스는 프로세스 1의 하위가되며 프로세스 1이 종료 된 후 종료됩니다. 보낼 수있는 다른 신호 는 kill 맨 페이지 를 참조하십시오 .


3
나는 다른 대답을 시도했고 이것이 나를 위해 일한 유일한 사람이었습니다. 가장 일반적인 대답 인 것 같습니다.
Batato

포드 내에서 실행되는 컨테이너 이름을 어떻게 얻습니까 ??
AATHITH 라 젠드 란

내 Alpine 컨테이너는 내가 이것을 시도했을 때 일종의 건강에 좋지 않은 상태가되었습니다. kubectl get po가 포드의 상태 열에 오류를 표시합니다.
Atifm

17

kubernetes를 사용하는 모든 이유는 컨테이너를 관리하므로 포드에있는 컨테이너의 수명주기에 대해별로 신경 쓸 필요가 없기 때문입니다.

deployment사용 하는 설정이 있기 때문에 replica set. 을 사용하여 포드를 삭제할 수 있으며 kubectl delete pod test-1495806908-xn5jnkubernetes는 다운 타임없이 2 개의 컨테이너가있는 새 포드 생성을 관리합니다. 포드에서 단일 컨테이너를 수동으로 다시 시작하려고하면 kubernetes의 모든 이점이 무효화됩니다.


2
내 종료 포드의 프로세스가 0/1되자 나는 다운 타임을 경험
딘 기독교 함대

6
"중단 시간 없음"을 신중하게 언급해야합니다. 정확한 구성에 따라 다릅니다. 게다가 제로 다운 타임은 그 자체로도 문제가 있습니다.
Nicolas

복제본이 하나만있는 배포에서 포드를 삭제하면 항상 다운 타임이 발생합니다.
Nyein Chan Wynn

7

위의 모든 답변은 포드 삭제에 대해 언급했지만 동일한 서비스의 포드가 많은 경우 각각을 삭제하는 것이 지루할 것입니다.

따라서 다음 솔루션을 제안하고 다시 시작하십시오 .

  • 1) 스케일을 0으로 설정 :

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    위의 명령은 이름이있는 모든 포드를 종료합니다. <<name>>

  • 2) 포드를 다시 시작하려면 복제본을 0 이상으로 설정합니다.

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    위의 명령은 2 개의 복제본으로 포드를 다시 시작합니다.


5
질문은 포드 내에서 단일 컨테이너를 다시 시작하는 방법에 대한 질문이었습니다.
Chris Beach

또한 고 가용성 애플리케이션에서는 포드를 0 개로 축소해도 작동하지 않습니다. kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"대신 사용하십시오 . 이렇게하면 배포가 업데이트되고 따라서 롤링 업데이트 전략에 따라 관리되는 모든 포드의 재생성이 시작됩니다.
Kostrahb

3

우리는 매우 편리한 명령 줄을 사용하여 통합 포드에 새로운 이미지를 강제로 재배포합니다.
알파인 컨테이너는 모두 PID 5에서 "sustaining"명령을 실행하는 것으로 나타났습니다. 따라서 SIGTERM신호를 보내면 컨테이너가 다운됩니다. imagePullPolicy로 설정 Always되면 kubelet이 컨테이너를 다시 가져올 때 최신 이미지를 다시 가져옵니다.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
-15와 5는 무엇을 의미합니까?
John Balvin Arias

2
@JohnBalvinArias 위의 설명에 포함되어 있지만 kill -15 5, PID 5를 사용하여 프로세스에 "-15"신호를 보내기 위해 kill 명령을 실행하고 있습니다. 이것은 프로세스가 종료 되기를 원한다는 것을 프로세스에 알리는 방법입니다 (SIGTERM ) 열려있는 리소스 (임시 파일, DB 트랜잭션 롤백, 연결 닫기 등)를 정리하는 데 시간이 걸립니다. -9 (SIGKILL)와 대조적으로 프로세스를 즉시 종료하고 열린 리소스를 정리할 수 없습니다.
Conrad.Dean

2

Dockerfile의에 지정된 프로세스 죽이기 CMD/ ENTRYPOINT나를 위해 일을. (컨테이너가 자동으로 다시 시작됨)

내 컨테이너에서 재부팅이 허용되지 않았으므로이 해결 방법을 사용해야했습니다.


2

coredns포드에 문제가 발생하여 해당 포드를 삭제했습니다.

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

포드가 자동으로 다시 시작됩니다.


2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

컨테이너가 권장되지 않는 루트로 실행된다고 가정합니다.

제 경우에는 애플리케이션 구성을 변경했을 때 사이드카 패턴에 사용 된 컨테이너를 재부팅해야했고 도커 사용자가 소유 한 스프링 부트 애플리케이션의 PID를 종료했습니다.


1
를 작성 kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...하면 사람들이 복사 / 붙여 넣기가 훨씬 쉬워집니다.
William Pursell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.