그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그 그
Machine Controller Manager
7 minute read
Kubernetes is a cloud-native enabler built around the principles for a resilient, manageable, observable, highly automated, loosely coupled system. We know that Kubernetes is infrastructure agnostic with the help of a provider specific Cloud Controller Manager. But Kubernetes has explicitly externalized the management of the nodes. Once they appear - correctly configured - in the cluster, Kubernetes can use them. If nodes fail, Kubernetes can’t do anything about it, external tooling is required. But every tool, every provider is different. So, why not elevate node management to a first class Kubernetes citizen? Why not create a Kubernetes native resource that manages machines just like pods? Such an approach is brought to you by the Machine Controller Manager (aka MCM), which, of course, is an open sourced project. MCM gives you the following benefits:
- seamlessly manage machines/nodes with a declarative API (of course, across different cloud providers)
- integrate generically with the cluster autoscaler
- plugin with tools such as the node-problem-detector
- transport the immutability design principle to machine/nodes
- implement e.g. rolling upgrades of machines/nodes
Machine Controller Manager aka MCM
Machine Controller Manager is a group of cooperative controllers that manage the lifecycle of the worker machines. It is inspired by the design of Kube Controller Manager in which various sub controllers manage their respective Kubernetes Clients.
Machine Controller Manager reconciles a set of Custom Resources namely MachineDeployment
, MachineSet
and Machines
which are managed & monitored by their controllers MachineDeployment Controller
, MachineSet Controller
, Machine Controller
respectively along with another cooperative controller called the Safety Controller
.
Understanding the sub-controllers and Custom Resources of MCM
The Custom Resources MachineDeployment
, MachineSet
and Machines
are very much analogous to the native K8s resources of Deployment
, ReplicaSet
and Pods
respectively. So, in the context of MCM:
MachineDeployment
provides a declarative update forMachineSet
andMachines
.MachineDeployment Controller
reconciles theMachineDeployment
objects and manages the lifecycle ofMachineSet
objects.MachineDeployment
consumes a provider specificMachineClass
in itsspec.template.spec
, which is the template of the VM spec that would be spawned on the cloud by MCM.MachineSet
ensures that the specified number ofMachine
replicas are running at a given point of time.MachineSet Controller
reconciles theMachineSet
objects and manages the lifecycle ofMachine
objects.Machines
are the actual VMs running on the cloud platform provided by one of the supported cloud providers.Machine Controller
is the controller that actually communicates with the cloud provider to create/update/delete machines on the cloud.- There is a
Safety Controller
responsible for handling the unidentified or unknown behaviours from the cloud providers. - Along with the above Custom Controllers and Resources, MCM requires the
MachineClass
to use K8sSecret
that stores cloudconfig (initialization scripts used to create VMs) and cloud specific credentials.
Workings of MCM
In MCM, there are two K8s clusters in the scope — a Control Cluster and a Target Cluster. The Control Cluster is the K8s cluster where the MCM is installed to manage the machine lifecycle of the Target Cluster. In other words, the Control Cluster is the one where the machine-* objects are stored. The Target Cluster is where all the node objects are registered. These clusters can be two distinct clusters or the same cluster, whichever fits.
When a MachineDeployment
object is created, the MachineDeployment Controller
creates the corresponding MachineSet
object. The MachineSet Controller
in-turn creates the Machine
objects. The Machine Controller
then talks to the cloud provider API and actually creates the VMs on the cloud.
The cloud initialization script that is introduced into the VMs via the K8s Secret
consumed by the MachineClasses
talks to the KCM (K8s Controller Manager) and creates the node objects. After registering themselves to the Target Cluster, nodes start sending health signals to the machine objects. That is when MCM updates the status of the machine object from Pending
to Running
.
More on Safety Controller
Safety Controller contains the following functions:
Orphan VM Handling
- It lists all the VMs in the cloud; matching the tag of given cluster name and maps the VMs with the
Machine
objects using theProviderID
field. VMs without any backingMachine
objects are logged and deleted after confirmation. - This handler runs every 30 minutes and is configurable via
--machine-safety-orphan-vms-period
flag.
Freeze Mechanism
Safety Controller
freezes theMachineDeployment
andMachineSet controller
if the number ofMachine
objects goes beyond a certain threshold on top of theSpec.Replicas
. It can be configured by the flag--safety-up
or--safety-down
and also--machine-safety-overshooting-period
.Safety Controller
freezes the functionality of the MCM if either of thetarget-apiserver
or thecontrol-apiserver
is not reachable.Safety Controller
unfreezes the MCM automatically once situation is resolved to normal. Afreeze
label is applied onMachineDeployment
/MachineSet
to enforce the freeze condition.
Evolution of MCM from In-Tree to Out-of-Tree (OOT)
MCM supports declarative management of machines in a K8s Cluster on various cloud providers like AWS, Azure, GCP, AliCloud, OpenStack, Metal-stack, Packet, KubeVirt, VMWare, Yandex. It can, of course, be easily extended to support other cloud providers.
Going ahead, having the implementation of the Machine Controller Manager supporting too many cloud providers would be too much upkeep from both a development and a maintenance point of view. Which is why the Machine Controller
component of MCM has been moved to Out-of-Tree design, where the Machine Controller
for each respective cloud provider runs as an independent executable, even though typically packaged under the same deployment.
This OOT Machine Controller will implement a common interface to manage the VMs on the respective cloud provider. Now, while the Machine Controller
deals with the Machine
objects, the Machine Controller Manager (MCM) deals with higher level objects such as the MachineSet
and MachineDeployment
objects.
A lot of contributions are already being made towards an OOT Machine Controller Manager for various cloud providers. Below are the links to the repositories:
- Out of Tree Machine Controller Manager for AliCloud
- Out of Tree Machine Controller Manager for AWS
- Out of Tree Machine Controller Manager for Azure
- Out of Tree Machine Controller Manager for GCP
- Out of Tree Machine Controller Manager for KubeVirt
- Out of Tree Machine Controller Manager for Metal
- Out of Tree Machine Controller Manager for vSphere
- Out of Tree Machine Controller Manager for Yandex
Watch the Out of Tree Machine Controller Manager video on our Gardener Project YouTube channel to understand more about OOT MCM.
Who Uses MCM?
MCM is originally developed and employed by a K8s Control Plane as a Service called Gardener. However, the MCM’s design is elegant enough to be employed when managing the machines of any independent K8s clusters, without having to necessarily associate it with Gardener.
Metal-stack is a set of microservices that implements Metal as a Service (MaaS). It enables you to turn your hardware into elastic cloud infrastructure. Metal-stack employs the adopted Machine Controller Manager to their Metal API. Check out an introduction to it in metal-stack - kubernetes on bare metal.
Sky UK Limited (a broadcaster) migrated their Kubernetes node management from Ansible to Machine Controller Manager. Check out the How Sky is using Machine Controller Manager (MCM) and autoscaler video on our Gardener Project YouTube channel.
Also, other interesting use cases with MCM are implemented by Kubernetes enthusiasts, who for example adjusted the Machine Controller Manager to provision machines in the cloud to extend a local Raspberry-Pi K3s cluster. This topic is covered in detail in the 2020-07-03 Gardener Community Meeting on our Gardener Project YouTube channel.
Conclusion
Machine Controller Manager is the leading automation tool for machine management for, and in, Kubernetes. And the best part is that it is open sourced. It is freely (and easily) usable and extensible, and the community more than welcomes contributions.
If you want to know more about Machine Controller Manager or find out about a similar scope for your solutions, feel free to visit the GitHub page machine-controller-manager. We are so excited to see what you achieve with Machine Controller Manager.