Pod InitContainer
Pod InitContainer
Create 2 service, so we can emulate a clusterIP service.
---
kind: Service
apiVersion: v1
metadata:
name: webservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: mysql
spec:
ports:
- protocol: TCP
port: 3306
targetPort: 3306
Apply the file:
kubectl apply -f initcontainer-svc.yaml
service/webservice created service/mysql created
This services will not have any pod attached, the clusterIP still be resolved.
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql ClusterIP 10.106.152.72 <none> 3306/TCP 24s webservice ClusterIP 10.97.16.97 <none> 80/TCP 24s
Create a Pod with two InitContainers that wait until the service answer:
---
apiVersion: v1
kind: Pod
metadata:
name: initcontainer-1
labels:
app: initcontainer-1
spec:
containers:
- name: container-1
image: r.deso.tech/library/centos
command: ['bash', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-container1
image: r.deso.tech/library/netshoot
command: ['sh', '-c', 'until nslookup webservice; do echo waiting for webservice application; sleep 2; done;']
- name: init-container2
image: r.deso.tech/library/netshoot
command: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql database; sleep 2; done;']
Apply the yaml file:
kubectl apply -f initcontainer-1.yaml
Wait until the pod will start:
kubectl get pod
NAME READY STATUS RESTARTS AGE initcontainer-1 1/1 Running 0 9s
kubectl logs initcontainer-1
The app is running!
You should see “The app is running!”, because pass all the initcontainer without any problem.
Now delete the pod:
kubectl delete pod initcontainer-1 --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely. pod "initcontainer-1" force deleted
You are going to delete one of the services:
kubectl delete svc mysql
service "mysql" deleted
Now apply again the yaml file:
kubectl apply -f initcontainer-1.yaml
Immediately run:
kubectl get pod -w
NAME READY STATUS RESTARTS AGE initcontainer-1 0/1 Init:1/2 0 4s initcontainer-1 0/1 Init:1/2 0 6s
You will see that the pod will stay indefinitely waiting that nslookup resolves it.
After 1 minute the watching command will exit, but the pod still to wait the initContainer.
Now try to apply again the file of the service mysql.
This operation will permit to resolve again the load balancer svc mysql and the initContainer will continue the step:
kubectl get pod
NAME READY STATUS RESTARTS AGE initcontainer-1 0/1 Init:1/2 0 4s initcontainer-1 0/1 Init:1/2 0 6s
kubectl apply -f initcontainer-svc.yaml
service/webservice unchanged service/mysql created
Check again the pod and you will see the Pod in running state.
kubectl get pod -w
NAME READY STATUS RESTARTS AGE initcontainer-1 0/1 PodInitializing 0 4m26s initcontainer-1 1/1 Running 0 4m27s
Delete the pod:
kubectl delete pod initcontainer-1 --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely. pod "initcontainer-1" force deleted
Delete the services:
kubectl delete svc mysql webservice
service "mysql" deleted service "webservice" deleted