웹사이트 검색

Kubernetes의 InitContainers


이 페이지에서

  1. 전제 조건
  2. 무엇을 할 것인가?\n
  3. InitContainers로 포드 만들기
  4. 결론

포드는 내부에서 앱을 실행하는 여러 컨테이너를 가질 수 있으며 이를 기술적으로 다중 컨테이너 포드라고 합니다. 그러나 팟(Pod)에는 하나 이상의 초기화 컨테이너가 있을 수도 있습니다. 이러한 컨테이너는 앱 컨테이너가 시작되기 전에 실행됩니다. 초기화 컨테이너는 항상 완료될 때까지 실행되며 각 초기화 컨테이너는 다음 컨테이너가 시작되기 전에 성공적으로 완료되어야 합니다.

일반 컨테이너와 InitContainers의 차이점은 InitContainers는 포드가 준비되기 전에 완료될 때까지 실행해야 하기 때문에 lifecycle, livenessProbe, readinessProbe 또는 startupProbe를 지원하지 않는다는 것입니다. 포드에 여러 초기화 컨테이너가 있는 경우 Kubelet은 각 초기화 컨테이너를 순차적으로 실행합니다.

초기화 컨테이너는 앱 이미지에 없는 맞춤 코드를 설정하는 데 사용됩니다. 초기화 컨테이너는 일련의 전제 조건이 충족될 때까지 앱 컨테이너 시작을 차단하거나 지연하는 메커니즘을 제공하는 데 사용할 수 있습니다. 기본 애플리케이션 컨테이너와 불필요한 도구를 분리하여 InitContainer를 사용하여 앱 컨테이너 이미지의 공격 영역을 제한할 수 있습니다.

모든 InitContainer는 다음 항목이 시작되기 전에 성공적으로 완료되어야 합니다. 이러한 방식으로 초기화 컨테이너는 일부 전제 조건이 충족될 때까지 앱 컨테이너의 시작을 차단하거나 지연하는 방법을 제공합니다.

InitContainer에 대해 자세히 알아보려면 여기를 클릭하여 Kubernetes의 공식 문서를 방문하세요.

이 기사에서는 기본 컨테이너보다 먼저 시작되는 InitContainers의 데모를 볼 것입니다.

전제 조건

  1. 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
    Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.\n

우리는 무엇을 할 것인가?

  1. InitContainers로 포드 만들기

InitContainers로 파드 생성

다음 콘텐츠를 사용하여 InitContainers용 개체 파일을 만듭니다.

vim pod-with-initcontainer.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-initcontainer
  labels:
    app: myapp
spec:
  containers:
  - name: main-container
    image: busybox
    command: ['sh', '-c', 'echo Inside the main-container! && sleep 36000']
  initContainers:
  - name: init-container-1
    image: busybox
    command: ['sh', '-c', 'echo Inside init-container-1 start; sleep 2;echo init-container-1 completed;']
  - name: init-container-2
    image: busybox
    command: ['sh', '-c', 'echo Inside init-container-2 start; sleep 2;echo init-container-2 completed;']

이 예제에서는 2개의 InitContainer가 각각 2초 동안 실행되고 성공적으로 완료되면 기본 컨테이너가 시작되어 36000초 동안 활성 상태가 됩니다.

이 예제는 InitContainer 기능의 사용법을 보여주며 고유한 사용 사례를 가질 수 있습니다.

클러스터의 기존 포트 목록을 가져오고 다음 명령을 사용하여 init-container 포드를 생성합니다.

kubectl get pods #Get a list of existing pods
kubectl apply -f pod-with-initcontainer.yml #Create a pod with InitContainer
kubectl get pods #Check the pod which got created

위의 스크린샷에서 본문이 생성되고 있는 것을 볼 수 있습니다.

init-containers와 기본 컨테이너의 로그를 모두 확인하여 컨테이너가 생성되고 실행되는 실행 및 흐름을 이해할 수 있습니다.

kubectl get pods
kubectl logs pod-with-initcontainer -c init-container-1 --timestamps=true #Check logs of the 1st InitContainer
kubectl logs pod-with-initcontainer -c init-container-2 --timestamps=true #Check logs of the 2nd InitContainer
kubectl logs pod-with-initcontainer --timestamps=true #Check logs of the main container

위의 스크린샷에서 컨테이너가 정의 파일에 정의된 순서대로 먼저 실행되어야 함을 이해할 수 있습니다. init-containers 실행이 완료되면 기본 컨테이너가 시작됩니다.

초기화 컨테이너는 항상 정의 파일에 정의된 순서대로 시작됩니다.

다음 명령어를 사용하여 포드에 대한 자세한 정보를 얻을 수 있습니다.

kubectl get pods #Get a list of Pods
kubectl describe pod pod-with-initcontainer #Get details of the Pod

위의 스크린샷에서 init-containers의 상태가 모두 종료되고 이유가 완료된 것을 볼 수 있습니다.

init-containers가 작업을 성공적으로 수행하고 종료되었음을 의미합니다.

위의 스크린샷에서 메인 컨테이너의 상태가 실행 중인 것을 확인할 수 있습니다.

이 포드가 더 이상 필요하지 않으면 다음 명령어를 사용하여 삭제할 수 있습니다.

kubectl get pods
kubectl delete pod pod-with-initcontainer #Delete the Pod

결론

이 기사에서는 init-container와 기본 애플리케이션을 포함하는 pod를 생성하는 단계를 살펴보았습니다. 포드에서 컨테이너 실행 순서를 관찰했습니다. 또한 init-containers가 작업을 마치면 종료되는 방식도 확인했습니다.