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


124

이제 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있습니까?


(이 이미지를 사용하여 는 Kubernetes의 문서가 제안하는 것은) 매우 편리합니다 :kubectl run curl --image=radial/busyboxplus:curl -i --tty
마테우스 산타나

이 질문은이 비디오에서 언급되었습니다. Kubernetes는 Datadog 에서 "Cargo culting . wikipedia에서 : 화물 컬트 프로그래머 라는 용어 는 미숙하거나 초보 컴퓨터 프로그래머 (또는 문제에 경험이없는 사람)에게 적용될 수 있습니다. at hand) 작동 방식이나 새로운 위치에 필요한지 여부에 대한 이해가 거의 또는 전혀없이 일부 프로그램 코드를 한 위치에서 다른 위치로 복사합니다.
tgogos

답변:


49

컨테이너는 기본 프로세스가 종료 될 때 종료됩니다. 다음과 같이합니다.

docker run -itd debian

컨테이너를 열린 상태로 유지하는 것은 솔직히 빠른 테스트와 예제에만 사용해야하는 해킹입니다. 몇 분 동안 테스트 용 컨테이너를 원하면 다음을 수행합니다.

docker run -d debian sleep 300

잊어 버리면 컨테이너가 자동으로 종료된다는 장점이 있습니다. 또는 이와 같은 것을 while루프 에 넣어 영원히 계속 실행하거나 top. 이 모든 것은 Kubernetes에서 쉽게 수행 할 수 있어야합니다.

진짜 질문은 왜 이렇게 하시겠습니까? 컨테이너는 백그라운드에서 컨테이너를 계속 실행하는 프로세스를 통해 서비스를 제공해야합니다.


답변 주셔서 감사합니다. 저는 이제 동시에 수십 개의 컨테이너가 실행되는 컨테이너의 동작을 이해하려고합니다. 끝없는 루프와 다른 무거운 명령을 사용하면 컨테이너의 동작이 무엇인지 알 수 없습니다. 이것이 / bin / bash를 실행하는 것과 같은 간단한 컨테이너가 필요한 이유입니다.
springwell

지금, 나는 실행을 시도 할 것이다 cat인수 및없이 topsleep많은 수의 인수.
springwell

30
sleep infinity많은 경우에서 작동합니다 (busybox 아님)
rwilson04

1
이를 수행하는 데는 많은 이유가 있습니다. 예를 들어, helm 릴리스 및 주입 된 구성을 사용하여 pod를 배포 할 수 있습니다. 이렇게하면 유사한 환경을 재현하는 것이 성 가시고 번거로울 것입니다. 그러나 다른 포드가 충돌 / 삭제되는 경우 해당 구성을 가진 컨테이너를 갖는 것은 매우 유용 할 수 있습니다.
Richard Løvehjerte 2018

서비스 는 여러 프로세스로 구성되어 있기 때문 입니다.
Константин Ван

135

컨테이너는 완료 될 때까지 실행됩니다. 완료되지 않는 작업을 컨테이너에 제공해야합니다. 다음과 같이 작동합니다.

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;" ]

그러나 이것이 모범 사례입니까?
aneesh joshi

3
@aneeshjoshi 나는 이것이 최선의 방법 이라고 말하지 않을 것 입니다. 이것은 즉시 종료하지 않고 실행되는 포드를 제공하는 예일뿐입니다. 모범 사례는 컨테이너가 설계된 작업 (완료 될 때까지 실행되는 작업, 영구적으로 실행되는 웹 서버 등)을 수행하도록 컨테이너를 만드는 것입니다. 기본 명령이 즉시 종료되기 때문에 pod를 계속 생성 할 때만 쿠 버네 티스가 처음에는 좌절감을 느낄 수 있기 때문에 이것을 예로 게시했습니다.
Joel B

@JoelB 감사합니다. 나는 그것을하는 "올바른"방법이 무엇인지 궁금했다.
aneesh joshi

1
잠시 살 수있는 용기가 필요해서 들어갈 수있게 해주셔서 감사합니다. 나는 더 밝은 이미지로 똑같이 ubuntu하려고 노력하고 bash이미지를 시도 했지만 작동하지 못했습니다. bash이미지 로 이와 동일한 작업을 수행하는 방법을 아십니까?
cryanbhu

