40 Days Of Kubernetes (11/40)

Day 11/40

Video Link
@piyushsachdeva
Git Repository
My Git Repo

We’re going to look at to side-car or multi container pods.
Let’s say we have a pod which has a nginx container. It can have additional container inside or sidecar (helper) nginx container that for instance a health-check or init-container, running certain tasks, for the main container, in this example it’s nginx.

The first container that is run is init-container. As soon as the tasks of init-container completed, the main container starts. They also share the resources in that pod, such as memory or cpu.
Image description
(Photo from the video)

1. Create pod

---
apiVersion: v1 kind: Pod metadata: name: myapp labels: name: myapp-pod spec: containers: - name: myapp-container image: busybox:1.28 env: - name: FIRSTNAME value: "SINA"
Enter fullscreen mode
Exit fullscreen mode
root@localhost:~# kubectl apply -f pod-sidecar.yaml
pod/myapp created
root@localhost:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 0/1 Completed 1 (2s ago) 3s
root@localhost:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 0/1 CrashLoopBackOff 1 (13s ago) 14s
Enter fullscreen mode
Exit fullscreen mode

Note Because we’re not doing anything in the pod, the status is CrashLoopBackOff.

The events of the creation pod is:

Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m13s default-scheduler Successfully assigned default/myapp to lucky-luke-worker Normal Pulled 44s (x5 over 2m13s) kubelet Container image "busybox:1.28" already present on machine Normal Created 44s (x5 over 2m13s) kubelet Created container myapp-container Normal Started 44s (x5 over 2m13s) kubelet Started container myapp-container Warning BackOff 15s (x10 over 2m12s) kubelet Back-off restarting failed container myapp-container in pod myapp_default(e3371c0f-ea2a-44b6-81f7-98953931f6ad)
Enter fullscreen mode
Exit fullscreen mode

2. Create multi pod

---
apiVersion: v1 kind: Pod metadata: name: myapp labels: name: myapp-pod spec: containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo the app is running && sleep 3600'] env: - name: FIRSTNAME value: "SINA" initContainers: - name: init-myservice image: busybox:1.28 command: ['sh', '-c'] args: ['until nslookup myservice.default.svc.cluster.local; do echo Wainting for service to be up; sleep 2; done'] 
Enter fullscreen mode
Exit fullscreen mode
  • Run the pod:
root@localhost:~# kubectl apply -f pod-sidecar.yaml
pod/myapp created
root@localhost:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 0/1 Init:0/1 0 4s
root@localhost:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 0/1 Init:0/1 0 16s
root@localhost:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 0/1 Init:0/1 0 42s 
Enter fullscreen mode
Exit fullscreen mode
  • Let’s see the events of the pod:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m5s default-scheduler Successfully assigned default/myapp to lucky-luke-worker Normal Pulled 2m5s kubelet Container image "busybox:1.28" already present on machine Normal Created 2m5s kubelet Created container init-myservice Normal Started 2m5s kubelet Started container init-myservice 
Enter fullscreen mode
Exit fullscreen mode

It waits until the myservice.default.svc.local run.

  • Log of the pod:
root@localhost:~# kubectl logs pod/myapp
Defaulted container "myapp-container" out of: myapp-container, init-myservice (init)
Error from server (BadRequest): container "myapp-container" in pod "myapp" is waiting to start: PodInitializing
Enter fullscreen mode
Exit fullscreen mode
  • Logs of init-container:
root@localhost:~# kubectl logs pod/myapp -c init-myservice
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local nslookup: can't resolve 'myservice.default.svc.local'
Wainting for service to be up
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local nslookup: can't resolve 'myservice.default.svc.local'
Wainting for service to be up
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
...
Enter fullscreen mode
Exit fullscreen mode
  • Create deployment and service and see our myapp container is Running.
root@localhost:~# kubectl create deploy nginx-deploy --image nginx --port 80
deployment.apps/nginx-deploy created
root@localhost:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 0/1 Init:0/1 0 108s
nginx-deploy-7d54cf5979-qrqq4 1/1 Running 0 5s
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 0/1 Init:0/1 0 117s
pod/nginx-deploy-7d54cf5979-qrqq4 1/1 Running 0 14s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 14s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d2h
root@localhost:~# kubectl expose deploy nginx-deploy --name myservice --port 80
service/myservice exposed
root@localhost:~# kubectl get pod,deploy,svc
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 0/1 Init:0/1 0 2m31s
pod/nginx-deploy-7d54cf5979-qrqq4 1/1 Running 0 48s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 48s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d2h
service/myservice ClusterIP 10.96.143.163 <none> 80/TCP 4s
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 1/1 Running 0 2m42s
pod/nginx-deploy-7d54cf5979-qrqq4 1/1 Running 0 59s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 59s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d2h
service/myservice ClusterIP 10.96.143.163 <none> 80/TCP 15s
root@localhost:~# kubectl logs myapp -c myapp-container
the app is running 
Enter fullscreen mode
Exit fullscreen mode
  • Print environment variables of the pod
    As we can see, our variable FIRSTNAME is defined.
