{"id":39894,"date":"2019-01-17T20:44:14","date_gmt":"2019-01-17T17:44:14","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=39894"},"modified":"2019-10-12T15:05:48","modified_gmt":"2019-10-12T12:05:48","slug":"github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/","title":{"rendered":"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning"},"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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#Controllers_extend_toolchain_functionality\" >Controllers extend toolchain functionality<\/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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#Custom_controllers_built_by_GitHub\" >Custom controllers built by GitHub<\/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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#Kubernetes_on_bare_metal_at_GitHub\" >Kubernetes on bare metal at GitHub<\/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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#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-5\" href=\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#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-6\" href=\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#About_the_experts\" >About the experts<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Controllers_extend_toolchain_functionality\"><\/span>Controllers extend toolchain functionality<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In DevOps, toolchains are used to help to orchestrate the delivery, development, and management of applications throughout the development life cycle. Tools like Ansible and <a href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-advisory-board-meeting-dec-2018-terraform-and-cf-dev\/\">Terraform<\/a> can be grouped together to create a toolchain. Toolchains can then consecutively run the linked software in such a way that the output of each becomes the input for the next one.<\/p>\n<p>While toolchains are useful, sometimes they are unable to fit developer&#8217;s exact requirements. A toolchain may also get to a point where several solutions get added over time requiring developers to be familiar with every single piece of software that&#8217;s in use.<\/p>\n<p>These were some of the problems GitHub stumbled upon during their adoption of Kubernetes three years ago. At a <a href=\"https:\/\/www.meetup.com\/Dallas-Cloud-Native-and-Kubernetes-Meetup\/events\/252630349\/\" rel=\"noopener noreferrer\" target=\"_blank\">meetup<\/a> in Dallas, <a href=\"https:\/\/www.linkedin.com\/in\/rossedman\/\" rel=\"noopener noreferrer\" target=\"_blank\">Ross Edman<\/a> of GitHub alluded to such toolchain limitations and exemplified how controllers in Kubernetes can save the day through their functionality.<\/p>\n<div id=\"attachment_40592\" style=\"width: 130px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Ross-Edman.jpg\"><img decoding=\"async\" aria-describedby=\"caption-attachment-40592\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Ross-Edman-150x150.jpg\" alt=\"\" width=\"120\" class=\"size-thumbnail wp-image-40592\" \/><\/a><p id=\"caption-attachment-40592\" class=\"wp-caption-text\"><small>Ross Edman<\/small><\/p><\/div>\n<blockquote><p><em>&#8220;Toolchains only go so far. At some point, no matter how many toolchains you string together, you&#8217;re not going to get exactly what you want for your business. If you&#8217;ve been in operations a long time, you&#8217;ve experienced toolchain explosion where you have to know Chef, Puppet, Ansible, Terraform, and it just goes on forever. At some point, you can&#8217;t get all that stuff to build exactly what you want.&#8221; \u2014Ross Edman, GitHub<\/em><\/p><\/blockquote>\n<p>Controllers are basically endless loops that regulate the state of any system. Given a desired state, a controller will facilitate the necessary processes to get the system to the desired state.<\/p>\n<p>As an example, a heating, ventilating, and air conditioning (HVAC) system in a home can be thought of as an endless loop. In this scenario, a user can define a desired state by setting the temperature. As a controller, a thermostat then communicates with a heater, a ventilator, and an air conditioner until the set temperature is met.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-HVAC-loop.jpg\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-HVAC-loop-1024x576.jpg\" alt=\"\" width=\"640\" class=\"aligncenter size-large wp-image-40410\" \/><\/a><small>The thermometer is the controller in an HVAC system<\/small><\/center><\/p>\n<p>Similarly, in Kubernetes, controllers are control loops that monitor the shared state of a cluster through an API server and make adjustments to move the current state towards the desired one. Some of the <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/\" rel=\"noopener noreferrer\" target=\"_blank\">existing controllers<\/a> in Kubernetes include:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">A <strong>node controller<\/strong> is responsible for noticing and responding when nodes go offline.<\/li>\n<li style=\"margin-bottom: 6px;\">A <strong>deployment controller<\/strong> maintains <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/replicaset\/\" rel=\"noopener noreferrer\" target=\"_blank\">ReplicaSets<\/a>.<\/li>\n<li style=\"margin-bottom: 6px;\">A <strong>replication controller<\/strong> manages the correct number of pods for every replication controller object in the system.<\/li>\n<li style=\"margin-bottom: 6px;\">An <strong>endpoints controller<\/strong> administers the network topology between services and pods.<\/li>\n<li style=\"margin-bottom: 6px;\">A <strong>volume controller<\/strong> takes care of creating, attaching, and mounting volumes, as well as interacting with the cloud provider to orchestrate volumes.<\/li>\n<\/ul>\n<blockquote><p><em>&#8220;Controllers are the magic that we all think of when we see Kubernetes.&#8221; \u2014Ross Edman, GitHub<\/em><\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Custom_controllers_built_by_GitHub\"><\/span>Custom controllers built by GitHub<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>According to Ross, there are over 10 custom controllers which help GitHub to run. So, he highlighted some of them:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">A <strong>namespace bootstrapping controller<\/strong> provisions images, metadata, resource quotas, and limit ranges when a namespace is created.<\/li>\n<li style=\"margin-bottom: 6px;\">A <strong>deployment orchestration controller<\/strong> monitors deployments across clusters, injects annotations, and reports back the status.<\/li>\n<li style=\"margin-bottom: 6px;\">A <strong>node problem correction controller<\/strong> watches the state of nodes and attempts to fix erroneous nodes by cordoning them off, draining workloads, restarting them, and applying healing procedures.<\/li>\n<\/ul>\n<blockquote><p><em>&#8220;We use controllers for a lot of stuff. Right now, 100% of GitHub.com runs on Kubernetes and we orchestrate all of that with custom controllers.&#8221; \u2014Ross Edman, GitHub<\/em><\/p><\/blockquote>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-v2.jpg\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-v2-1024x576.jpg\" alt=\"\" width=\"640\" class=\"aligncenter size-large wp-image-40426\" \/><\/a><small><a href=\"https:\/\/www.linkedin.com\/in\/rossedman\/\" rel=\"noopener noreferrer\" target=\"_blank\">Ross Edman<\/a> at the meetup in Dallas<\/small><\/center><\/p>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/api-extension\/custom-resources\/#custom-controllers\" rel=\"noopener noreferrer\" target=\"_blank\">Custom controllers<\/a> are made possible by extensive the API of Kubernetes, which enables developers to do away with toolchains. During his presentation, Ross demonstrated how to build custom controllers.<\/p>\n<blockquote><p><em>&#8220;All the things you use in Kubernetes, you can change and affect at every different level. You can do this in a way where you&#8217;re not composing all these toolchains to do it. You can do it in a couple hundred lines of code and it can make a huge difference to your business.&#8221; \u2014Ross Edman, GitHub<\/em><\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Kubernetes_on_bare_metal_at_GitHub\"><\/span>Kubernetes on bare metal at GitHub<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>While controllers now play a vital role in GitHub, it is only a small portion of how the company&#8217;s infrastructure utilizes Kubernetes.<\/p>\n<p>According to <a href=\"https:\/\/www.linkedin.com\/in\/jnewland\/\" rel=\"noopener noreferrer\" target=\"_blank\">Jesse Newland<\/a> of GitHub, before <a href=\"https:\/\/githubengineering.com\/kubernetes-at-github\/\" rel=\"noopener noreferrer\" target=\"_blank\">adopting Kubernetes<\/a>, the company&#8217;s site reliability engineers (SRE) were overloaded with server maintenance and provisioning. As the community grew, so too did the burden on the SRE team. New services took days, weeks, or months to deploy depending on complexity and the SRE team&#8217;s availability.<\/p>\n<p>At the evaluating stage in August 2016, the team of GitHub experimented with deploying a small cluster and an application on Kubernetes in just a few hours, and it was the result, which greatly favored the choice of Kubernetes that followed.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/GitHub-on-Kubernetes-v2.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/GitHub-on-Kubernetes-v2-1020x1024.png\" alt=\"\" width=\"500\" class=\"aligncenter size-large wp-image-40478\" \/><\/a><small>GitHub on Kubernetes (<a href=\"https:\/\/githubengineering.com\/kubernetes-at-github\/\" rel=\"noopener noreferrer\" target=\"_blank\">Image credit<\/a>)<\/small><\/center><\/p>\n<p>The company decided to stick to an achievement-oriented approach and experiment further rather than setting up a particular deadline for full migration to Kubernetes. So, the next step to take was building a &#8220;review lab&#8221;\u2014a deployment environment driven by Kubernetes to support exploratory testing of the combination of the container orchestrator and the services that would run on it. This &#8220;review lab&#8221; project is similar to the already existing GitHub environment called &#8220;branch lab.&#8221;<\/p>\n<p>The rest of 2016 was dedicated to this, and quite an impressive number of sub-projects were delivered in the process, including:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">a Kubernetes cluster running in an AWS Virtual Private Cloud and managed using a combination of <a href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-advisory-board-meeting-dec-2018-terraform-and-cf-dev\/\">Terraform<\/a> and <a href=\"https:\/\/www.altoros.com\/blog\/a-multitude-of-kubernetes-deployment-tools-kubespray-kops-and-kubeadm\/\">kops<\/a><\/li>\n<li style=\"margin-bottom: 6px;\">a Dockerfile for <em>github.com<\/em> and <em>api.github.com<\/em><\/li>\n<li style=\"margin-bottom: 6px;\">YAML representations of 50+ Kubernetes resources<\/li>\n<li>a set of Bash integration tests exercising ephemeral Kubernetes clusters<\/li>\n<\/ul>\n<p>The experimenting resulted in a chat-based interface for creating an isolated deployment of GitHub for any pull request.<\/p>\n<p>While building its Kubernetes cluster, GitHub also achieved the following:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">Utilized <a href=\"https:\/\/www.altoros.com\/blog\/integrating-calico-and-istio-to-secure-zero-trust-networks-on-kubernetes\/\">Calico<\/a>, which provided out-of-the-box functionality necessary for shipping clusters in IP-in-IP mode<\/li>\n<li style=\"margin-bottom: 6px;\">Built a tool to generate the certificate authority and configuration needed for each cluster<\/li>\n<li style=\"margin-bottom: 6px;\">Puppetized the configuration of two instance roles\u2014Kubernetes nodes and Kubernetes API servers<\/li>\n<li style=\"margin-bottom: 6px;\">Delivered a Go-based service to process container logs and send them to the hosts\u2019 local Syslog endpoint<\/li>\n<li>Enhanced GitHub\u2019s internal load balancing service to support Kubernetes NodePort Services<\/li>\n<\/ul>\n<div id=\"attachment_40579\" style=\"width: 130px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Jesse-Newland.jpg\"><img decoding=\"async\" aria-describedby=\"caption-attachment-40579\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Jesse-Newland-150x150.jpg\" alt=\"\" width=\"120\" class=\"size-thumbnail wp-image-40579\" \/><\/a><p id=\"caption-attachment-40579\" class=\"wp-caption-text\"><small>Jesse Newland<\/small><\/p><\/div>\n<p>Additionally, after successfully running a Kubernetes cluster in an AWS, the GitHub team was able to <a href=\"https:\/\/thenewstack.io\/github-goes-kubernetes-tells\/\" rel=\"noopener noreferrer\" target=\"_blank\">migrate<\/a> the entire workload to the company&#8217;s bare-metal cloud in less than a week. Overall, the transition from internal to external Kubernetes lasted about a month.<\/p>\n<p>At the moment, the Kubernetes cluster of GitHub already has dozens of applications deployed to it. Each of these applications would have previously required configuration management and provisioning support from the SRE team. With the move to Kubernetes, GitHub now has a self-service platform that can deploy and scale new services. Additionally, modifying and provisioning resources on Kubernetes can be done in seconds.<\/p>\n<blockquote><p><em>&#8220;I can already see how the move to Kubernetes is creating an environment at GitHub for more rapid innovation\u2014innovation that will benefit users and, ultimately, the software industry as a whole.&#8221; \u2014Jesse Newland, GitHub<\/em><\/p><\/blockquote>\n<p>This initial tryout of Kubernetes was limited only to stateless workloads, so now the team at GitHub is planning to further experiment with running <a href=\"https:\/\/www.altoros.com\/blog\/running-stateful-apps-on-kubernetes-with-statefulsets\/\">stateful services<\/a> on Kubernetes.<\/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<div class=\"video-block\">\n<div class=\"video-block-wrap\">\n        <script charset=\"ISO-8859-1\" src=\"\/\/fast.wistia.com\/assets\/external\/E-v1.js\" async><\/script><\/p>\n<div class=\"wistia_embed wistia_async_o7w8zrqa8p\" style=\"height:320px;width:440px\"><\/div>\n<\/p><\/div>\n<div class=\"video-block-descr\">\n        <strong>Table of contents<\/strong><\/p>\n<ol style=\"margin-bottom: 10px;\">\n<li style=\"margin-bottom: 10px;\">What is a control loop? (<a href=\"#wistia_o7w8zrqa8p?time=161\">2&#8217;41&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">What kind of controllers are there in Kubernetes? (<a href=\"#wistia_o7w8zrqa8p?time=428\">7&#8217;08&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">What is the anatomy of a controller? (<a href=\"#wistia_o7w8zrqa8p?time=550\">9&#8217;10&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">Why would you build a controller? (<a href=\"#wistia_o7w8zrqa8p?time=692\">11&#8217;32&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">How does GitHub use controllers? (<a href=\"#wistia_o7w8zrqa8p?time=910\">15&#8217;10&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">Demo: building a custom controller (<a href=\"#wistia_o7w8zrqa8p?time=1096\">18&#8217;16&#8221;<\/a>)<\/li>\n<li style=\"margin-bottom: 10px;\">Question and answers (<a href=\"#wistia_o7w8zrqa8p?time=3272\">54&#8217;32&#8221;<\/a>)<\/li>\n<\/ol><\/div>\n<\/div>\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\/enabling-high-availability-and-disaster-recovery-in-kubernetes\/\">Enabling High Availability and Disaster Recovery in Kubernetes<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/netapp-builds-up-a-multi-cloud-kubernetes-as-a-service-platform\/\">NetApp Builds Up a Multi-Cloud Kubernetes-as-a-Service Platform<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/kubernetes-cluster-ops-options-for-configuration-management\/\">Kubernetes Cluster Ops: Options for Configuration Management<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"About_the_experts\"><\/span>About the experts<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div style=\"float: right;\"><a href=\"https:\/\/www.linkedin.com\/in\/rossedman\/\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2018\/12\/Ross-Edman-bio.png\" alt=\"\" width=\"110\" class=\"aligncenter size-full wp-image-40404\" \/><\/a><\/div>\n<div style=\"width: 600px;\"><small><a href=\"https:\/\/www.linkedin.com\/in\/rossedman\/\" rel=\"noopener noreferrer\" target=\"_blank\">Ross Edman<\/a> is a production engineer at GitHub where he uses Kubernetes to help run the largest developer community in the world. Over the past five years, he has consulted organizations on how to define their infrastructure as code, build better reliability practices, and make continuous integration a reality. Ross has run Kubernetes in production for two years and played a hand in architecting Toyota Connected\u2019s global infrastructure for the connected car technology on Kubernetes.<\/small><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<div style=\"float: right;\"><a href=\"https:\/\/www.linkedin.com\/in\/jnewland\/\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Jesse-Newland-bio.png\" alt=\"\" width=\"110\" class=\"aligncenter size-full wp-image-40553\" \/><\/a><\/div>\n<div style=\"width: 600px;\"><small><a href=\"https:\/\/www.linkedin.com\/in\/jnewland\/\" rel=\"noopener noreferrer\" target=\"_blank\">Jesse Newland<\/a> is the principal production engineer at GitHub. He has spent over seven years with the company serving in different roles, including a system engineer, the VP of Ops, a senior infrastructure engineer, and a principal site reliability engineer. Prior to GitHub, Jesse served as CTO at Rails Machine and as IT director at LexBlog.<\/small><\/div>\n<\/div>\n<hr \/>\n<p><center><small>This post was written by <a href=\"https:\/\/www.altoros.com\/blog\/author\/carlo\/\">Carlo Gutierrez<\/a> and edited by <a href=\"https:\/\/www.altoros.com\/blog\/author\/sophie.turol\/\">Sophia Turol<\/a> with assistance from <a href=\"https:\/\/www.altoros.com\/blog\/author\/alex\/\">Alex Khizhniak<\/a>.<\/small><\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Controllers extend toolchain functionality<\/p>\n<p>In DevOps, toolchains are used to help to orchestrate the delivery, development, and management of applications throughout the development life cycle. Tools like Ansible and Terraform can be grouped together to create a toolchain. Toolchains can then consecutively run the linked software in such a way that [&#8230;]<\/p>\n","protected":false},"author":32,"featured_media":47168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[26],"tags":[873,912],"class_list":["post-39894","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-use-cases","tag-cloud-native","tag-kubernetes"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning | Altoros<\/title>\n<meta name=\"description\" content=\"100% of GitHub.com now runs on Kubernetes, enabling site reliability engineers to provision resources for new services in a matter of seconds.\" \/>\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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning | Altoros\" \/>\n<meta property=\"og:description\" content=\"Controllers extend toolchain functionality In DevOps, toolchains are used to help to orchestrate the delivery, development, and management of applications throughout the development life cycle. Tools like Ansible and Terraform can be grouped together to create a toolchain. Toolchains can then consecutively run the linked software in such a way that [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2019-01-17T17:44:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-10-12T12:05:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.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=\"Carlo Gutierrez\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Gutierrez\" \/>\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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/\",\"name\":\"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif\",\"datePublished\":\"2019-01-17T17:44:14+00:00\",\"dateModified\":\"2019-10-12T12:05:48+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/833e109f77de753b2b472dca0236b442\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning\"}]},{\"@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\/833e109f77de753b2b472dca0236b442\",\"name\":\"Carlo Gutierrez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg\",\"caption\":\"Carlo Gutierrez\"},\"description\":\"Carlo Gutierrez is a Technical Writer at Altoros. As part of the editorial team, his focus has been on emerging technologies such as Cloud Foundry, Kubernetes, blockchain, and the Internet of Things. Prior to Altoros, he primarily wrote about enterprise and consumer technology. Carlo has over 12 years of experience in the publishing industry. Previously, he served as an Editor for PC World Philippines and Questex Asia, as well as a Designer for Tropa Entertainment.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/carlo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning | Altoros","description":"100% of GitHub.com now runs on Kubernetes, enabling site reliability engineers to provision resources for new services in a matter of seconds.","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\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/","og_locale":"en_US","og_type":"article","og_title":"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning | Altoros","og_description":"Controllers extend toolchain functionality In DevOps, toolchains are used to help to orchestrate the delivery, development, and management of applications throughout the development life cycle. Tools like Ansible and Terraform can be grouped together to create a toolchain. Toolchains can then consecutively run the linked software in such a way that [...]","og_url":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/","og_site_name":"Altoros","article_published_time":"2019-01-17T17:44:14+00:00","article_modified_time":"2019-10-12T12:05:48+00:00","og_image":[{"width":640,"height":360,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif","type":"image\/gif"}],"author":"Carlo Gutierrez","twitter_misc":{"Written by":"Carlo Gutierrez","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/","url":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/","name":"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif","datePublished":"2019-01-17T17:44:14+00:00","dateModified":"2019-10-12T12:05:48+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/833e109f77de753b2b472dca0236b442"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Kubernetes-Controllers-Ross-Edman-GitHub-v2.gif","width":640,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/github-crafts-10-custom-kubernetes-controllers-to-refine-provisioning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GitHub Crafts 10+ Custom Kubernetes Controllers to Refine Provisioning"}]},{"@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\/833e109f77de753b2b472dca0236b442","name":"Carlo Gutierrez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg","caption":"Carlo Gutierrez"},"description":"Carlo Gutierrez is a Technical Writer at Altoros. As part of the editorial team, his focus has been on emerging technologies such as Cloud Foundry, Kubernetes, blockchain, and the Internet of Things. Prior to Altoros, he primarily wrote about enterprise and consumer technology. Carlo has over 12 years of experience in the publishing industry. Previously, he served as an Editor for PC World Philippines and Questex Asia, as well as a Designer for Tropa Entertainment.","url":"https:\/\/www.altoros.com\/blog\/author\/carlo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/39894","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\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=39894"}],"version-history":[{"count":173,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/39894\/revisions"}],"predecessor-version":[{"id":47169,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/39894\/revisions\/47169"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/47168"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=39894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=39894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=39894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}