<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rakesh Jain</title>
    <description>The latest articles on DEV Community by Rakesh Jain (@rakeshrhcsss).</description>
    <link>https://dev.to/rakeshrhcsss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F445790%2F4bc9e66d-4563-4a3d-bc8f-4a252819dcc8.jpg</url>
      <title>DEV Community: Rakesh Jain</title>
      <link>https://dev.to/rakeshrhcsss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rakeshrhcsss"/>
    <language>en</language>
    <item>
      <title>Prometheus and AlertManager step by step configuration with blackbox exporter on Ubuntu 18.04</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Thu, 20 Aug 2020 12:04:18 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/prometheus-and-alertmanager-step-by-step-configuration-with-blackbox-exporter-on-ubuntu-18-04-1nk3</link>
      <guid>https://dev.to/rakeshrhcsss/prometheus-and-alertmanager-step-by-step-configuration-with-blackbox-exporter-on-ubuntu-18-04-1nk3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; is a monitoring tool designed for recording real-time metrics in a time-series database. It is an open-source software project, written in Go. The Prometheus metrics are collected using HTTP pulls, allowing for higher performance and scalability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For complete tutorial please follow the below link ..&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@rakeshjain_17559/prometheus-and-alertmanager-step-by-step-configuration-with-blackbox-exporter-on-ubuntu-18-04-f2b76f52f1ad"&gt;https://medium.com/@rakeshjain_17559/prometheus-and-alertmanager-step-by-step-configuration-with-blackbox-exporter-on-ubuntu-18-04-f2b76f52f1ad&lt;/a&gt;&lt;/p&gt;

</description>
      <category>prometheus</category>
      <category>devops</category>
      <category>linux</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Real Life Cron Examples</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Thu, 20 Aug 2020 12:01:11 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/real-life-cron-examples-5125</link>
      <guid>https://dev.to/rakeshrhcsss/real-life-cron-examples-5125</guid>
      <description>&lt;p&gt;This tutorial is about How to write a crontab schedule expression for diff scenarios ..&lt;/p&gt;

&lt;p&gt;Go through the following tutorial for more details ..&lt;br&gt;
&lt;a href="https://medium.com/@rakeshjain_17559/cron-examples-4233b873e5f9"&gt;https://medium.com/@rakeshjain_17559/cron-examples-4233b873e5f9&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cron</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes hands on series - Upgrading Production Kubernetes cluster created with kubeadm</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Thu, 20 Aug 2020 11:58:34 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/kubernetes-hands-on-series-upgrading-production-kubernetes-cluster-created-with-kubeadm-47c</link>
      <guid>https://dev.to/rakeshrhcsss/kubernetes-hands-on-series-upgrading-production-kubernetes-cluster-created-with-kubeadm-47c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--62K_sqDn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fy3h3l1vadeurpiv6m50.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--62K_sqDn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fy3h3l1vadeurpiv6m50.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This tutorial will explain how we can upgrade a Kubernetes cluster created with kubeadm from version 1.17.x to version 1.18.x or from version 1.18.x to 1.18.y (where y &amp;gt; x).``&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Please go through the link below for full tutorial ..&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@rakeshjain_17559/kubernetes-hands-on-series-upgrading-production-kubernetes-cluster-created-with-kubeadm-6340821bc92"&gt;https://medium.com/@rakeshjain_17559/kubernetes-hands-on-series-upgrading-production-kubernetes-cluster-created-with-kubeadm-6340821bc92&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>linux</category>
      <category>cloud</category>
    </item>
    <item>
      <title>The Best and Safest way to clean up boot partition-Ubuntu 14.04/16.04/18.04 LTS</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Tue, 11 Aug 2020 09:11:04 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/the-best-and-safest-way-to-clean-up-boot-partition-ubuntu-14-04-16-04-18-04-lts-jo0</link>
      <guid>https://dev.to/rakeshrhcsss/the-best-and-safest-way-to-clean-up-boot-partition-ubuntu-14-04-16-04-18-04-lts-jo0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YrZgdr1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uh8tauaak0k5sam1u5ga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YrZgdr1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uh8tauaak0k5sam1u5ga.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;When you have apt working and boot partition has some space left :&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Check the current kernel version&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;$ uname -r&lt;br&gt;
