kubernetes 공부를 하다보면 pod, containers라는 단어를 많이 들어볼 수 있다.
먼저 pod란?
kubernetes에서 가장 기본적인 배포 단위이다. 쉽게 말해서 1개의 가상이미지라고 보면 된다.
그렇다면 container는 뭘까?
pod를 이루는 Application이라고 보면 된다. 일반적으로 1개의 pod에는 1개의 container가 존재하나
필요에 따라서 다수의 containers가 존재할 수 있고 이런 경우 multi containers pod라고 한다.
그럼 init container는 뭘까?
init container는 app container가 구동되기 이전에 pod를 초기화해주는 container라고 보면 된다.
pod의 환경설정 또는 기타 다른 부수적인 작업을 하기 위해 일회성으로 구동되는 것이다.
init container는 말 그대로 초기화를 위한 목적이기 때문에 kubectl get pod를 해보면 실제 container 개수로 잡히지 않는다.
app container와 다른 한가지 특성이 있다면, 반드시 init container -> app container로 구동된다는 점이다.
그래서 init container에서 에러가 발생할 경우 app container가 구동되지 않고 이 경우 아래와 같이 에러가 발생한다.
생성 방법은 multi container를 설정하는것과 같이 해주면 된다. 다만 아래와 같이 initContainers 변수가 고정값이다.
cat pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
labels:
name: pod-test
spec:
containers:
- name: nginx-test
image: nginx
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: app-config
initContainers: <<< 고정값
- name: init-myservice
image: nginx
트러블슈팅은 어떻게 해야할까?
가장 쉬운 방법은 kubectl logs -f <pod name> 이다.하지만 init container 단계에서는 로그를 볼 수 없다.
다른 방법으로 describe로 보거나 kubectl logs -f <pod name> -c <container name>으로 봐야한다.
필자는 init container를 nginx 이미지로 했다. 그리고 init container는 정상 구동되었다.
하지만 별다른 command를 하지 않았기에 init container가 종료되지 않아사 STATUS가 계속 Init 상태인것이다.
그렇다면 init container를 사용하는 이유는 뭘까?
공식 홈페이지에는 pod 환경 설정을 위해 사용하며 일반적으로 2개의 환경설정을 한다. 그러면 2개의 init container를 사용한다고 한다.
내 생각에는 Dockerfile로 만들어놓고 모두 container 이미지에 유틸리티/환경설정을 하면 될거 같은데 굳이 pod에 환경설정을 해야하는게 있을까한다.
개인적으로는 아직까지는 하고 있지 않지만 pod에 취약점 진단 또는 기타 다른 스크립트를 돌릴 필요가 있을 경우 init container를 사용하면 될것 같다.
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] Devops kubenetes command tip (0) | 2023.01.18 |
---|---|
[k8s] Helm이란? Helm 구성과 필수개념 (0) | 2023.01.01 |
[k8s] Kubernetes DaemonSet vs StaticPod 개념[2/2] (0) | 2022.10.22 |
[k8s] Kubernetes DaemonSet vs StaticPod 개념[1/2] (0) | 2022.10.22 |
[k8s] Kubernetes Configmap(컨피그맵) 소소한 개념정리 (0) | 2022.10.21 |