Kubernetes 초기화 컨테이너

초기화 컨테이너를 사용하면 애플리케이션을 초기화 논리에서 분리하고 권한 설정, 데이터베이스 스키마 또는 기본 애플리케이션에 대한 데이터 시드 등과 같은 초기화 작업을 실행할 수 있는 방법을 제공할 수 있습니다. 초기화 컨테이너에는 도구나 바이너리도 포함될 수 있습니다. 보안상의 이유로 기본 컨테이너 이미지에 포함하고 싶지 않은

초기화 컨테이너는 기본 또는 애플리케이션 컨테이너가 시작되기 전에 순서대로 실행됩니다. 반면에 모든 애플리케이션 컨테이너에는 비결정적 시작 순서가 있으므로 초기화 유형의 작업에 사용할 수 없습니다.

아래 그림은 초기화 컨테이너와 애플리케이션 컨테이너의 실행 흐름을 보여준다.



애플리케이션 컨테이너는 시작하기 전에 초기화 컨테이너가 성공적으로 완료될 때까지 기다립니다. 초기화 컨테이너가 실패하면 포드가 다시 시작되어(다시 시작 정책을 RestartNever 로 설정하지 않았다고 가정) 초기화 컨테이너가 다시 실행됩니다. 초기화 컨테이너를 설계할 때 문제 없이 여러 번 실행되도록 멱등성을 유지해야 합니다. 예를 들어, 데이터베이스를 시드하는 경우 레코드를 다시 삽입하기 전에 이미 레코드가 포함되어 있는지 확인하십시오.

초기화 컨테이너는 동일한 Pod의 일부이므로 Pod의 다른 컨테이너와 마찬가지로 볼륨, 네트워크, 보안 설정 및 리소스 제한을 공유합니다.

초기화 컨테이너를 사용하여 모든 컨테이너 간의 공유 볼륨에 GitHub 리포지토리를 복제하는 예를 살펴보겠습니다. Github 저장소에는 단일index.html이 포함되어 있습니다. 저장소가 복제되고 초기화 컨테이너가 실행되면 Nginx 서버를 실행하는 기본 컨테이너가 공유 볼륨에서 index.html를 사용하고 제공할 수 있습니다.
spec 필드를 사용하여 initContainers 아래에 초기 컨테이너를 정의하고 containers 필드 아래에 애플리케이션 컨테이너를 정의합니다. emptyDir 볼륨을 정의하고 초기화 및 애플리케이션 컨테이너 모두에 마운트합니다. 초기화 컨테이너가 시작되면 git clone 명령을 실행하고 리포지토리를 /usr/share/nginx/html 폴더에 복제합니다. 이 폴더는 Nginx가 HTML 페이지를 제공하는 기본 폴더이므로 애플리케이션 컨테이너가 시작되면 복제한 HTML 페이지에 액세스할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: website
spec:
  initContainers:
    - name: clone-repo
      image: alpine/git
      command:
        - git
        - clone
        - --progress
        - https://github.com/peterj/simple-http-page.git
        - /usr/share/nginx/html
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
  containers:
    - name: nginx
      image: nginx
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
  volumes:
    - name: web
      emptyDir: {}


위의 YAML을 init-container.yaml에 저장하고 kubectl apply -f init-container.yaml를 사용하여 포드를 생성합니다.

위 명령 직후에 kubectl get pods를 실행하면 초기화 컨테이너의 상태가 표시됩니다.

$ kubectl get po
NAME READY STATUS RESTARTS AGE
website 0/1 Init:0/1 0 1s


숫자0/1는 총 1개의 초기 컨테이너를 나타내며 현재까지 완료된 컨테이너는 0개입니다. 초기화 컨테이너가 실패하는 경우 상태가 Init:Error로 변경되거나 컨테이너가 반복적으로 실패하면 Init:CrashLoopBackOff로 변경됩니다.
describe 명령을 사용하여 이벤트를 보고 어떤 일이 발생했는지 확인할 수도 있습니다.

Normal Scheduled 19s default-scheduler Successfully assigned default/website to minikube
Normal Pulling 18s kubelet, minikube Pulling image "alpine/git"
Normal Pulled 17s kubelet, minikube Successfully pulled image "alpine/git"
Normal Created 17s kubelet, minikube Created container clone-repo
Normal Started 16s kubelet, minikube Started container clone-repo
Normal Pulling 15s kubelet, minikube Pulling image "nginx"
Normal Pulled 13s kubelet, minikube Successfully pulled image "nginx"
Normal Created 13s kubelet, minikube Created container nginx
Normal Started 13s kubelet, minikube Started container nginx


Kubernetes가 포드를 예약하자마자 첫 번째 Docker 이미지를 가져오고( alpine/git ) 초기화 컨테이너( clone-repo )를 생성하고 시작합니다. 완료되면(컨테이너가 저장소를 복제함) 기본 응용 프로그램 컨테이너( nginx )가 시작됩니다.

또한 logs 플래그를 사용하여 컨테이너 이름을 지정하면 -c 명령을 사용하여 초기화 컨테이너에서 로그를 가져올 수도 있습니다.

$ kubectl logs website -c clone-repo
Cloning into '/usr/share/nginx/html'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.


마지막으로 정적 HTML 페이지를 실제로 보려면 port-forward를 사용하여 로컬 포트를 컨테이너의 포트80로 전달할 수 있습니다.

$ kubectl port-forward pod/website 8000:80
Forwarding from 127.0.0.1:8000 -> 80
Forwarding from [::1]:8000 -> 80


이제 http://localhost:8000에서 브라우저를 열어 아래 그림과 같이 정적 페이지를 열 수 있습니다.



마지막으로 kubectl delete po website 를 실행하여 Pod를 삭제합니다.

좋은 웹페이지 즐겨찾기