Delays in app delivery to Kubernetes

Written by spruha_pandya | Published 2019/04/23
Tech Story Tags: kubernetes | containers | devops | continuous-delivery | docker | delay-in-app | kubernetes-troubleshoots | app-delivery

TLDR Containers bring a lot of complexity to the table for the delivery of apps to Kubernetes. For a bulky enterprise application which may have hundreds of microservices, creating and maintaining containers can become very daunting. DevOps team has to streamline the delivery process and ensure a smooth app delivery process. There is no universally agreed way to do this, choosing one out of several methods ensuring that it is the suitable one for the team on hand is difficult. The technology is comparatively new, there is often a lack of adequate understanding of the technology as well as Docker containers.via the TL;DR App

Enterprises around the world are waking up to the containers and Kubernetes trend. There are numerous benefits of delivering an application as container packages to Kubernetes but at the same time, the process of app containerization and the subsequent app deployment to Kubernetes can hit many roadblocks. Since the idea of using Kubernetes and containers for app delivery is fairly recent, the transition from traditional delivery systems to these modern delivery systems is a bumpy ride.
To modernize, breaking down large applications into smaller microservices is just a start. The main challenge is in continuously delivering these microservices as containers to Kubernetes. Most enterprise teams sink in a lot of time and effort into this and end up with a delayed delivery process.
So, what exactly are these glitches that are causing this delay?

Causes of delay in app delivery

→ In Containerization

With the container technology being a newbie in the enterprise software stack, not many teams have been able to find a way to simplify the complexity that it brings. The containerization process starts with creating a Docker file. This Docker file is supposed to be read by Docker and get a bunch of instructions about how the Docker image should get built. This is followed by creating a build command that uses the docker file to generate a Docker image. When this Docker image runs, you get a docker container. This process is a bit complicated as well as time-consuming if one has to repeat the same for a large number of containers. For a small-scale application with just a couple of services, containerization is easy. But, for a bulky enterprise application which may have hundreds of microservices, creating and maintaining containers can become very daunting.
Add container orchestration to the process, and you see one more level of complexity that involves setting up the orchestrator and deploying to Kubernetes.

→ In Delivery to Kubernetes

Manually deploying containers at scale
Almost all user-facing components in Kubernetes are designed in YAML files. So, for any enterprise application with a lot of interlinked services, there are potentially multiple YAML files and that requires one to be well-accustomed to white-space syntax failing which, the outcome can be frustratingly error prone with no feedback of when and where things go wrong.
If one has that part all worked out, there are several different resource types in Kubernetes applications to be handled. Some of those may need upgrading, and depending on the type of app you are working on, knowing what to update can further complicate deployment to Kubernetes. Doing this for a one-time delivery is still feasible but managing the delivery of a large number of containers to Kubernetes and updating them from time to time is an entirely different scenario. With more iterations, the app delivery tends to become error prone. 
There are also tasks like keeping track of the diff history and managing rollbacks of new and old deployments, adding more layers of complications to the pile.
Too many Alternatives to enable deployment
Of course, there are some automation tools to reduce the work required in deploying an application to Kubernetes. There are many options that offer running Kubernetes as a managed or a hosted platform. That again has several complexities. Firstly, getting your updates or new features rolled out to your running cluster is not as simple as it seems to be. As there is no universally agreed way to do this, choosing one out of several methods ensuring that it is the suitable one for the team on hand is difficult. If you consider involving a deployment automation tool in the process to speed it up, the team is faced with several choices to make. As there is an abundance of tools to automate deployment, the wide array of options makes enterprises stay stuck in analysis paralysis and eventually, causing a delay in achieving a standardized way to deliver apps to Kubernetes. This negates the purpose of using a deployment automation tool in the first place. Even after the automation tool is set in place, there is still a major issue of figuring out some parameters of the CD pipeline to get the tool up and running like version control system, CI system, Docker registry, and Kubernetes cluster.
Once these components are in place, an enterprise is ready with a continuous delivery pipeline for Kubernetes.
The need for context switching for developers while enabling smooth delivery
Containers bring a lot of complexity to the table for the IT operations team as well as developers. As the technology is comparatively new, there is often a lack of adequate understanding of Kubernetes as well as Docker containers. In order to ensure a smooth app delivery process, the DevOps team has to be efficient. If not, there is bound to be a constant struggle to streamline the process. When developers are required to get involved in the container management and delivery process, they take time to get accustomed to container delivery. If that time is utilized in the coding of the application services instead, it is more productive. Sangeetha Narayanan, the Director of Engineering at Netflix says, “Any time spent fighting the system or tools is time not spent delivering value to the business.” while talking about improving the developer experience for a smooth app deployment process. This is applicable to most enterprise app development teams while they try their hand at app delivery to Kubernetes in the process of embracing modernization.
Microservices architecture considered to be a hard prerequisite to using Kubernetes
As microservices work well with containers, it is assumed that the same is the case with Kubernetes. Many enterprises keep delaying the app deployment to Kubernetes because their application is still a legacy one, and miss out on reaping the benefits that Kubernetes has to offer like portability, IT cost savings, and scalability. Though microservices based applications are ideal for Kubernetes in most cases, it is not true for all apps. Wrapping a monolith in a container and deploying it through Kubernetes can work wonders too. For those monoliths which cannot be refactored into microservices because of the costs outweighing the benefits, this approach can jumpstart app modernization efforts and at the same time, speed up the application deployment.

What is the Solution?

The advantages of deploying an enterprise app to Kubernetes supersede the shortcomings that your team faces, leaving you with no alternative other than figuring out a way to overcome these shortcomings. The key is to automate your complete CI/CD pipeline. But, by just saying that you need an automated CI/CD pipeline, does not make all your app delivery delays vanish. For a smoother and faster delivery to Kubernetes, you need an approach that can streamline the process, keeping in mind these specific considerations.

Solution Considerations:

  1. Automation: Automation of the containerization process is the first step towards a smooth app delivery. The need to manually create Docker images for every single app service should be eliminated.
  2. Standardization of process: In order to reduce delays caused while trying to accommodate each custom process and tool, there needs to be one process standardized across teams for delivering applications to Kubernetes.
  3. Self-service delivery experience for developers: All the delays caused due to the DevOps friction can be eliminated if service-centric delivery is enabled by letting developers handle the DevOps configuration all by themselves.
Having all these considerations fulfilled will offer the level of automation in app delivery that most enterprises hope to achieve.
An enterprise can either have a very efficient DevOps team to enable this level of automation or seek the help of an app delivery platform that is purpose-built to offer these features for a smooth delivery process to Kubernetes. There are several app delivery platforms designed just for the purpose. Platforms like HyScale, Codefresh, and OpenShift are some of the options worth exploring.
Depending on the landscape of the enterprise application and the capabilities of the team, you need to act fast and make a decision of how you want to smoothly deliver containerized applications to Kubernetes.

Written by spruha_pandya | A tech enthusiast working with a great team of developers building an open-source platform for AppOps on Kubernetes.
Published by HackerNoon on 2019/04/23