{"id":34220,"date":"2018-06-28T16:30:26","date_gmt":"2018-06-28T13:30:26","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=34220"},"modified":"2018-08-20T18:36:23","modified_gmt":"2018-08-20T15:36:23","slug":"a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/","title":{"rendered":"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Options_at_hand\" >Options at hand<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Kubeadm\" >Kubeadm<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Kubespray\" >Kubespray<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Using_Kubespray\" >Using Kubespray<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Kubespray_vs_kops_vs_kubeadm\" >Kubespray vs. kops vs. kubeadm<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Want_details_Watch_the_video\" >Want details? Watch the video!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Related_slides\" >Related slides<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#Further_reading\" >Further reading<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#About_the_expert\" >About the expert<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Options_at_hand\"><\/span>Options at hand<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>When deploying a <a href=\"https:\/\/www.altoros.com\/blog\/\">Kubernetes<\/a> cluster to a production environment, managed installations allow for added flexibility and customization. To facilitate the process of deployment, one may enjoy a bunch of tools\u2014e.g., <b>kops<\/b>, <b>kubeadm<\/b>, <b>Kubespray<\/b>, or <b>Kubo<\/b>.<\/p>\n<p>These solutions are supported and maintained by the Kubernetes community, but what each of them can offer to a user and how are they different from each other? At a recent <a href=\"https:\/\/www.eventbrite.com\/e\/meetup-in-sv-deploying-kubernetes-with-kubespray-registration-46567366246#\" rel=\"noopener\" target=\"_blank\">Kubernetes meetup<\/a> in Sunnyvale, <a href=\"https:\/\/www.altoros.com\/blog\/author\/siarhei-matsiukevich\/\">Sergey Matykevich<\/a> of Altoros walked attendees through each tool.<\/p>\n<p>Let&#8217;s start with <a href=\"https:\/\/github.com\/kubernetes\/kops\" rel=\"noopener\" target=\"_blank\">kops<\/a>, which enables users to create, update, or delete production-grade and highly available Kubernetes clusters from the command line interface. Being maintained by the core Kubernetes team, the biggest advantage of kops is that the chances are high for it to become a default method of installation in the future. Major features of the tool include:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/kops-kubernetes-logo-1024x457.jpg\" alt=\"\" width=\"180\" class=\"alignright size-large wp-image-34399\" \/><\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">automated infrastructure creation and cluster deployment\/provisioning<\/li>\n<li style=\"margin-bottom: 6px;\">support for native features of cloud providers<\/li>\n<li>support for updates and upgrades<\/li>\n<\/ul>\n<p>With kops, one is also able to add a variety of <a href=\"https:\/\/github.com\/kubernetes\/kops\/blob\/master\/docs\/addons.md\" rel=\"noopener\" target=\"_blank\">custom Kubernetes add-ons<\/a>. Apart from this, you may add containers as <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/containers\/container-lifecycle-hooks\/\" rel=\"noopener\" target=\"_blank\">hooks<\/a> and files to nodes via a cluster manifest. At the moment, kops is available for AWS, Google Compute Engine (beta), and VMware vSphere (alpha). You may check out <a href=\"https:\/\/kubernetes.io\/docs\/setup\/production-environment\/tools\/kops\/\" rel=\"noopener\" target=\"_blank\">this guide<\/a> on how to install Kubernetes on AWS using kops.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Kubeadm\"><\/span>Kubeadm<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>At large, <a href=\"https:\/\/github.com\/kubernetes\/kubeadm\" rel=\"noopener\" target=\"_blank\">kubeadm<\/a> was designed to simplify Kubernetes bootstraping and installation of cluster add-ons. When <a href=\"https:\/\/kubernetes.io\/blog\/2016\/09\/how-we-made-kubernetes-easy-to-install\/\" rel=\"noopener\" target=\"_blank\">announcing<\/a> kubeadm in September 2016, the Kubernetes team stressed that the tool wouldn&#8217;t be engaged in provisioning of virtual machines\u2014which is one of the three major stages in setting up a Kubernetes cluster. Regarding that the tool has no infrastructure dependencies, kubeadm seems to be a good choice for Kubernetes bare-metal installations or as a compliment to any other tooling a user may employ during a manual setup.<\/p>\n<p>According to the <a href=\"https:\/\/kubernetes.io\/docs\/setup\/production-environment\/tools\/kubeadm\/create-cluster-kubeadm\/\" rel=\"noopener\" target=\"_blank\">official docs<\/a>, kubeadm can be used in the following scenarios:<\/p>\n<ul>\n<li>to try out Kubernetes for the first time<\/li>\n<li>to deploy a cluster or test an app if already skilled in Kubernetes<\/li>\n<li>to be exploited as a building block in complex systems with some other installers<\/li>\n<\/ul>\n<p>You will find some details on how the Kubernetes team sees the future of kubeadm in <a href=\"https:\/\/kubernetes.io\/blog\/2017\/01\/stronger-foundation-for-creating-and-managing-kubernetes-clusters\/\" rel=\"noopener\" target=\"_blank\">this blog post<\/a> or you may check out the latest milestones in <a href=\"https:\/\/github.com\/kubernetes\/kubeadm\/milestones\" rel=\"noopener\" target=\"_blank\">this GitHub repo<\/a>.<\/p>\n<p>There&#8217;s also <a href=\"https:\/\/www.altoros.com\/blog\/not-only-for-cloud-foundry-kubo-enables-kubernetes-deployments-with-bosh\/\">Kubo<\/a>\u2014an installer originally developed by Pivotal and Google. Though supporting multiple cloud providers, Kubo uses BOSH to manage a Kubernetes environment, which calls for a specific developer expertise.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/kubo-netwowrking-topology-using-iaas-load-balancers-v1.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/kubo-netwowrking-topology-using-iaas-load-balancers-v1.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-34473\" \/><\/a><small>Kubo&#8217;s networking topology using IaaS load balancers (<a href=\"https:\/\/github.com\/cloudfoundry-incubator\/kubo-deployment\" rel=\"noopener\" target=\"_blank\">Image credit<\/a>)<\/small><\/center><\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Kubespray\"><\/span>Kubespray<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/kubespray.io\/\"  el=\"noopener\" target=\"_blank\" ><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/kubespray-logo-w-background.png\" alt=\"\" width=\"150\" class=\"alignright size-full wp-image-34376\" \/><\/a><\/p>\n<p>Incubated as a community project with 90+ contributors, <a href=\"https:\/\/kubespray.io\/\" rel=\"noopener\" target=\"_blank\">Kubespray<\/a> was designed to deploy Kubernetes clusters either in the cloud or on premises. Originally based on Ansible playbooks, the tool can boast of the following features:<\/p>\n<ul>\n<li>support for deployments on AWS, Google Compute Engine, Microsoft Azure, OpenStack, and bare metal<\/li>\n<li>deployment of Kubernetes highly available clusters<\/li>\n<li>a composable architecture with a choice from <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray#network-plugins\" rel=\"noopener\" target=\"_blank\">six network plugins<\/a><\/li>\n<li>support for a <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray#supported-linux-distributions\" rel=\"noopener\" target=\"_blank\">variety of Linux distributions<\/a><\/li>\n<li>support for continuous integration tests<\/li>\n<li>kubeadm under the hood<\/li>\n<\/ul>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-v2.jpg\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-v2.jpg\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-34238\" \/><\/a><\/a><small><\/small><\/center><\/p>\n<blockquote><p><em>&#8220;Kubespray provides a good trade-off in the flexibility of a deployment. It allows you not only to easily deploy a cluster, but also to customize all aspects of the deployment.&#8221;<br \/>\n\u2014Sergey Matykevich<\/em><\/p><\/blockquote>\n<p>The challenge with using Kubespray, as noted by Sergey, is that it does not automatically create virtual machines. However, this issue may be resolved by leveraging the supported infrastructure management tools, such as <a href=\"https:\/\/github.com\/hashicorp\/terraform\" rel=\"noopener\" target=\"_blank\">Terraform<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Using_Kubespray\"><\/span>Using Kubespray<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>As from Sergey&#8217;s own experience, Kubespray strikes a balance between flexibility and ease of use. This was the reason to pay a bit more attention to the tool. So, he overviewed the steps needed to deploy a Kubernetes cluster with Kubespray and Terraform. The example uses Google Cloud Platform (GCP) as an underlying infrastructure, so anyone looking to follow the steps will need a GCP service account. Here are a couple of recommendations to start:<\/p>\n<ul>\n<li>Kubespray is under active development, so make sure to use a stable release version.<\/li>\n<li>When experimenting or deploying to different environments, use <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">--flush-cache<\/code> to minimize errors.<\/li>\n<\/ul>\n<p>With Ansible being heavily reliant on SSH, the first step is to generate SSH keys. An SSH agent is also employed here to expose the SSH key, allowing the key to be used later.<\/p>\n<pre style=\"padding-left: 30px;\">\r\n# Create new rsa keys\r\nif [ ! -f cust_id_rsa ] ; then\r\n   ssh-keygen -t rsa -b 2048 -f cust_id_rsa -q -N \"\"\r\nfi\r\n\r\n# Load keys\r\neval $(ssh-agent)\r\nssh-add -D\r\nssh-add cust_id_rsa\r\n<\/pre>\n<p>As previously mentioned, Kubespray does not provision infrastructure, so an infrastructure tool like Terraform comes in handy. The following three commands will initialize and run Terraform.<\/p>\n<pre style=\"padding-left: 30px;\">\r\nterraform init\r\nterraform plan -out cust.plan\r\nterraform apply cust.plan\r\n<\/pre>\n<p>In this case, the infrastructure provisioned will depend on the variables included in the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cust.plan<\/code> file.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/private-or-public-infrastructure-with-terraform-variables-kubespray-kubernetes.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/private-or-public-infrastructure-with-terraform-variables-kubespray-kubernetes-1024x400.png\" alt=\"\" width=\"640\" class=\"aligncenter size-large wp-image-34476\" \/><\/a><small>Private or public infrastructure can be created based on the Terraform variables used<\/small><\/center><\/p>\n<p>With the infrastructure created, the following step identifies IP addresses for the jump box, load balancer, as well as master and worker nodes.<\/p>\n<pre style=\"padding-left: 30px;\">\r\nbastion_ip=$(terraform output bastion_ip)\r\n\r\nlb_ip=$(terraform output lb_ip)\r\n\r\nmaster_ips=$(gcloud compute instances list --filter=\"${res_prefix}-masters\" --format=json |jq -r '.[].networkInterfaces[].networkIP'|tr \"\\n\" \" \"| sed -e \"s\/ \\{1,\\}$\/\/\")\r\n\r\nnode_ips=$(gcloud compute instances list --filter=\"${res_prefix}-workers\" --format=json |jq -r '.[].networkInterfaces[].networkIP'|tr \"\\n\" \" \"| sed -e \"s\/ \\{1,\\}$\/\/\")\r\n<\/pre>\n<p>To start the actual installation of Kubernetes, the <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray\" rel=\"noopener\" target=\"_blank\">Kubespray repo<\/a> is cloned.<\/p>\n<pre style=\"padding-left: 30px;\">\r\ngit clone https:\/\/github.com\/kubernetes-sigs\/kubespray.git\r\ncd kubespray && git checkout ${kubespray_version}\r\n<\/pre>\n<p>Customizations can then be applied. In this case, modifications to security roles were added.<\/p>\n<pre style=\"padding-left: 30px;\">\r\n# bring in modifications, in particular security changes\r\nrsync -avz $git_root\/mods\/roles\/* roles\/\r\n<\/pre>\n<p>Next, the Kubespray inventory is generated. This enables Ansible to reach all the different hosts.<\/p>\n<pre style=\"padding-left: 30px;\">\r\n[all]\r\nmaster1 ansible_ssh_host=10.0.0.8 ip=10.0.0.8\r\n...\r\n\r\n[kube-master]\r\nmaster1\r\nmaster2\r\nmaster3\r\n\r\n[etcd]\r\nmaster1\r\nmaster2\r\nmaster3\r\n\r\n...\r\n<\/pre>\n<p>To prepare the cluster, simply run the playbook. This takes about 15\u201320 minutes.<\/p>\n<pre style=\"padding-left: 30px;\">\r\nansible-playbook -vvv -i inventory\/hosts.ini cluster.yml --flush-cache\r\n<\/pre>\n<p>Finally, all that&#8217;s needed is to connect to the cluster.<\/p>\n<pre style=\"padding-left: 30px;\">\r\n#change the admin.conf file to the current lb_ip\r\nsed -i -e \"s\/lb-apiserver.kubernetes.local\/$lb_ip\/g\" inventory\/artifacts\/admin.conf\r\n\r\n## echo out set KUBECONFIG\r\necho \"Set your KUBECONFIG\"\r\necho \"export KUBECONFIG=$(pwd)\/inventory\/artifacts\/admin.conf\"\r\n<\/pre>\n<p>There is also an <a href=\"https:\/\/kubernetes.io\/docs\/setup\/production-environment\/tools\/kubespray\/\" rel=\"noopener\" target=\"_blank\">official guide<\/a> on installing Kubernetes on premises or in the cloud with Kubespray. For any info on the tool, you may check out <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray\" rel=\"noopener\" target=\"_blank\">Kubespray&#8217;s GitHub repo<\/a>. The plans for the tool&#8217;s further development are available via <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubesprayblob\/master\/docs\/roadmap.md\" rel=\"noopener\" target=\"_blank\">its roadmap<\/a>. For any community news around Kubespray, you may visit <a href=\"https:\/\/kubernetes.slack.com\/?redir=%2Fmessages%2Fkubespray\" rel=\"noopener\" target=\"_blank\">its channel<\/a> on Slack.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Kubespray_vs_kops_vs_kubeadm\"><\/span>Kubespray vs. kops vs. kubeadm<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>If <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubesprayblob\/master\/docs\/comparisons.md\" rel=\"noopener\" target=\"_blank\">comparing<\/a> the three tools, <i>Kubeadm<\/i> provides support for most clouds and bare metal with Ansible employed to treat provisioning and orchestration matters. Unlike Kubespray, <i>kops<\/i> can handle provisioning and orchestration for itself, but this, in its turn, limits flexibility from the perspective of deployment platforms.<\/p>\n<p>This way, <i>Kubespray<\/i> is a nice choice when you either are familiar with Ansible or seek a possibility to switch between multiple platforms. If your priority is tight integration with unique features offered by the supported clouds, and you plan to stick with your provider, <i>kops<\/i> may be a better option.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich.jpg\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich.jpg\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-34225\" \/><\/a><small>Sergey Matykevich at the Kubernetes meetup held at Google<\/small><\/center><\/p>\n<p><i>kubeadm<\/i> covers the needs of a life-cycle management for Kubernetes clusters, including self-hosted layouts, dynamic discovery services, etc. <i>Kubespray<\/i> is more about generic configuration, initial clustering, and bootstrapping.<\/p>\n<blockquote><p><em>&#8220;Kubespray is a wrapper around kubeadm. It comes with a set of scripts and templates that we can use to spin up Kubernetes.&#8221; \u2014Sergey Matykevich<\/em><\/p><\/blockquote>\n<p>However, <i>Kubespray<\/i> aims at adopting <i>kubeadm<\/i> to bridge the gap in the life-cycle management domain. Will it happen? We may see soon.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Want_details_Watch_the_video\"><\/span>Want details? Watch the video!<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td class=\"video-post-34220\">\n<div style=\"float: right; width: 44%; padding-left: 15px; font-size: 14px;\">\n<p><strong>Table of contents<\/strong><\/p>\n<ol>\n<li style=\"margin-bottom: 10px;\">What is kops? (<a href=\"#wistia_luw7h3o9xc?time=76\">1&#8217;16&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">What is kubeadm? (<a href=\"#wistia_luw7h3o9xc?time=160\">2&#8217;40&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">What is Kubo? (<a href=\"#wistia_luw7h3o9xc?time=224\">3&#8217;44&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">What is Kubespray? (<a href=\"#wistia_luw7h3o9xc?time=280\">4&#8217;40&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">Recommendations when using Kubespray (<a href=\"#wistia_luw7h3o9xc?time=404\">6&#8217;44&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">Demo: Installing Kubernetes with Kubespray (<a href=\"#wistia_luw7h3o9xc?time=487\">8&#8217;07&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">What else can Kubespray do? (<a href=\"#wistia_luw7h3o9xc?time=1010\">16&#8217;50&#8221;<\/a>)<\/li>\n<\/ol>\n<\/div>\n<p><script charset=\"ISO-8859-1\" src=\"\/\/fast.wistia.com\/assets\/external\/E-v1.js\" async><\/script><\/p>\n<div class=\"video-34220 wistia_embed wistia_async_luw7h3o9xc\" style=\"height:320px;width:440px\">&nbsp;<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>In the video below, <a href=\"https:\/\/www.linkedin.com\/in\/christianhhercules\/\" rel=\"noopener\" target=\"_blank\">Christian Hercules<\/a> of Altoros provides some extra demo on the topic covered by Sergey.<\/p>\n<p><center><script src=\"https:\/\/fast.wistia.com\/embed\/medias\/653j7mn6y6.jsonp\" async><\/script><script src=\"https:\/\/fast.wistia.com\/assets\/external\/E-v1.js\" async><\/script><\/p>\n<div class=\"wistia_embed wistia_async_653j7mn6y6\" style=\"height:360px;position:relative;width:640px\">\n<div class=\"wistia_swatch\" style=\"height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;transition:opacity 200ms;width:100%;\"><img decoding=\"async\" src=\"https:\/\/fast.wistia.com\/embed\/medias\/653j7mn6y6\/swatch\" style=\"filter:blur(5px);height:100%;object-fit:contain;width:100%;\" alt=\"\" onload=\"this.parentNode.style.opacity=1;\" \/><\/div>\n<\/div>\n<p><\/center> <\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Related_slides\"><\/span>Related slides<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><center><iframe loading=\"lazy\" src=\"\/\/www.slideshare.net\/slideshow\/embed_code\/key\/kCElcW1c9SIrow\" width=\"595\" height=\"485\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" style=\"border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;\" allowfullscreen> <\/iframe><\/center><\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/deploying-services-to-cloud-foundry-is-easier-with-kubernetes\/\">Deploying Services to Cloud Foundry Using Kubernetes: Less BOSH, More Freedom<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/not-only-for-cloud-foundry-kubo-enables-kubernetes-deployments-with-bosh\/\">Kubo Enables Kubernetes Environments Managed by Cloud Foundry\u2019s BOSH<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/configuring-uaa-to-provide-a-single-entry-point-for-kubernetes-and-cloud-foundry\/\">Configuring UAA to Provide a Single Entry Point for Kubernetes and Cloud Foundry<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"About_the_expert\"><\/span>About the expert<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>\n<div style=\"float: right;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/06\/Sergey-Matyukevich-Cloud-Engineer-Altoros.png\" alt=\"\" width=\"150\" height=\"150\" class=\"aligncenter size-full wp-image-14918\" \/><\/div>\n<div style=\"width: 600px;\"><small><a href=\"https:\/\/www.altoros.com\/blog\/author\/siarhei-matsiukevich\/\">Sergey Matyukevich<\/a> is a Solutions Architect at Altoros. With 10 years in software engineering, he is an expert in cloud automation and designing architectures for complex cloud-based systems. An active member of the Go community and a frequent contributor to open-source projects (Ubuntu, Juju Charms, etc.), Sergey has authored a series of popular blog posts on <a href=\"https:\/\/www.altoros.com\/blog\/golang-internals-part-1-main-concepts-and-project-structure\/\">Golang internals<\/a>. He has also designed and delivered a range of training courses on Cloud Foundry and cloud-native development for DevOps engineers, software developers, and architects.<\/small><\/div>\n<\/div>\n<hr \/>\n<p><center><small>This blog post was written by <a href=\"https:\/\/www.altoros.com\/blog\/author\/sophie.turol\/\">Sophie Turol<\/a> with assistance from <a href=\"https:\/\/www.altoros.com\/blog\/author\/carlo\/\">Carlo Gutierrez<\/a> and <a href=\"https:\/\/www.altoros.com\/blog\/author\/siarhei-matsiukevich\/\">Sergey Matykevich<\/a>.<\/small><\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Options at hand<\/p>\n<p>When deploying a Kubernetes cluster to a production environment, managed installations allow for added flexibility and customization. To facilitate the process of deployment, one may enjoy a bunch of tools\u2014e.g., kops, kubeadm, Kubespray, or Kubo.<\/p>\n<p>These solutions are supported and maintained by the Kubernetes community, but what each of [&#8230;]<\/p>\n","protected":false},"author":3,"featured_media":34431,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[873,912,206],"class_list":["post-34220","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-cloud-native","tag-kubernetes","tag-oss-cloud-foundry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm | Altoros<\/title>\n<meta name=\"description\" content=\"This article explores what each of the tools offers, how they differ, and which scenarios they fit\u2014providing some recommendations on using Kubespray.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm | Altoros\" \/>\n<meta property=\"og:description\" content=\"Options at hand When deploying a Kubernetes cluster to a production environment, managed installations allow for added flexibility and customization. To facilitate the process of deployment, one may enjoy a bunch of tools\u2014e.g., kops, kubeadm, Kubespray, or Kubo. These solutions are supported and maintained by the Kubernetes community, but what each of [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-28T13:30:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-08-20T15:36:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Sophia Turol\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sophia Turol\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/\",\"name\":\"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif\",\"datePublished\":\"2018-06-28T13:30:26+00:00\",\"dateModified\":\"2018-08-20T15:36:23+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e\",\"name\":\"Sophia Turol\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg\",\"caption\":\"Sophia Turol\"},\"description\":\"Sophia Turol is passionate about delivering well-structured articles that cater for picky technical audience. With 3+ years in technical writing and 5+ years in editorship, she enjoys collaboration with developers to create insightful, yet intelligible technical tutorials, overviews, and case studies. Sophie is enthusiastic about deep learning solutions\u2014TensorFlow in particular\u2014and PaaS systems, such as Cloud Foundry.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/sophie-turol\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm | Altoros","description":"This article explores what each of the tools offers, how they differ, and which scenarios they fit\u2014providing some recommendations on using Kubespray.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/","og_locale":"en_US","og_type":"article","og_title":"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm | Altoros","og_description":"Options at hand When deploying a Kubernetes cluster to a production environment, managed installations allow for added flexibility and customization. To facilitate the process of deployment, one may enjoy a bunch of tools\u2014e.g., kops, kubeadm, Kubespray, or Kubo. These solutions are supported and maintained by the Kubernetes community, but what each of [...]","og_url":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/","og_site_name":"Altoros","article_published_time":"2018-06-28T13:30:26+00:00","article_modified_time":"2018-08-20T15:36:23+00:00","og_image":[{"width":640,"height":360,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif","type":"image\/gif"}],"author":"Sophia Turol","twitter_misc":{"Written by":"Sophia Turol","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/","url":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/","name":"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif","datePublished":"2018-06-28T13:30:26+00:00","dateModified":"2018-08-20T15:36:23+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/06\/Kubernetes-Kubespray-Cloud-Native-Sergey-Matykevich-Deployment-Kubo-Kubeadm-Kops-v4.gif","width":640,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Multitude of Kubernetes Deployment Tools: Kubespray, kops, and kubeadm"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e","name":"Sophia Turol","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg","caption":"Sophia Turol"},"description":"Sophia Turol is passionate about delivering well-structured articles that cater for picky technical audience. With 3+ years in technical writing and 5+ years in editorship, she enjoys collaboration with developers to create insightful, yet intelligible technical tutorials, overviews, and case studies. Sophie is enthusiastic about deep learning solutions\u2014TensorFlow in particular\u2014and PaaS systems, such as Cloud Foundry.","url":"https:\/\/www.altoros.com\/blog\/author\/sophie-turol\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/34220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=34220"}],"version-history":[{"count":114,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/34220\/revisions"}],"predecessor-version":[{"id":47830,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/34220\/revisions\/47830"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/34431"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=34220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=34220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=34220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}