<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kubinception Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/tag/kubinception/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/tag/kubinception/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Fri, 12 Jul 2019 09:24:07 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>Kubinception Archives - OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/tag/kubinception/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kubinception and etcd</title>
		<link>https://blog.ovhcloud.com/kubinception-and-etcd/</link>
		
		<dc:creator><![CDATA[Horacio Gonzalez]]></dc:creator>
		<pubDate>Fri, 08 Feb 2019 16:16:38 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[etcd]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Kubinception]]></category>
		<category><![CDATA[OVHcloud Managed Kubernetes]]></category>
		<guid isPermaLink="false">https://blog.ovh.com/fr/blog/?p=14425</guid>

					<description><![CDATA[In our precedent post, we described the Kubinception architecture, how we run Kubernetes over Kubernetes for the stateless components of the customer clusters'  control planes. But what about the stateful component, the etcd? <img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fkubinception-and-etcd%2F&amp;action_name=Kubinception%20and%20etcd&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p style="text-align: left;">Running Kubernetes over Kubernetes was a good idea for the stateless components of the control plane&#8230; but what about the etcd?</p></blockquote>



<div class="wp-block-image"><figure class="aligncenter"><img fetchpriority="high" decoding="async" width="885" height="385" src="/blog/wp-content/uploads/2019/02/IMG_0035.png" alt="Kubinception &amp; etcd" class="wp-image-14435" srcset="https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0035.png 885w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0035-300x131.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0035-768x334.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></figure></div>



<p>In our precedent post, we described the Kubinception architecture, how we run Kubernetes over Kubernetes for the stateless components of the customer clusters&#8217;&nbsp; control planes. But what about the stateful component, the etcd?</p>



<p>The need is clear: each customer cluster need to have access to an etcd to be able to store and retrieve data. All the question is where and how to deploy the etcd to make it available to each customer cluster.</p>



<h3 class="wp-block-heading">The simplest idea is not always the good one</h3>



<p>The first approach would be simply following the <strong>Kubinception logic</strong>: for each customer cluster&nbsp;deploying an <strong>etcd cluster as pods</strong> running on the admin cluster.</p>



<div class="wp-block-image wp-image-14429 size-full"><figure class="aligncenter"><img decoding="async" width="885" height="614" src="/blog/wp-content/uploads/2019/02/IMG_0021.png" alt="" class="wp-image-14429" srcset="https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0021.png 885w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0021-300x208.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0021-768x533.png 768w" sizes="(max-width: 885px) 100vw, 885px" /><figcaption>Full Kubinception for the etcd: deploying etcd cluster as pods</figcaption></figure></div>



<p>This full Kubinception approach has the merit to be <strong>simple</strong>, it seems like an extension of what we are doing with the stateless components. But when looking at it in detail, it shows its <strong>flaws</strong>. Deploying an etcd cluster is not as easy and straightforward as deploying stateless and being critical to the cluster operation, <strong>we couldn&#8217;t simply handle it manually</strong>, we needed an <strong>automated approach</strong> to manage it at a higher level.</p>



<h3 class="wp-block-heading">Using the operator</h3>



<p>We weren&#8217;t the only one to think that the complexity of dealing with the deployment and operation on of an etcd cluster on Kubernetes were excessive, the people of CoreOS had noticed it and in 2016 they released <strong>an elegant solution</strong> to the problem: the <a href="https://www.diycode.cc/projects/coreos/etcd-operator" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>etcd operator</strong>.</a></p>



<p>An operator is a specific controller that <strong>extends the Kubernetes API</strong> to easily create, configure and operate instances of c<strong>omplex (often distributed) stateful applications</strong> on Kubernetes. For the record,&nbsp;the concept of operator was introduced by CoreOS with the&nbsp;<a href="https://coreos.com/blog/introducing-the-etcd-operator.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">etcd operator</a>.</p>



<div class="wp-block-image wp-image-14428 size-full"><figure class="aligncenter"><img decoding="async" width="885" height="630" src="/blog/wp-content/uploads/2019/02/IMG_0022.png" alt="Using the etcd operator to deploy the etcd clusters" class="wp-image-14428" srcset="https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0022.png 885w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0022-300x214.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0022-768x547.png 768w" sizes="(max-width: 885px) 100vw, 885px" /><figcaption>Using the etcd operator to deploy the etcd clusters</figcaption></figure></div>



<p>The etcd operator manages etcd clusters deployed to&nbsp;<a href="https://www.ovh.com/fr/kubernetes/" rel="nofollow" data-wpel-link="exclude">Kubernetes</a>&nbsp;and automates operational tasks: creation, destruction, resizing, failover, rolling upgrades, backups&#8230;</p>



<p>As in the precedent solution, the etcd cluster for each customer cluster is<strong> deployed as pods</strong> in the admin cluster.&nbsp;By default, the etcd operator deploys the etcd cluster using l<strong>ocal, non persistent storage</strong> for each etcd pod. That means that if all the pods die&nbsp; (unlikely) or are re-scheduled and spawned in another node (far more likely) we could <strong>lose the etcd data</strong>. And without it, the customer Kubernetes are bricked.</p>



<p>The etcd operator can be <strong>configured to use&nbsp;<a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">persistent volumes</a>&nbsp;(PV)</strong> to store the data, so theoretically the problem was solved. Theoretically because the volume management wasn&#8217;t mature enough when we tested it, and if an etcd pod was killed and re-scheduled, the new pod failed&nbsp; retrieve its data on the PV. So the <strong>risk of total quorum loss</strong> and the bricking of customer cluster was still there with the etcd operator.</p>



<p>In brief, we worked quite a bit with the etcd operator, and we found it not mature enough for our use.</p>



<h3 class="wp-block-heading">The StatefulSet</h3>



<p>Setting aside the operator, another solution was to use a <a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">StatefulSet</a>, a kind of distributed <a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Deployment</a> well suited for managing distributed stateful applications.</p>



<p>There is an <a href="https://github.com/helm/charts/tree/master/incubator/etcd" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">official ETCD Helm chart</a>&nbsp;that allows to deploy ETCD clusters as StafefulSets, that trades off some of the operator flexibility and user-friendliness for a more robust PV management that guarantees that a re-scheduled etcd pod will retrieve its data.</p>



<div class="wp-block-image size-full wp-image-14427"><figure class="aligncenter"><img loading="lazy" decoding="async" width="885" height="605" src="/blog/wp-content/uploads/2019/02/IMG_0023.png" alt="" class="wp-image-14427" srcset="https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0023.png 885w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0023-300x205.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0023-768x525.png 768w" sizes="auto, (max-width: 885px) 100vw, 885px" /><figcaption>Using StatefulSets for the etcd clusters</figcaption></figure></div>



<p>The etcd StatefulSet is<strong> less convenient</strong> that the etcd operator, as it doesn&#8217;t offer the&nbsp; <strong>easy API for operations</strong> as scaling, failover, rolling upgrades or backups.&nbsp; In exchange you get some real i<strong>mprovements in the PV management</strong>. The StatefulSet&nbsp;maintains a <strong>sticky identity</strong> for each of the etcd posts, and that persistent identifier is <strong>maintained across any rescheduling</strong>, making it simply to pair it to its PV.</p>



<p>The system is so <strong>resilient</strong> that, even if we lose all the etcd pods,&nbsp; when Kubernetes re-schedule them they will find their data and the cluster will continue working without problem.</p>



<h3 class="wp-block-heading">Persistent Volumes, latency, and a simple costs calcul</h3>



<p>The etcd StatefulSet <strong>seemed a good solution</strong>&#8230; until we began to use it in an intensive way. The etcd StatefulSet uses PV, i.e. <strong>network storage</strong> volumes. And etcd is rather sensible to network <strong>latency</strong>,&nbsp; its performance degrades heavily when faced to latency.</p>



<p>Even if the latency could be kept under control (and that&#8217;s a big <em>if</em>), the more we thought about the idea, the more it seemed an <strong>expensive</strong> solution.&nbsp;For each customer cluster we would need to deploy three pods (effectively <strong>doubling the pod count</strong>) and three associated PV, it doesn&#8217;t scale well for a managed service.</p>



<p>In <a href="https://www.ovh.com/fr/kubernetes/" data-wpel-link="exclude">OVH Managed Kubernetes service</a> we bill our customers according to the number of worker nodes they consume, i.e. the control plane is free.&nbsp;That means that for the service to be competitive it&#8217;s important to keep under control the resources consumed by the control planes, so the need not to double the pod count with the etcd.</p>



<p>With Kubinception we had tried to think <strong>outside the box</strong>, it seemed that for etcd we needed to get out of that box once again.</p>



<h3 class="wp-block-heading">Multi-tenant etcd cluster</h3>



<p>If we didn&#8217;t want to deploy the etcd inside Kubernetes, the alternative was to deploy it outside. We chose to deploy a <strong>multi-tenant etcd cluster on dedicated server</strong>s. All the customer clusters would use the same ETCD, every API server getting its own space in this multi-tenant etcd cluster.</p>



<div class="wp-block-image size-full wp-image-14426"><figure class="aligncenter"><img loading="lazy" decoding="async" width="885" height="696" src="/blog/wp-content/uploads/2019/02/IMG_0024.png" alt="" class="wp-image-14426" srcset="https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0024.png 885w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0024-300x236.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2019/02/IMG_0024-768x604.png 768w" sizes="auto, (max-width: 885px) 100vw, 885px" /><figcaption>Multi-tenant bare-metal dedicated etcd cluster</figcaption></figure></div>



<p>With this solution the r<strong>esiliency is guaranteed</strong> by the usual etcd mechanisms, there is <strong>no latency</strong> problem as the data is in the local disk of each etcd node, and the <strong>pod count</strong> remains under control, so it solves the main problems we had with the other solution. The <strong>trade-off</strong> here is that we need to <strong>install and operate</strong> this external etcd cluster, and manage the <strong>access control</strong> to be sure that every API server access only to its own data.</p>



<h3 class="graf graf--h3 wp-block-heading">What’s next?</h3>



<p>In the next posts in the Kubernetes series we will dive into other aspects of the construction of OVH Managed Kubernetes, and we will give the keyboard to some of our <strong>beta customers</strong> to narrate their <strong>experience</strong> using the service.</p>



<p>Next week let’s focus on another topic, we will deal with&nbsp;<b>&nbsp;<a href="https://github.com/ovh/tsl" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">TSL</a>&nbsp;</b>query language, and why did we create and open sourced it…</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fkubinception-and-etcd%2F&amp;action_name=Kubinception%20and%20etcd&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Kubinception: using Kubernetes to run Kubernetes</title>
		<link>https://blog.ovhcloud.com/kubinception-using-kubernetes-to-run-kubernetes/</link>
		
		<dc:creator><![CDATA[Horacio Gonzalez]]></dc:creator>
		<pubDate>Fri, 25 Jan 2019 09:13:08 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Kubinception]]></category>
		<category><![CDATA[OVHcloud Managed Kubernetes]]></category>
		<guid isPermaLink="false">https://blog.ovh.com/fr/blog/?p=14319</guid>

					<description><![CDATA[When faced with the challenge of building a managed Kubernetes service at OVH, fully based on open-source tools, we had to take some tough design decisions. Today we review one of them…<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fkubinception-using-kubernetes-to-run-kubernetes%2F&amp;action_name=Kubinception%3A%20using%20Kubernetes%20to%20run%20Kubernetes&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p class="graf graf--h4">When faced with the challenge of building a managed Kubernetes service at OVH, fully based on open-source tools, we had to take some tough design decisions. Today we review one of&nbsp;them…</p></blockquote>



<div class="wp-block-image graf graf--figure"><figure class="aligncenter"><img loading="lazy" decoding="async" width="300" height="140" src="/blog/wp-content/uploads/2019/01/kubinception-header-300x140.jpg" alt="Kubinception" class="wp-image-14332" srcset="https://blog.ovhcloud.com/wp-content/uploads/2019/01/kubinception-header-300x140.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2019/01/kubinception-header-768x358.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2019/01/kubinception-header.jpg 885w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure></div>



<p class="graf graf--p">One of the most structural choices we made while building <a href="https://www.ovh.com/fr/kubernetes/" data-wpel-link="exclude"><strong class="markup--strong markup--p-strong">OVH Managed Kubernetes</strong></a> service was to deploy our customers’ clusters over our own ones. <strong class="markup--strong markup--p-strong">Kubinception</strong> indeed…</p>



<p class="graf graf--p">In this post we are relating our experience running Kubernetes over Kubernetes, with hundreds of customers’ clusters. Why did we choose this architecture? What are the main stakes with such a design? What problems did we encounter? How did we deal with those issues? And, even more important, if we had to take the decision today, would we choose again to do the Kubinception?</p>



<h3 class="graf graf--h3 wp-block-heading">How does a Kubernetes cluster&nbsp;work?</h3>



<p class="graf graf--p">To fully understand why we run Kubernetes on Kubernetes, we need at least a basic understanding of how a Kubernetes cluster works. A <a class="markup--anchor markup--p-anchor" href="https://kubernetes.io/docs/concepts/" target="_blank" rel="noopener noreferrer nofollow external" data-href="https://kubernetes.io/docs/concepts/" data-wpel-link="external">full explanation on this topic</a> is out of the context of this post, but let’s do a quick summary:</p>



<p class="graf graf--p">A working Kubernetes cluster is composed of:</p>



<ul class="postList wp-block-list"><li class="graf graf--li">A <strong class="markup--strong markup--li-strong">control plane</strong> that makes global decisions about the cluster, and detects and responds to cluster events. This control plane is composed of several <a class="markup--anchor markup--li-anchor" href="https://kubernetes.io/docs/concepts/overview/components/#master-components" target="_blank" rel="noopener noreferrer nofollow external" data-href="https://kubernetes.io/docs/concepts/overview/components/#master-components" data-wpel-link="external">master components</a>.</li><li class="graf graf--li">A set of <a class="markup--anchor markup--li-anchor" href="https://kubernetes.io/docs/concepts/architecture/nodes/" target="_blank" rel="noopener noreferrer nofollow external" data-href="https://kubernetes.io/docs/concepts/architecture/nodes/" data-wpel-link="external">nodes</a>, worker instances containing the services necessary to run <a class="markup--anchor markup--li-anchor" href="https://kubernetes.io/docs/concepts/workloads/pods/pod/" target="_blank" rel="noopener noreferrer nofollow external" data-href="https://kubernetes.io/docs/concepts/workloads/pods/pod/" data-wpel-link="external">pods</a>, with some node components running on every node, maintaining running pods and providing the Kubernetes runtime environment.</li></ul>



<figure class="graf graf--figure">
</figure>



<div class="wp-block-image graf-image"><figure class="aligncenter"><img decoding="async" src="https://cdn-images-1.medium.com/max/800/1*SBeqRVXUkpAV1vB65yJ3Hg.png" alt="Simplified Kubernetes architecture"/><figcaption>Simplified Kubernetes architecture</figcaption></figure></div>



<figcaption class="imageCaption"></figcaption>



<h4 class="graf graf--h4 wp-block-heading">Master components</h4>



<p class="graf graf--p">In this category of components we have:</p>



<ul class="postList wp-block-list"><li class="graf graf--li"><strong class="markup--strong markup--li-strong">API Server</strong>: exposes the Kubernetes API. It is the entry-point for the Kubernetes control plane.</li><li class="graf graf--li"><strong class="markup--strong markup--li-strong">Scheduler</strong>: watches newly created pods and selects a node for them to run on, managing ressource allocation.</li><li class="graf graf--li"><strong class="markup--strong markup--li-strong">Controller-manager</strong>: run controllers, control loops that watch the state of the cluster and move it towards the desired state.</li><li class="graf graf--li"><strong class="markup--strong markup--li-strong">ETCD</strong>: Consistent and highly-available key value store used as Kubernetes’ backing store for all cluster data. This topic deserves its own blog post, so we speaking about it in the coming weeks.</li></ul>



<h4 class="graf graf--h4 wp-block-heading">Node components</h4>



<p class="graf graf--p">In every node we have:</p>



<ul class="postList wp-block-list"><li class="graf graf--li"><strong class="markup--strong markup--li-strong">Kubelet</strong>: agent that makes sure that containers described in PodSpecs are running and healthy. It’s the link between the node and the control plane.</li><li class="graf graf--li"><strong class="markup--strong markup--li-strong">Kube-proxy</strong>: network proxy running in each node, enabling the Kubernetes service abstraction by maintaining network rules and performing connection forwarding.</li></ul>



<h3 class="graf graf--h3 wp-block-heading">Our goal: quick and painless cluster deployment</h3>



<p class="graf graf--p">How come did we go from this that simple Kubernetes architecture to a Kubernetes over Kubernetes one? The answer lies on one of our our main goals building OVH Managed Kubernetes service: to be able to <strong class="markup--strong markup--p-strong">deploy clusters</strong> in the <strong class="markup--strong markup--p-strong">simplest</strong> and most <strong class="markup--strong markup--p-strong">automated</strong> way.</p>



<p class="graf graf--p">And we didn&#8217;t only want to deploy clusters, we wanted the deployed clusters to be:</p>



<ul class="postList wp-block-list"><li class="graf graf--li">Resilient</li><li class="graf graf--li">Isolated</li><li class="graf graf--li">Cost-optimized</li></ul>



<h3 class="graf graf--h3 wp-block-heading">Kubinception: running Kubernetes over Kubernetes</h3>



<p class="graf graf--p">The idea is to use a Kubernetes cluster we are calling admin cluster to deploy customer clusters.</p>



<p class="graf graf--p">As every Kubernetes cluster, the customer clusters have a set of nodes and a control plane, composed of several master components (API server, scheduler…).</p>



<p class="graf graf--p">What we are doing is to <strong class="markup--strong markup--p-strong">deploy</strong> those customer cluster <strong class="markup--strong markup--p-strong">master components as pods</strong> in the admin cluster nodes.</p>



<figure class="graf graf--figure">
</figure>



<div class="wp-block-image graf-image"><figure class="aligncenter"><img decoding="async" src="https://cdn-images-1.medium.com/max/800/1*pFziI2YQgKEYx2qLWP68ww.png" alt="Simplified Kubinception architecture"/><figcaption>Simplified Kubinception architecture</figcaption></figure></div>



<figcaption class="imageCaption"></figcaption>



<p class="graf graf--p">So now we have the stateless components of the customer cluster control plane running as pods in the admin cluster nodes. We haven’t spoken about the ETCD, as we will speak about it in a next post, for the moment let’s only say that is it a dedicated component, living outside Kubernetes.</p>



<p class="graf graf--p">And the customer cluster worker nodes? They are normal Kubernetes nodes: OVH public cloud instances connecting to the customer cluster API server running in an admin cluster pod.</p>



<figure class="graf graf--figure">
</figure>



<div class="wp-block-image graf-image"><figure class="aligncenter"><img decoding="async" src="https://cdn-images-1.medium.com/max/800/1*SqJhBXovAor41w3kTwu9rQ.png" alt="Customer cluster with nodes and ETCD"/><figcaption>Customer cluster with nodes and&nbsp;ETCD</figcaption></figure></div>



<figcaption class="imageCaption"></figcaption>



<p class="graf graf--p">Our goal is to manage lots of cluster, not only one, so how can we add another customer cluster? As you could expect, we deploy the new customer cluster control plane on the admin cluster nodes.</p>



<figure class="graf graf--figure">
</figure>



<div class="wp-block-image graf-image"><figure class="aligncenter"><img decoding="async" src="https://cdn-images-1.medium.com/max/800/1*VJG5LJUK8Ou3MLYlsx3u5g.png" alt="Two customer clusters on Kubinception"/><figcaption>Two customer clusters on Kubinception</figcaption></figure></div>



<figcaption class="imageCaption"></figcaption>



<p class="graf graf--p">From the admin cluster point of view, we have simple deployed three new pods. Then we spawn some new node instances and connect an ETCD and the cluster is up.</p>



<h3 class="graf graf--h3 wp-block-heading">If something can fail, it will do&nbsp;it</h3>



<p class="graf graf--p">We have now an architecture that allows us to quickly deploy new clusters, but if we go back to our goal, quickly deployment was only half of it, we wanted the cluster to be <strong class="markup--strong markup--p-strong">resilient</strong>. Let’s begin with the resiliency.</p>



<p class="graf graf--p">The customer cluster nodes are already resilient, as they are <strong class="markup--strong markup--p-strong">vanilla Kubernetes nodes</strong>, and the ETCD resiliency will be detailed in a specific blog post, so let’s see the control plane resiliency, as it’s the specific part of our architecture.</p>



<p class="graf graf--p">And that’s the beauty of the Kubinception architecture, we are deploying the customer clusters <strong class="markup--strong markup--p-strong">control plane</strong> as simple, standard, vanilla <strong class="markup--strong markup--p-strong">pods</strong> in our admin cluster. And that means they are as resilient as any other Kubernetes pod: if one of the customer cluster master components goes down, the controller-manager of the admin cluster will detect it and the pod will be rescheduled and redeployed, without any manual action on our side.</p>



<h3 class="graf graf--h3 wp-block-heading">What a better way to be sure that our Kubernetes is solid enough…</h3>



<p class="graf graf--p">Basing our Managed Kubernetes service on Kubernetes made us to stumble on facets of Kubernetes we hadn’t found before, to learn lots of things about installing, deploying and operating Kubernetes. And all those knowledge and tooling was <strong class="markup--strong markup--p-strong">directly applied</strong> to our customers clusters, making the experience better for everybody.</p>



<h3 class="graf graf--h3 wp-block-heading">And what about&nbsp;scaling</h3>



<p class="graf graf--p">The whole system has been designed from the ground up with this idea of scaling The Kubernetes over Kubernetes architecture allows easy <strong class="markup--strong markup--p-strong">horizontal scaling</strong>. When an admin cluster begins to get too big, we can simply spawn a new one and deploy there the next customer control planes.</p>



<h3 class="graf graf--h3 wp-block-heading">What’s next?</h3>



<p class="graf graf--p">As this post is already long enough, so I leave the explanation on the <strong class="markup--strong markup--p-strong">ETCD</strong> for the next post in the series, in two weeks.</p>



<p class="graf graf--p">Next week let’s focus on another topic, we will deal with <a class="markup--anchor markup--p-anchor" rel="noopener noreferrer nofollow external" data-href="https://flink.apache.org/" href="https://flink.apache.org/" target="_blank" data-wpel-link="external">Apache Flink</a> and how do we use it for handling alerts at OVH-scale…</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fkubinception-using-kubernetes-to-run-kubernetes%2F&amp;action_name=Kubinception%3A%20using%20Kubernetes%20to%20run%20Kubernetes&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
