Containers package applications and all its dependencies to make it portable across different computing environments. Containers gave the flexibility for running cloud native applications on physical or virtual infrastructure much more efficiently. It allows to scale up or scale down application instances based on spikes in demand. Kubernetes is one of the most widely used container orchestration tool.
This article explores the challenges and complexities in using/deploying/managing containers using Kubernetes.
WHY KUBERNETES (K8s)?
It is easy to manage individual containers, but managing hundreds of containers spread across multiple hosts is woefully complex. Containers need to be managed and connected to the outside world for tasks such as scheduling, load balancing, distribution, scaling, etc. and this is where a container orchestration tool like Kubernetes (K8s) comes into play.
Kubernetes was built by Google team based on its own experience in running thousands of containers in production. This ensured Kubernetes to be one of the rock-solid platform that can meet the scaling needs of virtually any organization.
COMPLEXITY IS THERE!
Kubernetes itself is a huge open source project with significant operational complexity and a sharp learning curve. Though K8s were intended to abstract away the complexities of infrastructure and the management of containers, developers still find it challenging and complex. Interestingly, the recent 2020 CNCF (Cloud Native Computing Foundation) survey showed ‘complexity as one of the top challenges in using and deploying containers’.
Comparison of CNCF Survey Results (2019 Vs 2020) on top challenges in using/deploying containers shows that ‘complexity’ has moved up to the top position in 2020 survey from third position in 2019 survey.
Fig. 1: Source CNCF Survey 2019
Fig. 2: Source CNCF Survey 2020
WHAT MAKES K8s COMPLEX?
Kubernetes is a complex system designed to solve a complex problem. Find below some of the most common reasons, why Kubernetes is complex.
Distributed System:Kubernetes is a distributed system. There are many components, main machines, worker machines, schedulers, etc. When you scale up there could be tens or hundreds of distributed machines. There are many different services, systems and pieces. Creating, testing, debugging and managing distributed systems are often complex.
Hard to use:It is no picnic to operate a Kubernetes cluster. It is hard and painful to learn and use Kubernetes following the best practices.
Inherent Complexity: There is architectural complexity, operational complexity, configuration complexity and conceptual level complexities in Kubernetes. It is a huge open source project.
Abstractions: Kubernetes does a lot and brings in a lot of new abstractions, loading to more complexity which is in fact somewhat necessary for such a large system.
Learning Curve: Steep learning curve. Not all engineering teams have the same skill levels or are ready to try out new technologies and projects.
DevOps: Development and operations becomes more complex. Setting up K8s environments for development, testing and staging locally and running it becomes hard. Need larger teams.
Lack of Expertise: There is scarcity of expertise and expert resources. Kubernetes expertise is still not at large and it is costly too.
Numerous Features: A part of the complexity is because of the sheer number of options available in Kubernetes and the decisions to be made to choose the right and optimal ones.
Impact on Business: For organizations, complexity impacts adoption, training, migration, the speed of delivery as well as the speed of recovery when issues arise. There are enterprises who spent tens of thousands of dollars and still not able to successfully migrate to Kubernetes.
HASSLE FREE KUBERNETES?
Yes, with proper understanding, automation, usage of managed services, platforms and expert consulting, you can achieve hassle free Kubernetes adoption.
How to make it Hassle Free?
Change of perception: First of all, Kubernetes is not complex given the problem it solves. A complex tool solving a complex problem will not be a simple one naturally. Kubernetes was in fact developed to help manage the complexity of containerized micro service architectures.
Steer it well: Kubernetes is an engine, put in a better steering wheel to drive it. Seek the help of experts, managed cloud services and right partners. There are experienced teams with proven products/platforms who can help you in your Kubernetes journey.
Getting better with age: As it grows, it is getting better and is becoming easier to use every day. Kubernetes is not getting complicated with age, like what happened to Hadoop project.
Right use case: Use it for the right use cases. Kubernetes is a complex orchestration tool and remember it is not ideal for all use cases.
Compatibility: Kubernetes is structured in such a way that, you can extend it and still be compatible with the base version. Kubernetes with dozens of operators is still Kubernetes (not a new version of the product).
Use only required bells and whistles: Every one won’t require all the abstractions, bells and whistles in Kubernetes all the time. There are plenty of people using Kubernetes in simpler ways.
Grow Organically: If you grow organically no system will feel complex. Follow an organic path for Kubernetes migration.
Productivity: Kubernetes resources build understanding and skills around common problems based on a set of Kubernetes abstractions. So resources become more productive, valuable and switchable across different environments, projects and jobs.
Learn once, apply anywhere: Complexity of Kubernetes you master, the knowledge, can follow you from projects to projects. This way it becomes less complex compared to other systems.
Lowering the barrier to entry: One can setup, run and learn Kubernetes locally, much easier than other similar systems, lowering the entry barrier and combating perceived complexity.
Managed Services: Most cloud providers offer managed Kubernetes solutions, which helps most users with managing the complexity at scale. Managed platform will streamline things for the platform team as well as the developers.
Guardrails: Use necessary guardrails to make sure developers don’t mess things.
Automation: At an organizational and procedure level, the best way to reduce complexity is thru automation. Kubernetes feels much more complex when someone has to turn all the knobs manually, but once the right automation tools are in place, configurations or policies only have to be set once.
Separate team: Do not drag developers down the level to learn the complexities of Kubernetes and management of infrastructure, rather use expert teams or proven products for one touch deployments. Let them be more productive at where they are good at.
Reliability: Kubernetes complexity is some that you can rely on. Kubernetes comes with inbuilt features for health check, rolling deployments, etc. and reduces down time.
Kubernetes continue to thrive as the industry standard for container orchestration. More and more cloud providers, services and third party vendors will come up with products and solutions, which will abstract away the complexities of infrastructure and distributes systems from us and the developers would focus more on their code and will become more productive. Business can scale up and release their products and services more frequently to beat the market competition. Sometimes procedural and organizational changes to adopt Kubernetes is more challenging than learning a new technology like Kubernetes.
Solution Architect and IT Consultant with more than 25 yrs of IT Experience. Served various roles with both national and international institutions. Expertise in working with both legacy and advanced technology stacks in various business domains.