Kubernetes 초기화 컨테이너
4886 단어 devopskubernetestutorial
초기화 컨테이너는 기본 또는 애플리케이션 컨테이너가 시작되기 전에 순서대로 실행됩니다. 반면에 모든 애플리케이션 컨테이너에는 비결정적 시작 순서가 있으므로 초기화 유형의 작업에 사용할 수 없습니다.
아래 그림은 초기화 컨테이너와 애플리케이션 컨테이너의 실행 흐름을 보여준다.
애플리케이션 컨테이너는 시작하기 전에 초기화 컨테이너가 성공적으로 완료될 때까지 기다립니다. 초기화 컨테이너가 실패하면 포드가 다시 시작되어(다시 시작 정책을
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를 삭제합니다.
Reference
이 문제에 관하여(Kubernetes 초기화 컨테이너), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/peterj/kubernetes-init-containers-51bd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)