3.19.0-64-generic&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Remove the OLD kernels&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
List the old kernel (it wont include the current kernel)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;You will get the list of images something like below:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;linux-image-3.19.0-25-generic&lt;br&gt;
linux-image-3.19.0-56-generic&lt;br&gt;
linux-image-3.19.0-58-generic&lt;br&gt;
linux-image-3.19.0-59-generic&lt;br&gt;
linux-image-3.19.0-61-generic&lt;br&gt;
linux-image-3.19.0-65-generic&lt;br&gt;
linux-image-extra-3.19.0-25-generic&lt;br&gt;
linux-image-extra-3.19.0-56-generic&lt;br&gt;
linux-image-extra-3.19.0-58-generic&lt;br&gt;
linux-image-extra-3.19.0-59-generic&lt;br&gt;
linux-image-extra-3.19.0-61-generic&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Now its time to remove old kernel one by one as&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;$sudo apt-get purge linux-image-3.19.0-25-generic&lt;br&gt;
$ sudo apt-get purge linux-image-3.19.0-56-generic&lt;br&gt;
$ sudo apt-get purge linux-image-3.19.0-58-generic&lt;br&gt;
$ sudo apt-get purge linux-image-3.19.0-59-generic&lt;br&gt;
$ sudo apt-get purge linux-image-3.19.0-61-generic&lt;br&gt;
$ sudo apt-get purge linux-image-3.19.0-65-generic&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;When you’re done removing the older kernels, you can run this to remove ever packages you won’t need anymore:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;$sudo apt-get autoremove&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;And finally you can run this to update grub kernel list:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;$sudo update-grub&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;When boot partition has zero space left and apt not working:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Get the list of kernel images (it wont include the current kernel)&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Get the list of kernel images and determine what you can do without. &lt;/p&gt;

