The Cloud Native Computing Foundation (CNCF) defines Cloud Native as “technologies [that] empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach”.
Cloud native is a modern approach to building, running, and managing services. Cloud native systems aim to achieve rapid change, large scale, and reliability. To achieve this, several modern technologies and practices, like microservices, containers, CI/CD, or DevOps, are paramount.
Furthermore, CNCF states that “these techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil”.
Cloud native is less about where an application runs and more about how it’s built, deployed and managed.? With what in mind, what are cloud native infrastructure and applications?
Why Cloud Native?
Similar to other terms, like “DevOps”, “cloud native” is becoming an overloaded term, being used left, right, and center by everyone. In its essence, it’s an evolution of technology to the new world of “the cloud”. That said, it’s no guarantee for success, but companies like Google, Netflix, Facebook, or Amazon have proven, time and time again, that these techniques provide the scalability and agility required to succeed. They enable you to build your products and consume whatever services you require.
Although vendor lock-in can be a concern, when you build everything yourself you require the expertise to do so. If that’s not your core business, consuming services will empower your ability to change and add value to the business. Conversely, if you don’t have the opportunity to consume services, you should build applications to manage such services and their underlying infrastructure. That way, the number of engineers required to build and manage them doesn’t scale linearly with the number of services.
Cloud native means you treat your infrastructure the same you treat your applications. This makes it resilient and easier to debug. You can use the same set of tools and practices you use to manage your business applications. A goal of DevOps is to bridge the gap between software and operations engineers and cloud native can help bridge that gap. Operations engineers learn the best practices from software engineering and software engineers take full ownership of their services.
Cloud Native Infrastructure
Just because you moved your services to a public cloud, it doesn’t mean your infrastructure is cloud native. Running services in a public cloud only means you’re renting server time from someone and if you keep managing infrastructure the same way, you’ll fail to benefit from it.
Cloud native infrastructure is not about running services in containers. Take Netflix for example, which pioneered a lot of what we today call cloud native and did almost all of that running virtual machines. The way you package your services, if they are built automatically and continuously deployed does not mean you’re benefiting from cloud native infrastructure. At the same time, using a container orchestrator like Kubernetes or Nomad does not guarantee that you’re running a cloud native infrastructure. It’s a good step towards that but there’s a lot to be done. Although container orchestrators provide a lot of cloud native functionality, applications need to be built to take advantage of them.
Cloud native infrastructure is all about useful abstractions. Abstractions are useful because they hide complexity and enable more complex use cases. Abstractions allow their users to operate on a higher level, without continuously having to reinvent the wheel. Cloud native infrastructure creates a platform that enables autonomous application management. Those abstractions are hidden behind APIs, managed by software with the goal of running applications. They create a new layer for controlling the Infrastructure as a Service (IaaS) with well-defined APIs that allow infrastructure to be dynamically created, scaled, and allocated. Building it this way enables a new way to manage infrastructure since it enables scale, improves resiliency, facilitates provisioning, and enhances maintainability.
Cloud native infrastructure influences more than just infrastructure. The services that run on this type of infrastructure are heavily influenced by it. Just like the advent of the cloud changed the way companies treat infrastructure, cloud native changed the way applications and infrastructure interact.
Cloud Native Applications
Cloud native applications are engineered for operability, observability, and reliability. Operability means applications have control over their own lifecycle instead of being controlled by external processes and checks. Observability means applications provide the necessary data (metrics, traces, and logs) that is required to better understand what is happening and why. Reliability means that applications embrace failure instead of avoiding it.
Cloud native applications are different from traditional ones. They expect to be run in a dynamic environment, mostly autonomously and do not expect to be tightly coupled to a server’s operating systems. To be run and managed this way, they require a platform that can observe them and react when failure happens. Cloud native applications are meant to be run by software, not humans, and they interact with the infrastructure and supporting services directly.
Cloud native applications should be declarative, not reactive. By being declarative, they standardized the communication model and move the functional implementation of how something “gets done” from the application to an API or service. Kubernetes, for example, does just that. By declaring resources, when a change is found, a reconciliation process will ensure the desired state is achieved. This allows applications to be simpler and to behave in a predictable way.
Cloud native is a new paradigm to run infrastructure and applications, different from the traditional way of running services. There are a lot of responsibilities that have migrated from infrastructure into services.
Cloud native infrastructure is responsible for a holistic view of the system. It’s responsible for resource management, orchestration, and service discovery. It provides an abstraction layer where services can be built on and where they can rely on APIs, instead of individual services, to be autonomous. By adopting microservices architectures, services are decomposed into smaller units of complexity. Applications provide metrics, traces, and logs that enable reliability practices to be built directly into the applications themselves.
Understanding these key premisses about cloud native is important to help you decide if cloud native infrastructure and applications are worth the investment.