1
@cryanbhu 더 가벼운 이미지의 경우 alpine을 사용할 수 있습니다. 컨테이너 사양은 다음과 같이 보일 수 있습니다. {"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}(여기에서는 yaml이 주석 형식을 지정하지 않기 때문에 json 만 해당됩니다.) 중요한 부분 /bin/sh/bin/bash.
bschlueter

111

이 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"

나는 목적으로 디버깅는 Kubernetes에 배포 YAML을 동일하게 사용하고 있습니다
sdkks을

이 날 "잘못된 번호 '무한대'잠"을 제공합니다
arunkjn

@arunkjn 감사합니다. (알파인 이미지와 같은) busybox를 사용하는 이미지가있을 수 있습니다. 업데이트 된 답변을 참조하십시오.
itsafire

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

    CMD ["sh", "-c", "tail -f /dev/null"]
    
  2. Docker 이미지를 빌드하십시오.

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

컨테이너 디버깅을위한 유용한 팁.
kta

16

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

나는 아무것도하지 않고 계속해서 실행하기 위해 POD가 필요할 때 비슷한 문제에 직면했습니다. 다음은 저에게 효과가 있었던 두 가지 방법입니다.

  1. 컨테이너를 실행하는 동안 절전 명령을 실행합니다.
  2. 컨테이너 내부에서 무한 루프를 실행합니다.

첫 번째 옵션이 두 번째 옵션보다 쉽고 요구 사항을 충족 할 수 있지만 최선의 옵션은 아닙니다. 마찬가지로 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

도움이 되었기를 바랍니다.


수면이란 무엇입니까? Ubuntu 내부의 명령입니까? 아니면 도커 명령?
Faraz

@Faraz Linux 셸 명령이며 도커에만 국한되지 않습니다.
Arbaaz

11

sleep infinity컨테이너를 열어 두는 Kubernetes 의 명령으로이 작업을 수행 할 수있었습니다 . 작동하지 않는 대안 은 이 답변 을 참조하십시오 .


이것은 질문에 대한 답을 제공하지 않습니다. 작성자에게 비평이나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. - 리뷰에서
Will

1
@ 확실합니다. sleep infinity컨테이너를 열어 두어 질문에서 요구하는 것과 동일한 유형의 기능을 제공합니다 (대부분의 컨테이너 유형에 대해). 또한 특정 명령이 작동하지 않는 경우 대안에 대한 링크를 제공합니다
rwilson04

이것은 리뷰에서 나온 것입니다. 답변에 댓글 텍스트를 추가하면 양질의 답변입니다. :) 내 초기 플래그 / 추천은 댓글이 성공하지 못했다는 것을 기반으로했기 때문에 댓글로 간주되어야한다고 생각했습니다. 빠른 편집을 추가하고 찬성했습니다.
Will

"... Kubernetes의 수면 무한대"는 정보가없는 진술입니다. 그것은 그림에 유닉스와도 커가 없음을 의미합니다.
mmla

10

k8s pod 매니페스트가 컨테이너를 영원히 실행하는 가장 간단한 명령은 다음과 같습니다.

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

5

Dockerfile 내부에서이 명령을 사용하여 K8s 클러스터에서 컨테이너를 계속 실행합니다.

  • CMD 꼬리 -f / dev / null

3

제 경우에는 initContainer가있는 포드를 초기화하지 못했습니다. 실행 docker ps -a후 표시되지 않는 docker logs exited-container-id-here로그 메시지를 kubectl logs podname받았습니다. 미스터리 해결 :-)


1

이를 수행하는 방법에는 여러 가지가 있지만 가장 우아한 방법 중 하나는 다음과 같습니다.

kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh

왜 가장 우아한 솔루션이라고 생각하십니까?
mordowiciel

1

주제에 대한 나의 몇 센트. 그것이 kubectl작동 한다고 가정하면 귀하의 질문에서 언급 한 docker 명령과 동일한 가장 가까운 명령은 다음과 같습니다.

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity

위의 명령은 네임 스페이스에 단일 Pod을 생성하고 인수 default를 사용하여 sleep명령을 실행 infinity합니다. 이렇게하면 컨테이너를 활성 상태로 유지하면서 포 그라운드에서 실행되는 프로세스가 생성됩니다.

나중에 명령 Pod을 실행 하여 상호 작용할 수 있습니다 kubectl exec.

$ kubectl exec ubuntu -it -- bash

이 기술은 Pod 리소스 및 임시 디버깅을 만드는 데 매우 유용합니다.


1
잘 작동합니다. 에 대한 필요는 --restart=Never, 단지 호출하지kubectl run ubuntu --image=ubuntu -- sleep infinity
노암 마 노스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.