root@localhost:~# kubectl exec -it myapp -- printenv
Defaulted container "myapp-container" out of: myapp-container, init-myservice (init)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=myapp
`FIRSTNAME=SINA`
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYSERVICE_SERVICE_HOST=10.96.143.163
KUBERNETES_PORT=tcp://10.96.0.1:443
MYSERVICE_PORT=tcp://10.96.143.163:80
MYSERVICE_PORT_80_TCP_ADDR=10.96.143.163
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYSERVICE_PORT_80_TCP_PROTO=tcp
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP_PORT=443
MYSERVICE_SERVICE_PORT=80
MYSERVICE_PORT_80_TCP=tcp://10.96.143.163:80
MYSERVICE_PORT_80_TCP_PORT=80
TERM=xterm
HOME=/root
Enter fullscreen mode
Exit fullscreen mode

3. 3-Containers Pod

---
apiVersion: v1 kind: Pod metadata: name: myapp labels: name: myapp-pod spec: containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo the app is running && sleep 3600'] env: - name: FIRSTNAME value: "SINA" initContainers: - name: init-myservice image: busybox:1.28 command: ['sh', '-c'] args: ['until nslookup myservice.default.svc.cluster.local; do echo Wainting for Service to be up; sleep 30; done'] - name: init-mydb image: busybox:1.28 command: ['sh', '-c'] args: ['until nslookup mydb.default.svc.cluster.local; do echo Wainting for DB to be up; sleep 30; done'] 
Enter fullscreen mode
Exit fullscreen mode
root@localhost:~# kubectl create deploy nginx-deploy --image nginx --port 80
deployment.apps/nginx-deploy created
root@localhost:~# kubectl expose deploy nginx-deploy --name myservice --port 80
service/myservice exposed
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 0/1 Init:0/2 0 14m
pod/nginx-deploy-7d54cf5979-lddqf 1/1 Running 0 49s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 49s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d4h
service/myservice ClusterIP 10.96.125.99 <none> 80/TCP 5s
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 0/1 Init:0/2 0 14m
pod/nginx-deploy-7d54cf5979-lddqf 1/1 Running 0 57s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 57s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d4h
service/myservice ClusterIP 10.96.125.99 <none> 80/TCP 13s
root@localhost:~# kubectl create deploy redis-deploy --image redis --port 6379
deployment.apps/redis-deploy created
root@localhost:~# kubectl expose deploy redis-deploy --name mydb --port 6379
service/mydb exposed
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 0/1 Init:1/2 0 16m
pod/nginx-deploy-7d54cf5979-lddqf 1/1 Running 0 2m36s
pod/redis-deploy-6dd4dc84bc-2xcw9 1/1 Running 0 41s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 2m36s
deployment.apps/redis-deploy 1/1 1 1 41s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d4h
service/mydb ClusterIP 10.96.147.66 <none> 6379/TCP 5s
service/myservice ClusterIP 10.96.125.99 <none> 80/TCP 112s
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 0/1 Init:1/2 0 16m
pod/nginx-deploy-7d54cf5979-lddqf 1/1 Running 0 2m49s
pod/redis-deploy-6dd4dc84bc-2xcw9 1/1 Running 0 54s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 2m49s
deployment.apps/redis-deploy 1/1 1 1 54s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d4h
service/mydb ClusterIP 10.96.147.66 <none> 6379/TCP 18s
service/myservice ClusterIP 10.96.125.99 <none> 80/TCP 2m5s
root@localhost:~# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/myapp 1/1 Running 0 17m
pod/nginx-deploy-7d54cf5979-lddqf 1/1 Running 0 3m31s
pod/redis-deploy-6dd4dc84bc-2xcw9 1/1 Running 0 96s NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 3m31s
deployment.apps/redis-deploy 1/1 1 1 96s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d4h
service/mydb ClusterIP 10.96.147.66 <none> 6379/TCP 60s
service/myservice ClusterIP 10.96.125.99 <none> 80/TCP 2m47s
root@localhost:~# kubectl logs pod/myapp -c init-mydb
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Wainting for DB to be up
nslookup: can't resolve 'mydb.default.svc.cluster.local'
nslookup: can't resolve 'mydb.default.svc.cluster.local'
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Wainting for DB to be up
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Wainting for DB to be up
nslookup: can't resolve 'mydb.default.svc.cluster.local'
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Wainting for DB to be up
nslookup: can't resolve 'mydb.default.svc.cluster.local'
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: mydb.default.svc.cluster.local
Address 1: 10.96.147.66 mydb.default.svc.cluster.local
root@localhost:~# kubectl logs pod/myapp -c init-myservice
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local nslookup: can't resolve 'myservice.default.svc.cluster.local'
Wainting for Service to be up
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local nslookup: can't resolve 'myservice.default.svc.cluster.local'
Wainting for Service to be up
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local 
Enter fullscreen mode
Exit fullscreen mode

Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top