40 Days Of Kubernetes (11/40)

sina14

Sina Tavakkol

Posted on July 8, 2024

40 Days Of Kubernetes (11/40)

Day 11/40

Multi Container Pod Kubernetes - Sidecar vs Init Container

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
💖 💪 🙅 🚩
sina14
Sina Tavakkol

Posted on July 8, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

40 Days Of Kubernetes (37/40)
kubernetes 40 Days Of Kubernetes (37/40)

September 14, 2024

40 Days Of Kubernetes (39/40)
kubernetes 40 Days Of Kubernetes (39/40)

September 16, 2024

40 Days Of Kubernetes (36/40)
kubernetes 40 Days Of Kubernetes (36/40)

September 13, 2024

40 Days Of Kubernetes (31/40)
kubernetes 40 Days Of Kubernetes (31/40)

August 26, 2024

40 Days Of Kubernetes (33/40)
kubernetes 40 Days Of Kubernetes (33/40)

September 4, 2024