답변:
단일 컨테이너를 다시 시작할 수 있습니까?
을 통해 kubectl
는 아니지만 클러스터 설정에 따라 "속임수"및 docker kill the-sha-goes-here
을 사용할 수 있습니다. 이로 인해 kubelet이 "실패한"컨테이너를 다시 시작하게됩니다 (물론 Pod의 다시 시작 정책이 이것이 수행해야하는 작업이라고 가정).
포드 다시 시작하려면 어떻게 해
이는 포드가 생성 된 방법에 따라 다르지만 제공 한 포드 이름에 따라 ReplicaSet의 감독하에있는 것처럼 보이므로 kubectl delete pod test-1495806908-xn5jn
kubernetes가 그 자리에 새 포드를 만들 수 있습니다 (새 포드에는 다른 이름이므로 다시 kubectl get pods
는 돌아올 것으로 기대하지 마십시오 test-1495806908-xn5jn
)
docker kill the-sha-goes-here
, 왜 docker container restart the-sha-goes-here
대신하지 않습니까? kubelet
다시 시작하는 데 의존하는 이유는 무엇입니까? 어쨌든 진짜 문제는 docker
컨테이너를 죽이는 명령 을 어디에서 실행 해야 하는가입니다. 에 could-shell
, docker
K8S 클러스터에서 컨테이너를 표시하지 않습니다!
포드를 삭제하고 Kubernetes가 다시 생성하도록하는 대신 특정 컨테이너를 다시 시작하려는 경우가 있습니다.
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
나를 위해 일하는 것.
( 아래 권장 사항에 따라 명령을에서 reboot
로 변경했습니다 /sbin/killall5
.)
reboot
. /sbin/killall5
대신 실행하는 데 더 많은 행운이있었습니다 . 모든 프로세스를 죽이고 컨테이너가 종료됩니다.
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
매력처럼 작동했습니다
포드와 컨테이너는 모두 임시적이므로 다음 명령을 사용하여 특정 컨테이너를 중지하면 k8s 클러스터가 새 컨테이너를 다시 시작합니다.
kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"
그러면 SIGTERM
컨테이너에서 실행되는 기본 프로세스 인 프로세스 1에 신호 가 전송됩니다 . 다른 모든 프로세스는 프로세스 1의 하위가되며 프로세스 1이 종료 된 후 종료됩니다. 보낼 수있는 다른 신호 는 kill 맨 페이지 를 참조하십시오 .
kubernetes를 사용하는 모든 이유는 컨테이너를 관리하므로 포드에있는 컨테이너의 수명주기에 대해별로 신경 쓸 필요가 없기 때문입니다.
deployment
사용 하는 설정이 있기 때문에 replica set
. 을 사용하여 포드를 삭제할 수 있으며 kubectl delete pod test-1495806908-xn5jn
kubernetes는 다운 타임없이 2 개의 컨테이너가있는 새 포드 생성을 관리합니다. 포드에서 단일 컨테이너를 수동으로 다시 시작하려고하면 kubernetes의 모든 이점이 무효화됩니다.
위의 모든 답변은 포드 삭제에 대해 언급했지만 동일한 서비스의 포드가 많은 경우 각각을 삭제하는 것이 지루할 것입니다.
따라서 다음 솔루션을 제안하고 다시 시작하십시오 .
1) 스케일을 0으로 설정 :
kubectl scale deployment <<name>> --replicas=0 -n service
위의 명령은 이름이있는 모든 포드를 종료합니다. <<name>>
2) 포드를 다시 시작하려면 복제본을 0 이상으로 설정합니다.
kubectl scale deployment <<name>> --replicas=2 -n service
위의 명령은 2 개의 복제본으로 포드를 다시 시작합니다.
kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"
대신 사용하십시오 . 이렇게하면 배포가 업데이트되고 따라서 롤링 업데이트 전략에 따라 관리되는 모든 포드의 재생성이 시작됩니다.
우리는 매우 편리한 명령 줄을 사용하여 통합 포드에 새로운 이미지를 강제로 재배포합니다.
알파인 컨테이너는 모두 PID 5에서 "sustaining"명령을 실행하는 것으로 나타났습니다. 따라서 SIGTERM
신호를 보내면 컨테이너가 다운됩니다. imagePullPolicy
로 설정 Always
되면 kubelet이 컨테이너를 다시 가져올 때 최신 이미지를 다시 가져옵니다.
kubectl exec -i [pod name] -c [container-name] -- kill -15 5
kill -15 5
, PID 5를 사용하여 프로세스에 "-15"신호를 보내기 위해 kill 명령을 실행하고 있습니다. 이것은 프로세스가 종료 되기를 원한다는 것을 프로세스에 알리는 방법입니다 (SIGTERM ) 열려있는 리소스 (임시 파일, DB 트랜잭션 롤백, 연결 닫기 등)를 정리하는 데 시간이 걸립니다. -9 (SIGKILL)와 대조적으로 프로세스를 즉시 종료하고 열린 리소스를 정리할 수 없습니다.
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1
컨테이너가 권장되지 않는 루트로 실행된다고 가정합니다.
제 경우에는 애플리케이션 구성을 변경했을 때 사이드카 패턴에 사용 된 컨테이너를 재부팅해야했고 도커 사용자가 소유 한 스프링 부트 애플리케이션의 PID를 종료했습니다.
kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...
하면 사람들이 복사 / 붙여 넣기가 훨씬 쉬워집니다.