이제 Kubernetes 클러스터에서 셸 (/ bin / bash)이있는 간단한 컨테이너를 실행하려고합니다.
pseudo-tty
and detach 옵션 ( 명령 -td
에 대한 옵션) 을 사용하여 Docker 컨테이너에서 컨테이너를 계속 실행하는 방법이 있다고 생각했습니다 docker run
.
예를 들면
$ sudo docker run -td ubuntu:latest
Kubernetes에 이와 같은 옵션이 있습니까?
다음 kubectl run-container
과 같은 명령 을 사용하여 컨테이너를 실행 해 보았습니다 .
kubectl run-container test_container ubuntu:latest --replicas=1
그러나 컨테이너는 몇 초 동안 종료됩니다 ( docker run
위에서 언급 한 옵션없이 명령으로 시작하는 것과 같습니다 ). 그리고 ReplicationController는 그것을 반복적으로 다시 시작합니다.
명령 의 -td
옵션 처럼 Kubernetes에서 컨테이너를 계속 실행하는 방법이 docker run
있습니까?
답변
컨테이너는 기본 프로세스가 종료 될 때 종료됩니다. 다음과 같이합니다.
docker run -itd debian
컨테이너를 열린 상태로 유지하는 것은 솔직히 빠른 테스트와 예제에만 사용해야하는 해킹입니다. 몇 분 동안 테스트 용 컨테이너를 원하면 다음을 수행합니다.
docker run -d debian sleep 300
잊어 버리면 컨테이너가 자동으로 종료된다는 장점이 있습니다. 또는 이와 같은 것을 while
루프 에 넣어 영원히 계속 실행하거나 top
. 이 모든 것은 Kubernetes에서 쉽게 수행 할 수 있어야합니다.
진짜 질문은 왜 이렇게 하시겠습니까? 컨테이너는 백그라운드에서 컨테이너를 계속 실행하는 프로세스를 통해 서비스를 제공해야합니다.
답변
컨테이너는 완료 될 때까지 실행됩니다. 완료되지 않는 작업을 컨테이너에 제공해야합니다. 다음과 같이 작동합니다.
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
답변
이 CMD를 다음에서 사용할 수 있습니다 Dockerfile
.
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
이렇게하면 중지하라는 메시지가 표시 될 때까지 컨테이너가 살아 있습니다. 트랩 및 대기를 사용하면 컨테이너 가 중지 요청에 즉시 반응 하게됩니다 . 트랩 / 대기없이 중지하는 데 몇 초가 걸립니다.
busybox 기반 이미지 (알파인 기반 이미지에 사용됨)의 경우 sleep은 infinity 인수에 대해 알지 못합니다. 이 해결 방법은 위의 예에서와 같은 항목에 대해 동일한 즉각적인 응답을 제공합니다 docker stop
.
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
답변
-
Dockerfile에서 다음 명령을 사용하십시오.
CMD ["sh", "-c", "tail -f /dev/null"]
-
Docker 이미지를 빌드하십시오.
- 이미지를 사용할 수 있는지 확인하기 위해 클러스터 또는 이와 유사한 것으로 푸시하십시오.
-
kubectl run debug-container -it --image=<your-image>
답변
POD를 계속 실행하려면 POD가 특정 작업을 수행해야합니다. 그렇지 않으면 Kubernetes가 불필요하다고 판단하여 종료됩니다. POD를 계속 실행하는 방법에는 여러 가지가 있습니다.
나는 아무것도하지 않고 계속해서 실행하기 위해 POD가 필요할 때 비슷한 문제에 직면했습니다. 다음은 저에게 효과가 있었던 두 가지 방법입니다.
- 컨테이너를 실행하는 동안 절전 명령을 실행합니다.
- 컨테이너 내부에서 무한 루프를 실행합니다.
첫 번째 옵션이 두 번째 옵션보다 쉽고 요구 사항을 충족 할 수 있지만 최선의 옵션은 아닙니다. 마찬가지로 sleep 명령에 할당 할 시간 (초)까지 제한이 있습니다. 그러나 내부에서 무한 루프가 실행되는 컨테이너는 절대로 종료되지 않습니다.
그러나 두 가지 방법을 모두 설명하겠습니다 (busybox 컨테이너를 실행하는 것을 고려).
1. 수면 명령
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "sleep 1000"]
nodeSelector:
beta.kubernetes.io/os: linux
2. 무한 루프
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
nodeSelector:
beta.kubernetes.io/os: linux
다음 명령을 실행하여 팟 (Pod)을 실행하십시오.
kubectl apply -f <pod-yaml-file-name>.yaml
도움이 되었기를 바랍니다.
답변
sleep infinity
컨테이너를 열어 두는 Kubernetes 의 명령으로이 작업을 수행 할 수있었습니다 . 작동하지 않는 대안 은 이 답변 을 참조하십시오 .
답변
k8s pod 매니페스트가 컨테이너를 영원히 실행하는 가장 간단한 명령은 다음과 같습니다.
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]