Programing

Kubernetes에서 컨테이너를 계속 실행하려면 어떻게해야합니까?

lottogame 2020. 9. 8. 21:52
반응형

Kubernetes에서 컨테이너를 계속 실행하려면 어떻게해야합니까?


이제 Kubernetes 클러스터에서 셸 (/ bin / bash)을 사용하여 간단한 컨테이너를 실행하려고합니다.

pseudo-ttyand 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"

  1. Dockerfile에서 다음 명령을 사용하십시오.

    CMD ["sh", "-c", "tail -f /dev/null"]

  2. Docker 이미지를 빌드하십시오.

  3. 이미지를 사용할 수 있는지 확인하기 위해 클러스터 또는 이와 유사한 것으로 푸시하십시오.
  4. kubectl run debug-container -it --image=<your-image>

POD를 계속 실행하려면 POD가 특정 작업을 수행해야합니다. 그렇지 않으면 Kubernetes가 불필요하다고 판단하여 종료됩니다. POD를 계속 실행하는 방법에는 여러 가지가 있습니다.

I have faced similar problems when I needed a POD just to run continuously without doing anything. The following are the two ways those worked for me:

  1. Firing up a sleep command while running the container.
  2. Running an infinite loop inside the container.

Although the first option is easier than the second one and may suffice the requirement, it is not the best option. As, there is a limit as far as the number of seconds you are going to assign in the sleep command. But a container with infinite loop running inside it never exits.

However, I will describe both the ways(Considering you are running busybox container):

1. Sleep Command

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. Infinite Loop

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

Run the following command to run the pod:

kubectl apply -f <pod-yaml-file-name>.yaml

Hope it helps!


I was able to get this to work with the command sleep infinity in Kubernetes, which will keep the container open. See this answer for alternatives when that doesn't work.


The simplest command as it can be for k8s pod manifest to run container forever:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]

Use this command inside you Dockerfile to keep the container running in you K8s cluster:

  • CMD tail -f /dev/null

In my case, a pod with an initContainer failed to initialize. Running docker ps -a and then docker logs exited-container-id-here gave me a log message which kubectl logs podname didn't display. Mystery solved :-)

참고URL : https://stackoverflow.com/questions/31870222/how-can-i-keep-a-container-running-on-kubernetes

반응형