Kubectl Restart Pod
Tags: devops, kubernetes, webdev, docker
Published: 2023-11-20 13:37:36

<a href="https://s.refine.dev/kubectl-restart">
    <img src="https://refine.ams3.cdn.digitaloceanspaces.com/readme/refine-readme-banner.png" alt="refine repo" /> 
</a>

---


## Brief description of what a pod is?
In Kubernetes, a pod is the smallest execution unit. Pods may be composed of a single or multiple containers that share the same resources within the Pod Storage, Network, or namespaces. Pods typically have a one-to-one mapping with containers, but in more advanced situations, we may run multiple containers in a Pod. If needed, Kubernetes can use replication controllers to scale the application horizontally when containers are grouped into pods. For instance, if a single pod is overloaded, then Kubernetes could automatically replicate it and deploy it in a cluster.

## Why Restarting a Pod is Necessary
### Situations that demand a pod restart

**Configuration Changes:** You may need to restart the Pod to apply any changes you made to the configuration of your application or environment. 

**Application Updates:** If a pod is running an incompatible version of the application or environment. To upgrade or downgrade a pod according to the desired version, you need to restart it.

**Troubleshooting:** Restarting your pods can be a way to diagnose the problem if your application encounters problems or behaves unpredictably. 

**Resource Constraints:** Restarting the Pod may assist in the recovery of resources and return to normal operation if it is running low on memory or experiencing an increase in CPU usage. But this is a temporary solution. 


## Difference between restarting a pod and recreating it. 

| **Action**         | **Description**                                                                      | **Effect on Pod ID**                                                                            | **Effect on Pod Status**                                                                      | **Effect on Pod Data**                                                                |
| ------------------ | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| **Restarting Pod** | Restarting the Pod typically refers to restarting the container inside the Pod.      | Since the Pod is just restarted rather than deleted and regenerated, the pod ID doesn't change. | The Pod's status changes from running to terminating and then back to running.                | The pod data is kept intact unless the pod specification or image has changed.        |
| **Restarting Pod** | When a pod is recreated, the old one must be removed, and a new one must be created. | When a new pod is formed and the old one is destroyed, the pod ID changes.                      | The pod status changes between Running, Terminating, and Pending before returning to Running. | It is lost unless the pod data is saved in an external source or a persistent volume. |


## Understanding Pod Lifecycle
### Explanation of the different stages in the lifecycle of a pod
Pod phase means the state of a pod at any point in its life cycle. The possible phases of a pod are as follows:

**Pending Phase**
A pod that displays the state '**pending**' indicates that Kubernetes has accepted it but has not finished processing it. This might be because it hasn't been scheduled yet, the Pod is waiting for init-containers to finish their tasks, or the images haven't been pulled yet (which could indicate an image pull error).

**Running Phase**
When a pod is linked to a node, it is said to be in the running phase. This indicates that the Pod has been assigned to a host, images have been pulled, init-containers have finished, and at least one of the Pod's containers is running or is in the process of starting or restarting.

**Succeeded Phase**
In this phase, the Pod has finished its task, such as completing a job, and all containers are terminated. It means that it's stopped working and can't be restarted.

**Failed Phase**
This phase starts when a pod's containers are terminated with an error(i.e., with non-zero status) or if one or more containers are terminated in the case of a node failure.

**Unknown**
The unknown pod status typically denotes an issue with the Pod's connection to the host node.

## A diagram showcasing pod lifecycle

 <div className="centered-image">
   <img  src="https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-22-kubecti-restart-pod/diagram.png"  alt="kubectl restart pod" />
</div>

<br/>


**Diagram Reference:** https://millionvisit.blogspot.com/2021/03/kubernetes-for-developers-9-Kubernetes-Pod-Lifecycle.html



## Methods to Restart a Pod
### Using kubectl delete pod method
You can remove a pod from your node by use of the `kubectl delete pod [NAME_OF_POD]` command and get the deployment or replica set to build a new one on an updated configuration. This method is very simple but can interrupt the application for a short period of time since your Pod does not appear until you create a new one. In order to use this method and execute this command, you must know your Pod's name.

For Example, if we have a pod with the name '**my-demo-pod**', we can run the following command to delete it:

`kubectl delete pod my-demo-pod`


 <div className="centered-image">
   <img  src="https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-22-kubecti-restart-pod/delete-pod.png"  alt="kubectl restart pod" />
</div>

<br/>

## Employing the rolling restart technique with deployments
When deploying, using a rolling restart method, you can automatically update the deployment when required so that old pods are replaced with new ones without having an impact on the availability of your application. It is less disruptive than the removal of a pod, but it may take longer. You need to replace the deployment name of the deployment that manages the Pod in the command below:

`kubectl rollout restart deployment/[NAME_OF_DEPLOYMENT]`

