사전 작업이 필요한 경우, 메인 컨테이너가 동작하기 이전에 사전 작업 하는 컨테이너
[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 구동 성공