{"id":28,"date":"2026-03-24T10:05:51","date_gmt":"2026-03-24T10:05:51","guid":{"rendered":"https:\/\/blog.ngocha.biz\/?p=28"},"modified":"2026-03-24T10:05:51","modified_gmt":"2026-03-24T10:05:51","slug":"how-to-setup-kubernetes-cluster-on-vagrant-vms","status":"publish","type":"post","link":"https:\/\/blog.ngocha.biz\/?p=28","title":{"rendered":"How to Setup Kubernetes Cluster on Vagrant VMs"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1160\" height=\"680\" src=\"https:\/\/blog.ngocha.biz\/wp-content\/uploads\/2026\/03\/vagrant-kubernetes.webp\" alt=\"\" class=\"wp-image-29\" srcset=\"https:\/\/blog.ngocha.biz\/wp-content\/uploads\/2026\/03\/vagrant-kubernetes.webp 1160w, https:\/\/blog.ngocha.biz\/wp-content\/uploads\/2026\/03\/vagrant-kubernetes-300x176.webp 300w, https:\/\/blog.ngocha.biz\/wp-content\/uploads\/2026\/03\/vagrant-kubernetes-1024x600.webp 1024w, https:\/\/blog.ngocha.biz\/wp-content\/uploads\/2026\/03\/vagrant-kubernetes-768x450.webp 768w\" sizes=\"auto, (max-width: 1160px) 100vw, 1160px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In this&nbsp;<a href=\"https:\/\/devopscube.com\/kubernetes-tutorials-beginners\/\">Kubernetes tutorial<\/a>, I have covered the step-by-step guide to set up the Kubernetes cluster on Vagrant. It is a multinode kubernetes setup using&nbsp;<a href=\"https:\/\/github.com\/kubernetes\/kubeadm?ref=devopscube.com\" rel=\"noreferrer noopener\" target=\"_blank\">kubeadm<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vagrant is a great utility to set up Virtual machines on your local workstation. I pretty much use Vagrant for most of my testing and learning purposes. If you are new to Vagrant, see my&nbsp;<a href=\"https:\/\/devopscube.com\/vagrant-tutorial-beginners\/\">beginners vagrant guide<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide primarily focuses on the Kubernetes automated setup using Vagrantfile and shell scripts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"automated-kubernetes-cluster-setup-on-vagrant\">Automated Kubernetes Cluster Setup on Vagrant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I have written a basic Vagrantfile and scripts so that anyone can understand and make changes as per their requirements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the summary of the setup.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A single vagrant up command will create three VMs and configures all essential kubernetes components and configuration using Kubeadm.<\/li>\n\n\n\n<li>Calico Network Plugin, Metrics server, and Kubernetes dashboard get installed as part of the setup.<\/li>\n\n\n\n<li>The kubeconfig file gets added to all the nodes in the cluster so that you can execute kubectl commands from any node.<\/li>\n\n\n\n<li>The kubeconfig file and the kubernetes dashboard access token get added to the configs folder where you have the Vagrantfile. You can use the kubeconfig file to connect the cluster from your workstation.<\/li>\n\n\n\n<li>You can shut down the VMs when not in use and start them again whenever needed. All the cluster configurations remain intact without any issues. The nodes get connected automatically to the master during the startup.<\/li>\n\n\n\n<li>You can delete all the VMs in one command and recreate the setup with a\u00a0<code>vagrant up<\/code>\u00a0command any time you need.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a high-level overview of the setup.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/vagrant-setup-1.gif\"><img decoding=\"async\" src=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/vagrant-setup-1.gif\" alt=\"\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ckackadcks-certification-practice-environment\">CKA\/CKAD\/CKS Certification Practice Environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you are preparing for any of the Kubernetes certifications, you need a cluster to practice all the exam scenarios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can use these Vagrant scripts to set up your local practice environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Specifically, for&nbsp;<a href=\"https:\/\/devopscube.com\/cka-exam-study-guide\/\">CKA Certification<\/a>, you can expect Kubeadm-related exam questions like bootstrapping and upgrading the kubernetes cluster using kubeadm. You can check out the following guides.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/devopscube.com\/setup-kubernetes-cluster-kubeadm\/\">Kubernetes cluster bootstrapping using Kubeadm<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/devopscube.com\/upgrade-kubernetes-cluster-kubeadm\/\">Upgrading Kubernetes cluster using kubeadm<\/a><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The&nbsp;<strong>setup script deploys the latest version<\/strong>&nbsp;of kubernetes that is required for Kubernetes certification exams.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important Note<\/strong>: If you are preparing for CKA\/CKAD\/CKS certification, make use of the&nbsp;<a href=\"https:\/\/devopscube.com\/kubernetes-certification-coupon\/\">CKA\/CKAD\/CKS Voucher Codes<\/a>&nbsp;before the price increases.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"kubernetes-kubeadm-vagrant-github-repository\">Kubernetes-Kubeadm Vagrant Github Repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Kubeadm Vagrantfile and scripts are hosted on the&nbsp;<a href=\"https:\/\/github.com\/techiescamp\/vagrant-kubeadm-kubernetes?ref=devopscube.com\" rel=\"noreferrer noopener\" target=\"_blank\">Vagrant Kubernetes Github repository<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clone the repository to follow along with the guide.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/techiescamp\/vagrant-kubeadm-kubernetes<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prerequisite-for-mac-users\">Prerequisite For MAC Users<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you have&nbsp;<strong>upgraded MAC to OS Monterey<\/strong>, you might face issues with Vagrant for creating private networks. This means Vagrant won&#8217;t be able to create a network other than the 198 series.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To resolve the issue, one&nbsp;<code>\/etc\/vbox\/networks.conf<\/code>&nbsp;and add the following.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>* 0.0.0.0\/0 ::\/0<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"setup-kubernetes-cluster-on-vagrant\">Setup Kubernetes Cluster on Vagrant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note: <\/strong>You need a minimum of 16 Gig RAM workstation to run this setup without any issues.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Follow the steps given below to spin up the cluster and validate all the&nbsp;<a href=\"https:\/\/devopscube.com\/kubernetes-cluster-configurations\/\">Kubernetes cluster configurations.<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 1:&nbsp;<\/strong>To create the cluster, first cd into the cloned directory.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd vagrant-kubeadm-kubernetes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 2:<\/strong>&nbsp;Execute the vagrant command. It will spin up three nodes. One control plane (master) and two worker nodes. Kubernetes installation and configuration happen through the shell script present in the scripts folder.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant up<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong>&nbsp;If you are running it for the first time, Vagrant will first download the ubuntu box mentioned in the Vagrantfile. This is a one-time download.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 3: Lo<\/strong>g in to the master node to verify the cluster configurations.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant ssh controlplane<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 4:<\/strong>&nbsp;List all the cluster nodes to ensure the worker nodes are connected to the master and in a ready state.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl top nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see the output as shown below.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-284.png\"><img decoding=\"async\" src=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-284.png\" alt=\"kubeadm vagrant check nodes\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 5:&nbsp;<\/strong>List all the pods in&nbsp;<code>kube-system<\/code>&nbsp;namespace and ensure it is in a running state.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get po -n kube-system<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-2-38.png\"><img decoding=\"async\" src=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-2-38.png\" alt=\"kubeadm vagrant verify kube-system pods\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 6:&nbsp;<\/strong>Deploy a sample Nginx app and see if you can access it over the nodePort.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/scriptcamp\/kubeadm-scripts\/main\/manifests\/sample-app.yaml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should be able to access Nginx on any of the node&#8217;s IPs on port&nbsp;<code>32000<\/code>. For example,&nbsp;<code>http:\/\/10.0.0.11:32000<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-3-43.png\"><img decoding=\"async\" src=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-3-43.png\" alt=\"kubeadm vagrant access application on nodeport.\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s it! You can start deploying and testing other applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To shut down the Kubernetes VMs, execute the halt command.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant halt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Whenever you need the cluster, just execute the following.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant up<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To destroy the VMs,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant destroy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong>&nbsp;If you want applications to persist data on each cluster or pod restart, make sure you use the persistent volume type &#8220;local&#8221; attached to a nodeSelector.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"access-kubernetes-cluster-from-workstation-terminal\">Access Kubernetes Cluster From Workstation Terminal<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once Vagrant execution is successful, you will see a&nbsp;<strong>configs folder with a few files (config, join.sh, and token)<\/strong>&nbsp;inside the cloned repo. These are generated during the run time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copy the config file to your<code>&nbsp;$HOME\/.kube<\/code>&nbsp;folder if you want to interact with the cluster from your workstation terminal. You should have kubectl installed on your workstation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, I did the following on my Mac keeping&nbsp;<code>vagrant-kubeadm-kubernetes<\/code>&nbsp;folder as the current directory.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p $HOME\/.kube\ncp configs\/config $HOME\/.kube<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, you can set a Kubeconfig env variable as shown below. Make sure you execute the command from the<code>&nbsp;vagrant-kubeadm-kubernetes<\/code>&nbsp;folder where you have the&nbsp;<code>Vagrantfile<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export KUBECONFIG=$(PWD)\/configs\/config<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once you copy the kubeconfig (config) file to your local&nbsp;<code>$HOME\/.kube<\/code>&nbsp;directory you can run the kubectl command against the cluster<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the config by listing the cluster nodes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To access the kubernetes dashboard, run kubectl proxy to access the Kubernetes dashboard.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl proxy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The&nbsp;<code>token<\/code>&nbsp;file inside the configs folder contains the sign-in token for the kubernetes dashboard. If you want to use the kubernetes dashboard, use the token and log in from the following URL<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8001\/api\/v1\/namespaces\/kubernetes-dashboard\/services\/https:kubernetes-dashboard:\/proxy\/#\/login<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-4-34.png\"><img decoding=\"async\" src=\"https:\/\/devopscube.com\/content\/images\/2025\/03\/image-4-34.png\" alt=\"Vagrant kubernetes dashboard.\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"kubeadm-vagrantfile-scripts-explanation\">Kubeadm Vagrantfile &amp; Scripts Explanation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the file tree for the Vagrant repo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u251c\u2500\u2500 Vagrantfile\n\u251c\u2500\u2500 configs\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 config\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 join.sh\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 token\n\u2514\u2500\u2500 scripts\n    \u251c\u2500\u2500 common.sh\n    \u251c\u2500\u2500 master.sh\n    \u2514\u2500\u2500 node.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The configs folder and files get generated only after the first run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As I explained earlier, the config file contains the config, token, and join.sh file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the previous section, I have already explained&nbsp;<code>config<\/code>&nbsp;and&nbsp;<code>token<\/code>. The&nbsp;<code>join.sh<\/code>&nbsp;file has the worker node join command with the token created during kubeadm master node initialization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Since all the nodes share the folder containing the Vagrantfile, the worker nodes can read the&nbsp;<code>join.sh<\/code>&nbsp;file and join the master automatically during the first run. It is a one-time task.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you log in to any node and access the&nbsp;<code>\/vagrant<\/code>&nbsp;folder, you will see Vagrantfile and scripts as it is shared between the VMs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s have a look at the Vagrantfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NUM_WORKER_NODES=2\nIP_NW=\"10.0.0.\"\nIP_START=10\n\nVagrant.configure(\"2\") do |config|\n  config.vm.provision \"shell\", env: {\"IP_NW\" =&gt; IP_NW, \"IP_START\" =&gt; IP_START}, inline: &lt;&lt;-SHELL\n      apt-get update -y\n      echo \"$IP_NW$((IP_START)) master-node\" &gt;&gt; \/etc\/hosts\n      echo \"$IP_NW$((IP_START+1)) worker-node01\" &gt;&gt; \/etc\/hosts\n      echo \"$IP_NW$((IP_START+2)) worker-node02\" &gt;&gt; \/etc\/hosts\n  SHELL\n\n  config.vm.box = \"bento\/ubuntu-22.04\"\n  config.vm.box_check_update = true\n\n  config.vm.define \"master\" do |master|\n    # master.vm.box = \"bento\/ubuntu-18.04\"\n    master.vm.hostname = \"master-node\"\n    master.vm.network \"private_network\", ip: IP_NW + \"#{IP_START}\"\n    master.vm.provider \"virtualbox\" do |vb|\n        vb.memory = 4048\n        vb.cpus = 2\n    end\n    master.vm.provision \"shell\", path: \"scripts\/common.sh\"\n    master.vm.provision \"shell\", path: \"scripts\/master.sh\"\n  end\n\n  (1..NUM_WORKER_NODES).each do |i|\n\n  config.vm.define \"node0#{i}\" do |node|\n    node.vm.hostname = \"worker-node0#{i}\"\n    node.vm.network \"private_network\", ip: IP_NW + \"#{IP_START + i}\"\n    node.vm.provider \"virtualbox\" do |vb|\n        vb.memory = 2048\n        vb.cpus = 1\n    end\n    node.vm.provision \"shell\", path: \"scripts\/common.sh\"\n    node.vm.provision \"shell\", path: \"scripts\/node.sh\"\n  end\n\n  end\nend <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see, I have added the following IPs for nodes, and it is added to the host&#8217;s file entry of all the nodes with its hostname with a common shell block that gets executed on all the VMs.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>10.0.0.10 (master)<\/li>\n\n\n\n<li>10.0.0.11 (node01)<\/li>\n\n\n\n<li>10.0.0.11 (node02)<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Also, the worker node block is in a loop. So if you want more than two worker nodes or have only one worker node, you need to replace&nbsp;<code>2<\/code>&nbsp;with the desired number in the loop declaration in the&nbsp;<code>NUM_WORKER_NODES<\/code>&nbsp;variable. If you add more nodes, ensure you add the IP to the host&#8217;s file entry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, for 3 worker nodes, you need to have,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NUM_WORKER_NODES=3<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mastersh-nodesh-and-commonsh-scripts\">master.sh, node.sh and common.sh Scripts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The three shell scripts get called as&nbsp;<code>provisioners<\/code>&nbsp;during the Vagrant run to configure the cluster.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>common.sh<\/strong>: &#8211; A self-explanatory list of commands which configures and installs specific version of cri-o runtime, kubeadm, kubectl, and kubelet on all the nodes. Also, disables swap.<\/li>\n\n\n\n<li><strong>master.sh<\/strong>: &#8211; contains commands to initialize master, install the calico plugin, metrics server, and kubernetes dashboard. Also, copies the\u00a0<strong>kube-config, join.sh, and token<\/strong>\u00a0files to the configs directory.<\/li>\n\n\n\n<li><strong>node.sh:-\u00a0<\/strong>reads the join.sh command from the configs shared folder and join the master node. Also, copied the kubeconfig file to<code>\u00a0\/home\/vagrant\/.kube<\/code>\u00a0location to execute kubectl commands.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><code>common.sh<\/code>&nbsp;installs kubernetes version&nbsp;<code>1.20.6-00<\/code>&nbsp;to have the same cluster version for CKA\/CKAD and CKS preparation. If you would like the latest version, remove the version number from the command.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"video-documentation-for-vagrant-setup\">Video Documentation For Vagrant Setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I have documented the whole process in a YouTube video. Check out the video if you want to see the live setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note<\/strong>: You might see a version change in the video as I update the document with latest versions. However, the process remains the same. Ensure you use the latest scripts from the Github repo.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/youtube.com\/watch?v=m5q7JEihdU4%3Ffeature%3Doembed\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It is good to have a Local kubernetes cluster setup that you can spin up and tear down whenever you need without spending much time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To set up the kubernetes cluster on Vagrant, all you have to do is, clone the repo and run the&nbsp;<strong><code>vagrant up<\/code><\/strong>&nbsp;command.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Moreover, if you are a&nbsp;<a href=\"https:\/\/devopscube.com\/become-devops-engineer\/\">DevOps engineer<\/a>&nbsp;and work on the Kubernetes cluster, you can have a production-like setup locally for development and testing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to have a simple single-node Kubernetes setup, you can try minikube. Here is a&nbsp;<a href=\"https:\/\/devopscube.com\/kubernetes-minikube-tutorial\/\">minikube tutorial for beginners<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can add more tools and utilities like&nbsp;<a href=\"https:\/\/devopscube.com\/install-configure-helm-kubernetes\/\">helm<\/a>,&nbsp;<a href=\"https:\/\/devopscube.com\/setup-ingress-kubernetes-nginx-controller\/\">ingress controller<\/a>,&nbsp;<a href=\"https:\/\/devopscube.com\/setup-prometheus-monitoring-on-kubernetes\/\">Prometheus<\/a>, etc to the existing script and customize it as per your requirements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Please feel free to contribute to the repo with enhancements!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this&nbsp;Kubernetes tutorial, I have covered the step-by-step guide to set up the Kubernetes cluster on Vagrant. It is a multinode kubernetes setup using&nbsp;kubeadm. Vagrant is a great utility to set up Virtual machines on your local workstation. I pretty much use Vagrant for most of my testing and learning purposes. If you are new [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-28","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=28"}],"version-history":[{"count":1,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/28\/revisions"}],"predecessor-version":[{"id":31,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/28\/revisions\/31"}],"wp:attachment":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}