For Example, we have a deployment with the name '**my-demo-deployment**'. To apply the rolling restart method on our deployment by using kubectl, we can run the following command:

`kubectl rollout restart deployment/my-demo-deployment`



<div className="centered-image">
   <img  src="https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-22-kubecti-restart-pod/restart-techniqu.png"  alt="kubectl restart pod" />
</div>

<br/>

## Safety Measures & Best Practices
### Ensuring zero-downtime during pod restarts
Use a Deployment that utilizes Replica Sets to manage your Pods and perform periodic updates while restarting them so that they don't interrupt service or lose requests. In order to maintain the minimum number of available pods, a rolling update shall gradually replace old ones with new ones.

To trigger a rolling update to your deployment or replica set, you can use the `kubectl rollout restart` command. To help the kubelet determine when a pod is ready to serve traffic or needs to be restarted, you can configure readiness and liveness probes for your pods.

**Readiness Probes:** Determines whether a Pod is prepared to handle traffic. A Pod won't receive traffic from Services if it isn't ready.

**Liveness Probes:** This makes sure if the Pod is running successfully or not. The Pod is restarted by Kubernetes if the probe fails.

### Monitoring and logging during restarts
Monitoring and logging are of paramount importance for pod performance and behavior assessment during restarts on Kubernetes. Details on pod activity can be obtained from the use of kubectl commands such as `kubectl describe` or `kubectl logs`. 

Tools such as Prometheus come into play in the metrics collection, while Grafana has a crucial role in data visualization. Proactive alerts will identify unusual behavior in the Pod and enable swift action. Additionally, you may gather and store logs from your pods—such as application, container, or system logs—using Fluentd and Elasticsearch.

## Troubleshooting Common Issues 
### What to do if a pod doesn't restart
Sometimes, for some reason, such as a mistake in the configurations, a lack of resources, or a problem with the node(a machine that runs the Pod), the Pod may not start again after stopping. 

You can use the `kubectl describe pod [NAME_OF_POD]` command to track the exact reason for failure. For insight into pre-error activities, you can extract container logs with `kubectl logs`. You can also use the `kubectl restart pod` command to execute commands in a pod container if you want direct interaction.

## Understanding error messages and their remedies. 
If you have a pod that's in CrashLoopBackOff status, the container crashes multiple times, and Kubernetes stops restarting it. `kubectl describe pod` command can show you invalid arguments, lost files or permissions errors. You may need to edit and update the configuration of Pod to resolve the error.

The `kubectl logs` command allows you to find any runtime issues or exceptions that may have caused an abnormal pod container exit. Based on Logs, you may need to verify and update the code or environment variables if required. Using the `kubectl restart pod` command, you may check if the container in the Pod has the expected files, dependencies, and permissions. In this case, you may need to update the specification of Pod or rebuild the container image. 

Let's take an example of '**my-demo-pod**', which enters into the '**CrashLoopBackOff**' state as shown below:

<div className="centered-image">
   <img  src="https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-22-kubecti-restart-pod/error-message.png"  alt="kubectl restart pod" />
</div>

<br/>

In order to find out the reason behind the error above, we need to see the detailed output. For that purpose, we will execute the following command:

`kubectl describe pod my-demo-pod`

At the bottom of the output below, you'll see a section called '**Event**'. You're supposed to see messages about the container starting, then crashing, and the system trying to restart it in this section.

<div className="centered-image">
   <img  src="https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-22-kubecti-restart-pod/error2.png"  alt="kubectl restart pod" />
</div>

<br/>

## Additional Tools & Plugins for Effective Management 
Kubernetes pod management can be challenging due to the fact that you have to move between different clusters and namespaces. Luckily, you can use some other tools and plugins to help with this task. 

The Kubectx tool is designed to speed up switching between clusters. With simple commands, you will be able to add, rename, remove and change contexts. To choose a context by typing several characters, you will also have the possibility of using interactive mode with fzf(general-purpose command-line fuzzy finder). 

You can easily switch between namespaces with the Kubens tool. The namespaces can be defined, created, deleted or changed with easy commands. If you need to select a namespace by inserting several characters, the interactive mode can also be used with fzf.

## Conclusion & Further Reading 
### Summing up the importance and techniques of restarting pods
In order to achieve optimal performance for applications resulting from configuration changes, updates or troubleshooting, the Pod should be restarted in Kubernetes. We've been discussing direct pod deletion and rolling restart methods, highlighting their particular uses and impacts.

## Pointing readers to advanced topics or resources
Beyond the basics of pod administration, Kubernetes gives you a wide range of possibilities. Check out Google Docs for Kubernetes and explore tools such as Kubectx and Kubens to get more detailed information. For a richer understanding, embrace hands-on experience and resources from the community.


**Author: <a  target="_blank" href="https://refine.dev/blog/author/muhammad_khabbab/">Muhammad Khabbab</a>**