{"id":197,"date":"2020-01-17T12:08:07","date_gmt":"2020-01-17T11:08:07","guid":{"rendered":"https:\/\/blog.nubisoft.pl\/?p=197"},"modified":"2020-02-01T16:38:55","modified_gmt":"2020-02-01T15:38:55","slug":"developers-be-kind-to-your-containers-its-easy-with-kubernetes-in-docker-stack","status":"publish","type":"post","link":"https:\/\/nubisoft.io\/blog\/developers-be-kind-to-your-containers-its-easy-with-kubernetes-in-docker-stack\/","title":{"rendered":"Developers, be KIND to your containers! It&#8217;s easy with Kubernetes IN Docker stack ;)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Here, at <a href=\"http:\/\/nubisoft.pl\">NubiSoft<\/a>, most of our CI\/CD processes are configured in the cloud (after all, the name of our company obliges to something). But sometimes it is useful to deploy locally e.g. for development purposes. Having solutions built around the Kubernetes ecosystem makes it relatively problematic \u2026at least until recently.<\/h2>\n\n\n\n<p>So in this post, we will demonstrate how to build configuration enabling deploying Kubernetes cluster locally. Previously there existed solutions like <a href=\"https:\/\/github.com\/kubernetes\/minikube\">Minikube<\/a> or <a href=\"https:\/\/github.com\/kubernetes-retired\/kubeadm-dind-cluster\">kubeadm-dind-cluster<\/a> trying to approach running Kubernetes cluster but they are limited to the extent that their practical usage (not only for learning purposes) was disputable. All the more I got excited after a speech at a conference last year where a completely new approach was presented, which is <a href=\"https:\/\/kind.sigs.k8s.io\/\">KIND<\/a>. The months have passed and I finally conclude that it is already mature enough to be implemented in our team.<\/p>\n\n\n\n<p> When it comes to computing resources, everything I show below is run on my laptop &#8211; DELL XPS 13 with 16GB RAM and i7 processor, but in a VirtualBox environment. This environment runs Ubuntu 18 (Bionic Beaver) and has 8GB of RAM and 4 CPUs allocated.  So let&#8217;s roll up our sleeves and get to work! <\/p>\n\n\n\n<p>First, we have to upgrade our Ubuntu Bionic OS.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt update\nsudo apt -y upgrade<\/pre>\n\n\n\n<p>As <a href=\"https:\/\/kubernetes.io\/\">Kubernetes <\/a>itself and <a href=\"https:\/\/github.com\/kubernetes-sigs\/kind\">KIND <\/a>are implemented in <a href=\"https:\/\/golang.org\/\">Golang<\/a>, we need to install the Go platform first. At the time of writing this post, the minimum version of Go required by KIND is 1.13. Let us download the proper binaries.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">wget https:\/\/dl.google.com\/go\/go1.13.3.linux-amd64.tar.gz<\/pre>\n\n\n\n<p>Now we need to extract the downloaded archive to a shared place in a filesystem to be available for every user,<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo tar -xvf go1.13.3.linux-amd64.tar.gz\nsudo mv go \/usr\/local<\/pre>\n\n\n\n<p>and configure environment variables &#8211; I prefer doing that for a local profile:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano ~\/.profile<\/pre>\n\n\n\n<p>At the end of the .profile file, we have to add the following lines:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">export GOROOT=\/usr\/local\/go\nexport PATH=$GOROOT\/bin:~\/go\/bin:$PATH<\/pre>\n\n\n\n<p>After reread of the profile file we may check if the Go language is installed and accessible.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">source ~\/.profile\ngo version<\/pre>\n\n\n\n<p>Now it is time to install <a href=\"https:\/\/www.docker.com\/\">Docker<\/a>. I prefer doing that using a dedicated repository. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install apt-transport-https ca-certificates curl software-properties-common\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -\nsudo add-apt-repository \"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu bionic stable\"\nsudo apt update\nsudo apt install docker-ce\n<\/pre>\n\n\n\n<p>Normally, when using Docker commands it is required to sudo, but to be able to use KIND commands we have to configure Docker to be usable without sudoing.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo usermod -aG docker NULL<\/pre>\n\n\n\n<p>And to apply the above configuration without re-logging to the OS, we do the following:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">su - NULL<\/pre>\n\n\n\n<p>Now it is time for installing KIND.  We won&#8217;t work out much here  \ud83d\ude09<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">GO111MODULE=\"on\" go get sigs.k8s.io\/kind@v0.7.0<\/pre>\n\n\n\n<p> And finally, we&#8217;re ready to launch our Kubernetes cluster. Please notice that the first execution has to last a little bit because kind has to pull (i.e. download) the proper docker image. For the start let&#8217;s initialize our Kubernetes cluster with default settings.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kind create cluster<\/pre>\n\n\n\n<p>After that, we can verify the default single-node configuration of just created cluster. The name of the node is <em>kind-control-plane<\/em>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kind get nodes<\/pre>\n\n\n\n<p>To be able to interact with our cluster we need to install one more tool &#8211; namely <strong>kubectl<\/strong>. There are <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\">many ways<\/a> of doing that,  but while I&#8217;m a big fan of containerization technologies, on client machines, I try to avoid using snap packages. So I am doing it my way (notice the usage of xenial repo, as at the time of writing this post there is not a bionic one yet):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt-get update &amp;&amp; sudo apt-get install -y apt-transport-https\ncurl -s https:\/\/packages.cloud.google.com\/apt\/doc\/apt-key.gpg | sudo apt-key add -\necho \"deb https:\/\/apt.kubernetes.io\/ kubernetes-xenial main\" | sudo tee -a \/etc\/apt\/sources.list.d\/kubernetes.list\nsudo apt-get update\nsudo apt-get install -y kubectl<\/pre>\n\n\n\n<p>Now we are able to verify what pods are running in our cluster:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kubectl get po --all-namespaces<\/pre>\n\n\n\n<p>And thanks to use the <em>&#8211;all-namespaces<\/em> flag we see quite a lot of them because this command lists also all infrastructural pods.<\/p>\n\n\n\n<p>Ok, what if we would like to create an HA cluster with more than one node? <\/p>\n\n\n\n<p>With KIND it is possible and easy. All we need is to prepare the configuration file (saved as<strong> kind-multinode.yaml<\/strong>), like this shown below.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kind: Cluster\napiVersion: kind.x-k8s.io\/v1alpha4\nnodes:\n- role: control-plane\n- role: control-plane\n- role: control-plane\n- role: worker\n- role: worker\n- role: worker<\/pre>\n\n\n\n<p>Now it is enough to recreate our cluster: <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kind delete cluster\nkind create cluster --config kind-multinode.yaml<\/pre>\n\n\n\n<p> Let&#8217;s verify if all nodes were created:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kubectl get nodes<\/pre>\n\n\n\n<p>&#8230; and voil\u00e0 \ud83d\ude09<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"379\" src=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_multinode-1024x379.png\" alt=\"\" data-id=\"204\" data-full-url=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_multinode.png\" data-link=\"https:\/\/blog.nubisoft.pl\/?attachment_id=204\" class=\"wp-image-204\" srcset=\"https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_multinode-1024x379.png 1024w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_multinode-300x111.png 300w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_multinode-768x284.png 768w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_multinode-1200x444.png 1200w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_multinode.png 1468w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p> In the end, I will show you how to run <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/access-application-cluster\/web-ui-dashboard\/\">the Kubernetes Dashboard <\/a>for such a built environment. I must point out here that I personally do not use this tool and that to support production environments, <strong>kubectl <\/strong>is more than enough. But this post is dedicated to developers, not DevOps, and developers like graphical environments after all \ud83d\ude09<\/p>\n\n\n\n<p>The most important thing is to know that Dashboard runs on a POD, so all you need is to execute:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/dashboard\/v2.0.0-beta8\/aio\/deploy\/recommended.yaml<\/pre>\n\n\n\n<p>This will install a dashboard but grant no access to it to any user. Kubernetes implements <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Role-based_access_control\">RBAC <\/a>model and granting privileges on production environments should be done with extreme caution. Many users hit problems starting the use of dashboard resulting in numerous errors like: &#8216;<em>User &#8220;system:anonymous&#8221; cannot list resource<\/em>&#8216;. This is because the user they trying to log in has no required privileges to access cluster metadata. But here we have a local environment so we&#8217;ll take a shortcut and grant admin role to the default user.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kubectl create clusterrolebinding --user system:serviceaccount:default:default default-sa-admin --clusterrole cluster-admin\n<\/pre>\n\n\n\n<p>To the dashboard, we will log in using a secret token. So we have to get it from our cluster configuration.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kubectl get secret<\/pre>\n\n\n\n<p>For the name of the listed secret, we have to copy to clipboard its secret token.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"568\" src=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_secret-1024x568.png\" alt=\"\" data-id=\"205\" data-full-url=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_secret.png\" data-link=\"https:\/\/blog.nubisoft.pl\/?attachment_id=205\" class=\"wp-image-205\" srcset=\"https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_secret-1024x568.png 1024w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_secret-300x166.png 300w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_secret-768x426.png 768w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_secret-1536x852.png 1536w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_secret-1200x665.png 1200w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_secret.png 1957w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Then we have to start proxying the dashboard<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kubectl proxy<\/pre>\n\n\n\n<p>and type the proper URL as an address in your web browser<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/localhost:8001\/api\/v1\/namespaces\/kubernetes-dashboard\/services\/https:kubernetes-dashboard:\/proxy\/#\/login<\/pre>\n\n\n\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"465\" src=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-1024x465.png\" alt=\"\" data-id=\"206\" data-full-url=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_dashboard_login.png\" data-link=\"https:\/\/blog.nubisoft.pl\/?attachment_id=206\" class=\"wp-image-206\" srcset=\"https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-1024x465.png 1024w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-300x136.png 300w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-768x349.png 768w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-1536x697.png 1536w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-2048x930.png 2048w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-1200x545.png 1200w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard_login-1980x899.png 1980w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>And finally, we see that access is granted.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"534\" src=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_dashboard-1024x534.png\" alt=\"\" data-id=\"207\" data-full-url=\"https:\/\/blog.nubisoft.pl\/wp-content\/uploads\/2020\/01\/kind_dashboard.png\" data-link=\"https:\/\/blog.nubisoft.pl\/?attachment_id=207\" class=\"wp-image-207\" srcset=\"https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-1024x534.png 1024w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-300x156.png 300w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-768x400.png 768w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-1536x800.png 1536w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-2048x1067.png 2048w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-1200x625.png 1200w, https:\/\/nubisoft.io\/blog\/wp-content\/uploads\/2020\/01\/kind_dashboard-1980x1032.png 1980w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p><strong>That is all. And you? What techniques do you use to deploy Kubernetes clusters locally?<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Another view angles <\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>If so far you have used <a href=\"https:\/\/github.com\/kubernetes-retired\/kubeadm-dind-cluster\">kubeadm-dind-cluster<\/a> solution, please note that the authors claim is it already outdated: &lt; <strong>NOTE: This project is deprecated in favor of <a href=\"https:\/\/kind.sigs.k8s.io\/\">kind<\/a>. Try <a href=\"https:\/\/kind.sigs.k8s.io\/\">kind<\/a> today, it&#8217;s great!<\/strong> &gt;<\/li><li>It is worth to mention that the alternative approach to deploying Kubernetes clusters locally implemented by <a href=\"https:\/\/github.com\/kubernetes\/minikube\">Minikube <\/a>requires virtualization technology (VirtualBox or KVM), which may lead to problems when you want to set up such a cluster in the virtual environment by itself.<\/li><li> I must admit that KIND also has some limitations compared to a real cluster, so nothing can replace the final tests of the implemented software on the target cluster. <\/li><li>Be aware, that cluster created using KIND is (like all containers) ephemeral. This means that the cluster won&#8217;t survive the system reboot, and after that must be manually recreated. This is a known issue reported <a href=\"https:\/\/github.com\/kubernetes-sigs\/kind\/issues\/148\">here<\/a>, and <a href=\"https:\/\/github.com\/kubernetes-sigs\/kind\/issues\/479\">here<\/a>. The KIND developers declaring there some improvements in the future.<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Here, at NubiSoft, most of our CI\/CD processes are configured in the cloud (after all, the name of our company obliges to something). But sometimes it is useful to deploy locally e.g. for development purposes. Having solutions built around the Kubernetes ecosystem makes it relatively problematic \u2026at least until recently. So in this post, we [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":199,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_case_study_excerpt":"","footnotes":""},"categories":[5,25,4,3,45],"tags":[48,47,49,24,50,46],"class_list":["post-197","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-infrastructure","category-maintenance","category-productivity","category-software-development","category-system-architecture","tag-cd","tag-ci","tag-containerization","tag-docker","tag-kind","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/posts\/197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/comments?post=197"}],"version-history":[{"count":13,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/posts\/197\/revisions"}],"predecessor-version":[{"id":222,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/posts\/197\/revisions\/222"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/media\/199"}],"wp:attachment":[{"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/media?parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/categories?post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nubisoft.io\/blog\/wp-json\/wp\/v2\/tags?post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}