&lt;p&gt;This command will show installed kernels except the currently running one&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;$sudo dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v&lt;/code&gt;uname -r&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You will get the list of images something like below:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;linux-image-3.19.0-25-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-3.19.0-56-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-3.19.0-58-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-3.19.0-59-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-3.19.0-61-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-3.19.0-65-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-extra-3.19.0-25-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-extra-3.19.0-56-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-extra-3.19.0-58-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-extra-3.19.0-59-generic&lt;/code&gt;&lt;br&gt;
&lt;code&gt;linux-image-extra-3.19.0-61-generic&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Prepare for old kernel delete&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Craft a command to delete all files in /boot for kernels that don’t matter to you using brace expansion to keep you sane. Remember to exclude the current and two newest kernel images. From above Example, it’s&lt;br&gt;
&lt;code&gt;$sudo rm -rf /boot/*-3.19.0-{25,56,58,59,61,65}-*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Clean up apt for old partial installs&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo apt-get -f install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Run Autoremove to clear old images&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Finally, autoremove to clear out the old kernel image packages that have been orphaned by the manual boot clean.&lt;br&gt;
&lt;code&gt;$sudo apt-get autoremove&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Update Grub&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;$sudo update-grub&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you can update and install packages&lt;br&gt;
&lt;code&gt;sudo apt-get update&lt;br&gt;
sudo apt-get install lshw -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;For an all in one try this:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v uname -r | while read -r line; do sudo apt-get -y purge $line;done;sudo apt-get autoremove; sudo update-grub; apt-get update; apt-get install lshw -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ref:&lt;a href="https://help.ubuntu.com/community/RemoveOldKernels#Configure_Unattended_Upgrades_to_Remove_Unneeded_Kernels_Automatically"&gt;https://help.ubuntu.com/community/RemoveOldKernels#Configure_Unattended_Upgrades_to_Remove_Unneeded_Kernels_Automatically&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Hope you like the tutorial. Please like &amp;amp; share and let me know your feedback in the response section.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Happy Learning!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes kubectl Tips and Tricks you must know</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Sun, 09 Aug 2020 04:24:03 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/kubernetes-kubectl-tips-and-tricks-you-must-know-2i8a</link>
      <guid>https://dev.to/rakeshrhcsss/kubernetes-kubectl-tips-and-tricks-you-must-know-2i8a</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1fQLrFo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cn4thptcae6aghyrg2jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1fQLrFo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cn4thptcae6aghyrg2jj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we know that kubectl is a powerful tool which we use every day. It has broad functionality.&lt;/p&gt;

&lt;p&gt;Which kubectl tip or tricks, you found out and said wish I knew it before.&lt;/p&gt;

&lt;p&gt;I will start with my experience wish I would have known earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before we begin, familiarize yourself with the following command parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;--dry-run :&lt;/strong&gt; By default, as soon as this is executed, the resource will be created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;--dry-run=client :&lt;/strong&gt; This will NOT create the resource. Instead, kubernetes will tell you if it is possible to summon the object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-o yaml :&lt;/strong&gt; This will output the resource definition file in a YAML format on the screen.&lt;/p&gt;

&lt;p&gt;Use the last two in combination to conveniently generate a resource definition file. Later, you can modify it as required, instead of writing the file from scratch.&lt;/p&gt;

&lt;p&gt;For example, the following generates a POD manifest file:&lt;br&gt;
&lt;strong&gt;kubectl run nginx --image=nginx --dry-run=client -o yaml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s look at more imperative commands for generating PODs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an NGINX Pod:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl run nginx --image=nginx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate a POD manifest YAML file:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl run nginx --image=nginx --dry-run=client -o yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;As a reminder, the -o yaml parameter tells kubectl to output a yaml file, while — dry-run instructs kubernetes to NOT create the POD.&lt;/p&gt;

&lt;p&gt;Let’s now learn about deployment related imperative commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment Commands&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;To create a deployment from the command line:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl create deployment --image=nginx nginx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate a deployment YAML file template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl create deployment --image=nginx nginx --dry-run=client -o yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;kubectl create deployment does not have a — replicas option. &lt;/p&gt;

&lt;p&gt;Having said that, if you wish to scale the deployment, you would have to first create it and then scale it using the kubectl scale command.&lt;/p&gt;

&lt;p&gt;The following command will create a deployment YAML definition file with the name “nginx-deployment.yaml”:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl create deployment --image=nginx nginx --dry-run=client -o yaml &amp;gt; nginx-deployment.yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Again, the -o parameter tells kubectl to output a yaml file, while the &amp;gt; nginx-deployment.yaml argument provides kubectl with the desired output file name.&lt;br&gt;
You can then modify the YAML file to your needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services Commands&lt;/strong&gt;&lt;br&gt;
The following command creates a service named “redis-service” of type ClusterIP, with the purpose of exposing the redis pod on port 6379.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl expose pod redis --port=6379 --name redis-service --dry-run=client -o yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This will automatically use the POD’s labels as selectors&lt;br&gt;
&lt;strong&gt;Alternative:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl create service clusterip redis --tcp=6379:6379 --dry-run=client -o yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;The above command will not use the POD’s labels as selectors, instead it will assume selectors as app=redis. You cannot pass in selectors as an option. Alternatively, generate the file and modify the selectors before creating the service.&lt;/p&gt;

&lt;p&gt;The following command creates a service named nginx of type NodePort to expose the nginx pod’s port 80 on port 30080 on the nodes:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl expose pod nginx --port=80 --name nginx-service --type=NodePort --dry-run=client -o yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This will automatically use the pod’s labels as selectors, but you cannot specify the node port. You have to generate a definition file and then add the node port in manually before creating the service with the pod.&lt;br&gt;
Or&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$kubectl create service nodeport nginx --tcp=80:80 --node-port=30080 --dry-run=client -o yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;This will not use the pod’s labels as selectors.&lt;br&gt;
The last couple commands have their own challenges: One cannot accept a selector, the other cannot accept a node port. In my opinion, I recommend going with the kubectl expose command.&lt;/p&gt;

&lt;p&gt;If you need to specify a node port, generate a definition file using the same command and manually input the nodeport before creating the service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hope you like the tutorial. Please like and share:) if you like it and let me know your feedback in the response section.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Happy Learning!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cloud</category>
      <category>linux</category>
    </item>
    <item>
      <title>Kubernetes hands on series: Pods</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Sat, 08 Aug 2020 04:47:16 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/kubernetes-hands-on-series-pods-2an3</link>
      <guid>https://dev.to/rakeshrhcsss/kubernetes-hands-on-series-pods-2an3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Pods&lt;/strong&gt; are the smallest deployable units of computing that you can create and manage in Kubernetes.&lt;br&gt;
A pod is a collection of containers and its storage inside a node of a Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single Container Pod --&amp;gt;&lt;/strong&gt;&lt;br&gt;
They can be simply created with the kubectl run command, where you have a defined image on the Docker registry which we will pull while creating a pod.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1: Creating Pod from command line with kubectl --&amp;gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;$kubectl run "name of pod" --image="name of the image from registry"&lt;/p&gt;

&lt;p&gt;$kubectl run myapache --image httpd --port=80&lt;/p&gt;

&lt;p&gt;$kubectl get pods -w&lt;br&gt;
NAME             READY   STATUS              RESTARTS   AGE&lt;br&gt;
myapache         0/1     ContainerCreating   0          2s&lt;br&gt;
myapache         1/1     Running             0          13s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$kubectl describe pods myapache&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Name:         myapache&lt;/strong&gt;&lt;br&gt;
Namespace:    default&lt;br&gt;
Priority:     0&lt;br&gt;
Node:         kworker-rj2/172.42.42.202&lt;br&gt;
Start Time:   Fri, 07 Aug 2020 08:06:31 +0000&lt;br&gt;
Labels:       run=myapache&lt;br&gt;
Annotations:  cni.projectcalico.org/podIP: 172.16.213.204/32&lt;br&gt;
cni.projectcalico.org/podIPs: 172.16.213.204/32&lt;br&gt;
&lt;strong&gt;Status:       Running&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;IP:           172.16.213.204&lt;/strong&gt;&lt;br&gt;
IPs:&lt;br&gt;
IP:  172.16.213.204&lt;br&gt;
&lt;strong&gt;Containers:&lt;/strong&gt;&lt;br&gt;
myapache:&lt;br&gt;
Container ID:   docker://f2d794c10236e2470612aa8530158ec8ad51d487bed90c415f7c94768d343f81&lt;br&gt;
Image:          httpd&lt;br&gt;
Image ID:       docker-pullable://httpd@sha256:3cbdff4bc16681541885ccf1524a532afa28d2a6578ab7c2d5154a7abc182379&lt;br&gt;
Port:           80/TCP&lt;br&gt;
Host Port:      0/TCP&lt;br&gt;
State:          Running&lt;br&gt;
Started:      Fri, 07 Aug 2020 08:06:43 +0000&lt;br&gt;
Ready:          True&lt;br&gt;
Restart Count:  0&lt;br&gt;
Environment:    &lt;br&gt;
Mounts:&lt;br&gt;
/var/run/secrets/kubernetes.io/serviceaccount from default-token-sdv2m (ro)&lt;br&gt;
Conditions:&lt;br&gt;
Type              Status&lt;br&gt;
Initialized       True&lt;br&gt;
Ready             True&lt;br&gt;
ContainersReady   True&lt;br&gt;
PodScheduled      True&lt;br&gt;
Volumes:&lt;br&gt;
default-token-sdv2m:&lt;br&gt;
Type:        Secret (a volume populated by a Secret)&lt;br&gt;
SecretName:  default-token-sdv2m&lt;br&gt;
Optional:    false&lt;br&gt;
QoS Class:       BestEffort&lt;br&gt;
Node-Selectors:  &lt;br&gt;
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s&lt;br&gt;
node.kubernetes.io/unreachable:NoExecute for 300s&lt;br&gt;
Events:&lt;br&gt;
Type    Reason     Age   From                  Message&lt;/p&gt;




&lt;p&gt;Normal  Scheduled  23s   default-scheduler     Successfully assigned&lt;br&gt;
default/myapache to kworker-rj2&lt;br&gt;
Normal  Pulling    21s   kubelet, kworker-rj2  Pulling image "httpd"&lt;br&gt;
Normal  Pulled     12s   kubelet, kworker-rj2  Successfully pulled image "httpd"&lt;br&gt;
Normal  Created    11s   kubelet, kworker-rj2  Created container myapache&lt;br&gt;
Normal  Started    10s   kubelet, kworker-rj2  Started container myapache&lt;/p&gt;

&lt;p&gt;This can also be done by creating the yaml file and then running the kubectl create command. But before lets understand what a Kubernetes resource yaml file means.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: Creating Pod from a yaml file --&amp;gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Understanding resource yaml file --&amp;gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the .yaml file for the Kubernetes object you want to create, you'll need to set values for the following fields:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;apiVersion&lt;/strong&gt; - Which version of the Kubernetes API you're using to create this object&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;kind&lt;/strong&gt; - What kind of object you want to create&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;metadata&lt;/strong&gt; - Data that helps uniquely identify the object, including a name string, UID, and optional namespace and Labels&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;spec&lt;/strong&gt; - What state you desire for the object&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xxk_3T9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ddsawf63o1rtv0s291sv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xxk_3T9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ddsawf63o1rtv0s291sv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the above yaml file is created, we will save the file with the name of apache.yml and run the create command to run the document.&lt;br&gt;
$kubectl create –f apache.yml&lt;/p&gt;

&lt;p&gt;It will create a pod with the name of apache. We can use the describe command along with kubectl to describe the pod as we have done that above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to go inside a container within a pod --&amp;gt;&lt;/strong&gt;&lt;br&gt;
Here we will learn how can we go inside a running container of a Pod.&lt;/p&gt;

&lt;p&gt;We have deployed an apache container and its IP is 172.16.213.204.&lt;br&gt;
Lets curl the container IP first and see the output.&lt;br&gt;
$curl 172.16.213.204:80&lt;br&gt;
It works!&lt;/p&gt;

&lt;p&gt;Now go inside this container and change the index file content and exit from the container. And test again with curl.&lt;/p&gt;

&lt;p&gt;$kubectl -it exec myapache -- bash&lt;br&gt;
root@myapache:/usr/local/apache2# echo “Hello from myapache port” &amp;gt; htdocs/index.html&lt;br&gt;
root@myapache:/usr/local/apache2# exit&lt;br&gt;
curl 172.16.213.204:80&lt;br&gt;
Hello from myapache port&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi Container Pod --&amp;gt;&lt;/strong&gt;&lt;br&gt;
Multi container pods are created using yaml file with the definition of the containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjTc2SwQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1p2skdyi9pq9oruzhxb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjTc2SwQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1p2skdyi9pq9oruzhxb7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pod Phases --&amp;gt;&lt;/strong&gt;&lt;br&gt;
Here are the possible values for phase:&lt;br&gt;
&lt;strong&gt;Pending:&lt;/strong&gt; The Pod has been accepted by the Kubernetes cluster, but one or more of the containers has not been set up and made ready to run. This includes time a Pod spends waiting to be scheduled as well as the time spent downloading container images over the network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running:&lt;/strong&gt; The Pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Succeeded:&lt;/strong&gt; All containers in the Pod have terminated in success, and will not be restarted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failed:&lt;/strong&gt; All containers in the Pod have terminated, and at least one container has terminated in failure. That is, the container either exited with non-zero status or was terminated by the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unknown:&lt;/strong&gt; For some reason the state of the Pod could not be obtained. This phase typically occurs due to an error in communicating with the node where the Pod should be running.&lt;br&gt;
If a node dies or is disconnected from the rest of the cluster, Kubernetes applies a policy for setting the phase of all Pods on the lost node to Failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Container restart policy --&amp;gt;&lt;/strong&gt;&lt;br&gt;
The spec of a Pod has a restartPolicy field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Possible values -&amp;gt;&lt;/strong&gt; Always, OnFailure, and Never. The default value is Always.&lt;/p&gt;

&lt;p&gt;The restartPolicy applies to all containers in the Pod. restartPolicy only refers to restarts of the containers by the kubelet on the same node. After containers in a Pod exit, the kubelet restarts them with an exponential back-off delay (10s, 20s, 40s, …), that is capped at five minutes. Once a container has executed with no problems for 10 minutes without any problems, the kubelet resets the restart backoff timer for that container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Container imagePullPolicy policy --&amp;gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;imagePullPolicy: IfNotPresent:&lt;/strong&gt; the image is pulled only if it is not already present locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;imagePullPolicy: Always:&lt;/strong&gt; every time the kubelet launches a container, the kubelet queries the container image registry to resolve the name to an image digest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;imagePullPolicy: Never:&lt;/strong&gt; the image is assumed to exist locally. No attempt is made to pull the image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forced Pod termination --&amp;gt;&lt;/strong&gt;&lt;br&gt;
You must specify an additional flag --force along with --grace-period=0 in order to perform force deletions.&lt;/p&gt;

&lt;p&gt;$kubectl delete pods myapache --force --grace-period=0&lt;br&gt;
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.&lt;br&gt;
pod "myapache" force deleted&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hope you like the tutorial. Please like and share:) if you like it and let me know your feedback in the response section.&lt;br&gt;
Happy Learning!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cloud</category>
      <category>linux</category>
    </item>
    <item>
      <title>Production Ready Kubernetes Cluster Deployment on Ubuntu
</title>
      <dc:creator>Rakesh Jain</dc:creator>
      <pubDate>Mon, 03 Aug 2020 06:47:21 +0000</pubDate>
      <link>https://dev.to/rakeshrhcsss/production-ready-kubernetes-cluster-deployment-on-ubuntu-1pjj</link>
      <guid>https://dev.to/rakeshrhcsss/production-ready-kubernetes-cluster-deployment-on-ubuntu-1pjj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nLhZSWK2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bgan6vudo1yr00hj647c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nLhZSWK2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bgan6vudo1yr00hj647c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Min HW requirement -&lt;/strong&gt;&lt;br&gt;
Master — 2GB RAM, 2vCPU’s, min 1GBPS nw&lt;br&gt;
Nodes — 1GB RAM, 2vCPU’s, min 1GBPS nw&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SW requirement -&lt;/strong&gt;&lt;br&gt;
Docker or any container mgmt systems should be installed.&lt;br&gt;
kubelet service should be running on each node.&lt;/p&gt;

&lt;p&gt;We have 3 Ubuntu 18.04 systems running with following configuration -&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes Master Node -&amp;gt;&lt;/strong&gt;&lt;br&gt;
172.42.42.200 kmaster-rj.example.com/kmaster-rj&lt;br&gt;
4 GB RAM, 2 vCPU’s, 64 GB HDD&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes Worker Nodes -&amp;gt;&lt;/strong&gt;&lt;br&gt;
172.42.42.201 kworker-rj1.example.com/kworker-rj1&lt;br&gt;
2 GB RAM, 2 vCPU’s, 64 GB HDD&lt;br&gt;
172.42.42.202 kworker-rj2.example.com/kworker-rj2&lt;br&gt;
2 GB RAM, 2 vCPU’s, 64 GB HDD&lt;br&gt;
Note: You can use any number of worker nodes with a single master node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation -&amp;gt;&lt;/strong&gt;&lt;br&gt;
Install the following software packages on all 3 servers;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install and enable Docker&lt;/strong&gt;&lt;br&gt;
apt-get update&lt;br&gt;
apt install docker.io&lt;br&gt;
systemctl enable docker&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add the Kubernetes gpg key&lt;/strong&gt;&lt;br&gt;
apt install curl &amp;amp;&amp;amp; curl -s &lt;a href="https://packages.cloud.google.com/apt/doc/apt-key.gpg"&gt;https://packages.cloud.google.com/apt/doc/apt-key.gpg&lt;/a&gt; | sudo apt-key add&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add the Xenial Kubernetes repository&lt;/strong&gt;&lt;br&gt;
apt-add-repository "deb &lt;a href="http://apt.kubernetes.io/"&gt;http://apt.kubernetes.io/&lt;/a&gt; kubernetes-xenial main"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install kubeadm&lt;/strong&gt;&lt;br&gt;
apt install kubeadm&lt;br&gt;
kubeadm version&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes Deployment --&amp;gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disable swap -&lt;/strong&gt;&lt;br&gt;
If you run nodes with (traditional to-disk) swap, you lose a lot of the isolation properties that make sharing machines viable. You have no predictability around performance or latency or IO. So its recommended to off the swap.&lt;br&gt;
swapoff -a &amp;amp;&amp;amp; sed -i ‘/ swap / s/^/#/’ /etc/fstab&lt;br&gt;
Kubernetes Cluster Initialization (On Master)-&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1 of deployment (from command line)-&amp;gt;&lt;/strong&gt;&lt;br&gt;
Initialize the cluster, also by passing a flag that is later needed for the networking plugin (CNI).&lt;/p&gt;

&lt;p&gt;kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr=172.16.213.0/24&lt;/p&gt;

&lt;p&gt;Note: If 172.16.213.0/24 is already in use within your network you must select a different pod network CIDR, replacing 172.16.213.0/24 in the above command as well as in any manifests applied below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2 of deployment (using config file)-&amp;gt;&lt;/strong&gt;&lt;br&gt;
You can initialize the cluster by passing the kubeadm-config.yaml file with specific values as given below&lt;br&gt;
&lt;a href="https://github.com/TroubleshooteRJ/kubernetes-demo/blob/master/kubeadm-config.yaml"&gt;https://github.com/TroubleshooteRJ/kubernetes-demo/blob/master/kubeadm-config.yaml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yfzpXJKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6db5i0vvokwcnqeyn0kk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yfzpXJKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6db5i0vvokwcnqeyn0kk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can change the kubernetesVersion, external IP addresses and domain names you would use to connect to the Kubernetes API server, Pod CIDR and Service CIDR based on your networking requirements etc.&lt;/p&gt;

&lt;p&gt;You can init the master with the following command.&lt;/p&gt;

&lt;p&gt;curl &lt;a href="https://github.com/TroubleshooteRJ/kubernetes-demo/blob/master/kubeadm-config.yaml"&gt;https://github.com/TroubleshooteRJ/kubernetes-demo/blob/master/kubeadm-config.yaml&lt;/a&gt; -o kubeadm-config.yaml# update the file as necessary and then run belowkubeadm init --config kubeadm-config.yaml&lt;/p&gt;

&lt;p&gt;This will output a join command. Save this command somewhere as this will later be used to connect worker nodes to the master.&lt;/p&gt;

&lt;p&gt;Configure kubectl as it lets you connect to the cluster from the master (The command for this step is given in the output of the previous command).&lt;/p&gt;

&lt;p&gt;mkdir -p $HOME/.kube&lt;br&gt;
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br&gt;
sudo chown $(id -u):$(id -g) $HOME/.kube/config&lt;/p&gt;

&lt;p&gt;Type the below command to check if kubectl is working (The status will be ‘NotReady’ as we haven’t set up our networking yet. )&lt;br&gt;
kubectl get nodes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now let’s deploy a Pod Network through the Master Node.&lt;br&gt;
Here we will use Calico as the network of choice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install the Calico Networking Plugin&lt;/strong&gt; in the Cluster (This will handle networking between different pods and nodes).This can be done by applying a yaml file that describes the objects needed to create in the cluster.&lt;/p&gt;

&lt;p&gt;kubectl apply -f &lt;a href="https://docs.projectcalico.org/manifests/calico.yaml"&gt;https://docs.projectcalico.org/manifests/calico.yaml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kQzxDZSd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/anxmjje346iiqht71625.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kQzxDZSd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/anxmjje346iiqht71625.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait until each pod has the STATUS of Running.&lt;br&gt;
Confirm that all of the pods are running with the following command.&lt;/p&gt;

&lt;p&gt;kubectl get pods --all-namespaces -w&lt;/p&gt;

&lt;p&gt;Now check if kubectl is working (The status should be ‘Ready’ now ).&lt;br&gt;
kubectl get nodes -o wide&lt;/p&gt;

&lt;p&gt;Now let’s add the Worker nodes to the Network in order to form a Cluster.&lt;br&gt;
The kubeadm init command that you ran previously on the master should output a kubeadm join command containing a token and hash. If you have copied that command from the master and saved it somewhere, run it on both worker nodes with sudo to connect them to the master.&lt;/p&gt;

&lt;p&gt;kubeadm join 172.42.42.200:6443 --token bl4tmf.p5vld9mlo3zbqy66&lt;br&gt;
--discovery-token-ca-cert-hash sha256:2aba01741a419a17d257b60f4aa2ae7b13185056a24986669347bfbcf9f6ecbe&lt;/p&gt;

&lt;p&gt;Now check if the 2 worker nodes are connected (on master).&lt;br&gt;
sudo kubectl get nodes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iJsJ-FZ_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nlk7t123invdg9vz98bx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iJsJ-FZ_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nlk7t123invdg9vz98bx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure all 3 of your nodes are listed with the above command and have a status of ‘Ready’.&lt;/p&gt;

&lt;p&gt;With the following command you can see some of back-end system pods that are fully up and running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mH9wuwu9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z391ekr73ttxj2tmafll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mH9wuwu9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z391ekr73ttxj2tmafll.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now we have a Kubernetes cluster fully up and running on Ubuntu!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hope you like the tutorial. Let me know your feedback in the response section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Learning!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>ubuntu</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
