Kubernetes, popularly known as K8s, is an OpenSource application used for automating deployment, scaling and management of containerized applications. It is originally designed by Google ad is now maintained by Cloud Native Computing Foundations. It aims to provide a "platform for automating deployment, scaling and operations of application container across a cluster of hosts." It works with a range of container tools and runs container on clusters.
Kubernetes aim to reduce the burden of orchestrating the underlying compute, network and storage infrastructure and enables application operators as well as developers to focus on container-centric workflows for self-service operation. It provides developers with the functionality to build customised workflows and higher-level automation to deploy and manage applications composed of multiple containers.
By making the containerized applications easier to manage at scale, Kubernetes has become a key part of the container revolution.
The primary advantage of using Kubernetes is that it gives us the platform to schedule and run containers on machines. Either it be a physical device or a virtual machine.
More broadly, Kubernetes help us to fully implement and reply on container-based infrastructure in the production environment. Kubernetes can even act as an automated applicatio management platform, but for containers. Kubernetes provide us with a framework to run distributed systems resiliently as well as it takes care of scaling and failover for our applications, provide deployment patterns and much more.
Kubernetes can expose a container using the DNS name or using their own IP address. If traffic to a container is high, Kubernetes is able to load balance and distribute the network traffic so that the deployment is stable.
Kubernetes allows us to automatically mount a storage system of our choice, such as local storages, public cloud providers, and more.
We can describe the desired state for our deployed containers using Kubernetes, and it can change the actual state to the desired state at a controlled rate. For example, we can automate Kubernetes to create new containers for our deployment, remove existing containers and adopt all their resources to the new container.
We provide Kubernetes with a cluster of nodes that it can use to run containerized tasks. We tell Kubernetes how much CPU and memory (RAM) each container needs. Kubernetes can fit containers onto our nodes to make the best use of our resources.
Kubernetes restarts containers that fail, replaces containers, kills containers that don’t respond to our user-defined health check, and doesn’t advertise them to clients until they are ready to serve.
Kubernetes lets you store and manage sensitive information, such as passwords, OAuth tokens, and SSH keys. We can deploy and update secrets and application configuration without rebuilding our container images, and without exposing secrets in our stack configuration.
As more enterprises run on multi-cloud platforms, they benefit from Kubernetes, as it easily runs any application on any public cloud service or a combination of public and private clouds.
Because Kubernetes can help the development team break down into smaller units to focus on single, targeted, smaller micro-services, these smaller teams tend to be more agile.
Kubernetes can help a company reduce infrastructure costs quite dramatically if it is operating on a large scale.
Kubernetes serves as a critical management system that can scale an application and its infrastructure whenever the workload increases, and reduce it as the load decreases.
Kubernetes can handle re-hosting, re-platforming and refactoring. It offers a seamless route to effectively move an application from the facility to the cloud.
Control plane: The collection of processes that control Kubernetes nodes. This is where all task assignments originate.
Nodes: These machines perform the requested tasks assigned by the control plane.
Pod: A group of one or more containers deployed to a single node. All containers in a pod share an IP address, IPC, hostname, and other resources. Pods abstract network and storage from the underlying container. This lets you move containers around the cluster more easily.
Replication controller: This controls how many identical copies of a pod should be running somewhere on the cluster.
Service: This decouples work definitions from the pods. Kubernetes service proxies automatically get service requests to the right pod — no matter where it moves in the cluster or even if it’s been replaced.
Kubelet: This service runs on nodes, reads the container manifests, and ensures the defined containers are started and running.
kubectl: The command line configuration tool for Kubernetes.
Pinterest, a social media web and mobile app that allows users to save or “pin” information, has a huge user base who have collectively saved more than 200 billion pins across 4 billion boards.
The popular visual discovery engine — Pinterest has become a part of the Kubernetes community. Pinterest has over 250 million monthly active users for whom it provides over 10 billion recommendations. As they knew these numbers are going to grow day by day, they began to realize the pain of scalability and performance issues.
Pinterest has a huge fleet of servers and over 300 petabytes of data. It has been on the cloud since day 1. However, as the company grew, it became an important mission to release the overhead of managing VMs. This is why they evaluated several platforms and finally ended up choosing Kubernetes.
After eight years in existence, Pinterest had grown into 1,000 microservices and multiple layers of infrastructure and diverse set-up tools and platforms. In 2016 the company launched a roadmap towards a new compute platform, led by the vision of creating the fastest path from an idea to production, without making engineers worry about the underlying infrastructure.
As a result of increasing volume and the associated growth of their infrastructure stack, the Pinterest team had several challenges. They stated that their engineers didn’t have a unified experience when launching their workload and that managing huge numbers of virtual machines was creating a huge maintenance load for the infrastructure team.
Furthermore, it was hard to build infrastructure governance tools across the separate systems and to determine which resources could be recycled. The team attempted to address these problems across three key themes: service reliability, infrastructure efficiency and developer productivity.
Their initial strategy was to move their workload from EC2 instances to Docker containers; hence they first moved their services to Docker to free up engineering time spent on Puppet and to have an immutable infrastructure.
Once these services went into production in early 2017, the team began looking at orchestration to help create efficiencies and manage them in a decentralized way.
And then the next strategy was to move to Kubernetes. Now they can take ideas from ideation to production in a matter of minutes whereas earlier they used to take hours or even days. They have cut down so much of overhead cost by utilizing Kubernetes and have removed a lot of manual work without making engineers worry about the underlying infrastructure.
Kubernetes helped Pinterest increase its delivery velocity by bringing down the time-to-market to just minutes. Machine learning is an important use case for Pinterest as it powers its visual discovery engine. Kubernetes allows Pinterest to build, scale, deploy, and iterate its models quickly and easily.
Kubernetes also helps provide Pinterest a clean abstraction as it takes care of several previously manual jobs and lets developers focus on innovation. This shows how Kubernetes helps organizations minimize manual work and removes the clutter.
By moving to Kubernetes the team was able to build on-demand scaling and new failover policies, in addition to simplifying the overall deployment and management of a complicated piece of infrastructure such as Jenkins. -- Micheal Benedict, Product Manager, Pinterest