Kubernetes, Beginning with PODs
Published: 2020-07-01 14:10:14

I am planning to prepare for the [CKA](https://www.cncf.io/certification/cka/) exam. Since one of the best methods to learn for me is to write down what I have learned, I decided to write them as blog posts. So let's get started!

<style>post-full-content pre { margin: 0;}</style>

## What is a POD?
A Pod is the smallest deployable unit that can be created and managed in Kubernetes. In the [official documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod/) you can find much more theoretical information about Pods. In this post I try to go over practical usage of Pods.

### How to create and run a POD?
There are mainly 2 ways of creating Pods in Kubernetes. One of them is using **kubectl** command. **kubectl** is a command line tool which lets you control Kubernetes clusters. For more information, please check [the documentation](https://kubernetes.io/docs/reference/kubectl/overview/)

With the command below, we are creating a Pod labeled as **nginx** and  using an image **nginx.**
```
$ kubectl run nginx --image nginx
pod/nginx created
```

If we check what Pods are running in our cluster, we can see that the Pod is running.  

```
$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          2m45s
```

We can also check the details of the Pod by running **describe** argument.
```
$ kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node01/172.17.0.18
Start Time:   Sun, 28 Jun 2020 17:05:41 +0000
Labels:       run=nginx
Annotations:  <none>
Status:       Running
IP:           10.244.1.3
...
...
```
In the output, we can see which node is our Pod is running at, which image has been used etc. It also shows events related to the Pod. If there is an error, we could easily see it.
```
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  15m   default-scheduler  Successfully assigned default/nginx to node01
  Normal  Pulling    15m   kubelet, node01    Pulling image "nginx"
  Normal  Pulled     15m   kubelet, node01    Successfully pulled image "nginx"
  Normal  Created    15m   kubelet, node01    Created container nginx
  Normal  Started    15m   kubelet, node01    Started container nginx
```

Let's delete this Pod and create another one with the second method, by writing **yaml** files.
To delete a Pod we can simply run the command below.
```
$ kubectl delete pods nginx
pod "nginx" deleted
$ kubectl get pods
No resources found in default namespace.
```
Now create a file named as **pod.yml** and write some yaml.
```
apiVersion: v1
kind: Pod
metadata:
 name: my-nginx
 labels:
  app: my-first-app
  type: frontend
spec:
 containers:
  - name: nginx-container
    image: nginx123
```
Here we basically specify what kind of resource we want to create, which is Pod.
With **metadata** we specify a name for our Pod as well as apply some labels to it. Labels are handy in an environment where you have hundreds of Pods.
With **spec** section, we specify a name for our container and which image to use.
Now let's create a Pod with our definition file.
```
$ kubectl apply -f pod.yml
pod/my-nginx created
```
It successfully created the Pod. Let's check the status of it.
```
$ kubectl get pods
NAME       READY   STATUS         RESTARTS   AGE
my-nginx   0/1     ErrImagePull   0          58s
```
In **STATUS** column we can see that there is an error. Let's describe the Pod to get more information in the **events** section.
```
$ kubectl describe pods my-nginx
...
...
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m47s                default-scheduler  Successfully assigned default/my-nginx to node01
  Normal   Pulling    49s (x4 over 2m22s)  kubelet, node01    Pulling image "nginx123"
  Warning  Failed     48s (x4 over 2m21s)  kubelet, node01    Failed to pull image "nginx123": rpc error: code = Unknown desc = Error response from daemon: pull access denied for nginx123, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     48s (x4 over 2m21s)  kubelet, node01    Error: ErrImagePull
  Normal   BackOff    34s (x6 over 2m20s)  kubelet, node01    Back-off pulling image "nginx123"
  Warning  Failed     23s (x7 over 2m20s)  kubelet, node01    Error: ImagePullBackOff
```
Here we can see that there is no image named as **nginx123.** Now let's try to resolve this problem. To solve it, we simply need to edit the definition file with the correct image name and apply it.
```
spec:
 containers:
  - name: nginx-container
    image: nginx
```
```
$ kubectl apply -f pod.yml
pod/my-nginx configured
```
Now if we check the status, we can see there is no error.
```
$ kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          6m47s
```