Kubernetes init container

jaeyeon ha·2026년 3월 7일

[교육] Kubernetes

목록 보기
11/34

초기화 컨테이너(init container)

사전 작업이 필요한 경우, 메인 컨테이너가 동작하기 이전에 사전 작업 하는 컨테이너

[root@master ~/kube/06/init-pod]# vi init-container-pod.yaml
[root@master ~/kube/06/init-pod]# cat init-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
[root@master ~/kube/06/init-pod]# kubectl apply -f init-container-pod.yaml
pod/myapp-pod created
[root@master ~/kube/06/init-pod]# kubectl get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          4s
[root@master ~/kube/06/init-pod]# kubectl describe pod myapp-pod
Name:             myapp-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/192.168.2.62
Start Time:       Sat, 08 Mar 2025 17:20:11 +0900
Labels:           app=myapp
Annotations:      cni.projectcalico.org/containerID: 7c994605323829a4d5d2fc7abf9cddba69905ad009ced722baa37e1bcbb09e8e
                  cni.projectcalico.org/podIP: 10.233.75.12/32
                  cni.projectcalico.org/podIPs: 10.233.75.12/32
Status:           Pending
IP:               10.233.75.12
IPs:
  IP:  10.233.75.12
Init Containers:
  init-myservice:
    Container ID:  docker://5030be051f469a731ff5cdb8ed7e0f9312d80059e6a265e1e3cc4720de2f8934
    Image:         busybox:1.28
    Image ID:      docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done
    State:          Running
      Started:      Sat, 08 Mar 2025 17:20:17 +0900
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-wg5qq (ro)
  init-mydb:
    Container ID:
    Image:         busybox:1.28
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-wg5qq (ro)
Containers:
  myapp-container:
    Container ID:
    Image:         busybox:1.28
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      echo The app is running! && sleep 3600
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-wg5qq (ro)
Conditions:
  Type              Status
  Initialized       False
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  kube-api-access-wg5qq:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  2m24s  default-scheduler  Successfully assigned default/myapp-pod to node2
  Normal  Pulling    2m23s  kubelet            Pulling image "busybox:1.28"
  Normal  Pulled     2m18s  kubelet            Successfully pulled image "busybox:1.28" in 4.745641318s (4.745649916s including waiting)
  Normal  Created    2m18s  kubelet            Created container init-myservice
  Normal  Started    2m18s  kubelet            Started container init-myservice

▶ init container 실행 안되고 있음 → ∵ 요구하는 service 필요

[root@master ~/kube/06/init-pod]# vi init-container-myservice.yaml
[root@master ~/kube/06/init-pod]# cat init-container-myservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice

spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

[root@master ~/kube/06/init-pod]# kubectl apply -f init-container-myservice.yaml
service/myservice created
[root@master ~/kube/06/init-pod]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.233.0.1      <none>        443/TCP   6h38m
myservice    ClusterIP   10.233.38.228   <none>        80/TCP    21s

▶ 서비스 생성 후 재확인

[root@master ~/kube/06/init-pod]# kubectl describe pod myapp-pod
Name:             myapp-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/192.168.2.62
Start Time:       Sat, 08 Mar 2025 17:20:11 +0900
Labels:           app=myapp
Annotations:      cni.projectcalico.org/containerID: 7c994605323829a4d5d2fc7abf9cddba69905ad009ced722baa37e1bcbb09e8e
                  cni.projectcalico.org/podIP: 10.233.75.12/32
                  cni.projectcalico.org/podIPs: 10.233.75.12/32
Status:           Pending
IP:               10.233.75.12
IPs:
  IP:  10.233.75.12
Init Containers:
  init-myservice:
    Container ID:  docker://5030be051f469a731ff5cdb8ed7e0f9312d80059e6a265e1e3cc4720de2f8934
    Image:         busybox:1.28
    Image ID:      docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sat, 08 Mar 2025 17:20:17 +0900
      Finished:     Sat, 08 Mar 2025 17:25:00 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-wg5qq (ro)
  init-mydb:
    Container ID:  docker://bb425393a14f85f01b1d3e1b2eb433e60c70fc2e25d6f7de8334d0b60d66a114
    Image:         busybox:1.28
    Image ID:      docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done
    State:          Running
      Started:      Sat, 08 Mar 2025 17:25:00 +0900
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-wg5qq (ro)
Containers:
  myapp-container:
    Container ID:
    Image:         busybox:1.28
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      echo The app is running! && sleep 3600
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-wg5qq (ro)
Conditions:
  Type              Status
  Initialized       False
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  kube-api-access-wg5qq:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  6m16s  default-scheduler  Successfully assigned default/myapp-pod to node2
  Normal  Pulling    6m15s  kubelet            Pulling image "busybox:1.28"
  Normal  Pulled     6m10s  kubelet            Successfully pulled image "busybox:1.28" in 4.745641318s (4.745649916s including waiting)
  Normal  Created    6m10s  kubelet            Created container init-myservice
  Normal  Started    6m10s  kubelet            Started container init-myservice
  Normal  Pulled     87s    kubelet            Container image "busybox:1.28" already present on machine
  Normal  Created    87s    kubelet            Created container init-mydb
  Normal  Started    87s    kubelet            Started container init-mydb

▶ 두번째 init container를 위한 service도 추가

[root@master ~/kube/06/init-pod]# vi init-container-db.yaml
[root@master ~/kube/06/init-pod]# cat init-container-db.yaml
apiVersion: v1
kind: Service
metadata:
  name: mydb

spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377
[root@master ~/kube/06/init-pod]# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          10m

▶ pod 구동 성공

0개의 댓글