Why Developers Should Learn Kubernetes
Driven by the rise of container-based workflows for software development, Kubernetes has seen a surge in adoption in recent years as the platform of choice to deploy these containers.
Since 2016, the Cloud Native Computing Foundation has conducted a yearly survey to assess the adoption of containers and cloud native technologies by various engineering organizations. According to the CNCF 2020 survey respondents, 92% of companies are running containers in production, and 83% of them are using Kubernetes as their orchestration tool.
At the same time, many organizations are also adopting DevOps and Site Reliability Engineering (SRE) best practices to improve their applications’ reliability and the time it takes to deliver new application features.
Due to this adoption, engineering teams are seeing the benefits of merging operational and development best practices. Operations teams are becoming more service- and software-oriented, and development teams are learning about the platforms and environments on which they deploy their applications.
Much of the focus in recent years has been on software development as applied to operational best practices, which has resulted in significant improvements in delivery and reliability. Sometimes though, there is a gap where development teams don’t always have the operational skills needed to work with their applications outside of a development environment efficiently.
While building and shipping containerized applications may eliminate the need to maintain unique development environments, it is crucial that developers understand how containers work at runtime. Especially when using an orchestrator like Kubernetes, and even more so in production. It may not be necessary for developers to have a complete operations skill set but they need to learn enough about Kubernetes and the production environment to be a reliable participant in a DevOps team.
Along with DevOps and SRE adoption, there is also a lot of discussion about “shifting left” in the software development world. At its core, shifting left means focusing on moving problem detection and prevention earlier in the software development lifecycle (SDLC) to improve overall quality. More robust, automated continuous integration/continuous delivery (CI/CD) pipelines and testing practices are prime examples of how this works.
Shifting left applies to operational best practices as well. Once upon a time, developers would code their applications and then hand them off to operations to deploy into production. Things have changed dramatically since that time, and old models don’t work the way they once did.
Knowing about the platform that the application lives on is critical. Successful engineering organizations work hard to ensure development and operations teams avoid working in silos. Instead, they aim to collaborate earlier in the software development lifecycle so that coding, building, testing and deployments are all well understood by all teams involved in the process.
Developers don’t need to be experts in Kubernetes, but they should be proficient in skills that can impact the performance of their applications. Skills such as CI/CD, deployments to production, monitoring, and understanding CPU, memory, and cluster and pod health are vital pieces of the application puzzle.
Understanding some basics about the application platform and tools that an organization uses goes a long way towards making both development and operations more efficient. Having these skills helps developers respond to incidents quickly and more effectively, thereby troubleshooting issues without escalating to another team when something goes wrong.
What Developers and Operations Teams Need to Know
Both developers and operations engineers need to understand a few things about what their peers know.
- They need to understand the peculiarities of the various services and features of their chosen cloud provider compared to other providers. This knowledge should apply whether the cloud is public, private or hybrid.
- They need to be cognizant of the financial impact of resourcing their applications and understand how to reduce costs and eliminate waste as it applies from a developer’s perspective. It’s straightforward to spin up a new environment and infrastructure in the cloud, and that also means it’s easy to forget how quickly those costs can add up if we mismanage resources. For example, it’s a good idea to consider auto-scaling policies and their effect on costs when those policies aren’t set correctly.
- They need to know application performance management, especially the tools and techniques used to analyze and improve application performance.
- They need to know the proper incident response techniques to deal with incidents when they happen and escalate them when appropriate. One of the fundamental tenets of DevOps is to accept and find ways to mitigate failure, so efficiently and effectively dealing with incidents when they come up is critical.
- They need to establish feedback loops on both sides of the development and operations fence so that all teams know of any deficiencies in their tools or applications and how the developers might correct them. Shared ownership of tools and environments is an excellent way to encourage this.
So what should developers specifically learn about Kubernetes?
- How their organization’s CI/CD system works, from concept to production, from code check-in to building, testing and deployment.
- Kubernetes pods and their relationship to containers.
- How applications interact with Kubernetes networking, including services, DNS and load balancing.
- Knowledge about commonly used tools for local testing of their deployment and for modeling how their app is deployed, such as minikube, kubectl, helm, kind, and the Kubernetes dashboard.
- Monitoring, logging and debugging clusters and containers for when things go wrong.
Of course, there’s much more that both operations and development teams could understand about how they all can work together, but these are a great place to start.