The term ‘cloud native’ is responsible for significant confusion in conversations about contemporary application development because of a lack of clarity about its meaning. For example, contemporary usage of the term often equates it with applications that are optimized for cloud computing infrastructures.  Another use of the term equate it with cloud-based applications that are accessed by a web browser. Both these definitions of cloud native applications are inaccurate. This article elaborates on the definition of cloud-native applications and proposes, in keeping with the Cloud Native Computing Foundation, that cloud-native applications are defined as exemplary of microservices architectures, container-based and dynamic orchestration:

Containers
The first thing to remember about cloud-native applications is that they are first and foremost container-native applications, which means they are constituted by containers. Containers are packages of software that contain everything that an application needs to run. For example, containers encapsulate code, runtime, toolchains, libraries and settings. By packaging everything that an application needs to run, containers empower developers to focus on application design and logic while delegating the deployment and operational management of containers to IT operators.

Containers abstract applications from the environment in which they are deployed, thereby enabling applications to be written once and deployed anywhere. They also deliver consistent application environments that improve collaboration between developers and operators by ensuring that the same application environment used for the development of an application is subsequently used later in the application development lifecycle for deployment. Separate from their abstraction of application dependencies and delivery of consistent application environments, containers deliver a slew of benefits related to application performance, portability, fault isolation and security.

Microservices
Microservices architectures structure an application as a suite of services that implement business capabilities. These services can be independently deployed in a modular architecture that delivers a decentralized approach to the development of software. An example of this decentralized approach extends not only to the segmentation of application and business logic within discrete microservices, but also to databases. In other words, each independent microservice in an application tends to manage a separate database, even if that database happens to be a replica of another database tied to another microservice.

Container Orchestration
Container orchestration platforms take responsibility for automating the deployment, replication, scaling, load balancing and self-healing of container-based applications. In addition, they assume responsibility for automating the rollout of upgrades and the rollback to previous versions as desired. Whereas cloud computing platforms orchestrate technologies by automating the provisioning and scaling of infrastructure, for example, container orchestration platforms dynamically automate the allocation of resources to container-based applications in a similar vein.

Conclusion
The conjunction of containers, microservices and container orchestration frameworks enables developers to build applications characterized by scalability, elasticity, resilience, efficient resource consumption and portability. Architected properly, container orchestration frameworks such as Kubernetes can deliver high availability to applications as well.

Meanwhile, from a development perspective, cloud-native applications improve the development experience by enabling a high degree of development agility in addition to enhancing collaboration between development and operations teams. Moreover, cloud-native applications automate many of the manual processes required for managing the underlying infrastructure on which applications run, and correspondingly empower developers to focus on writing code as opposed to tackling the operational challenge of managing infrastructure.

The emphasis of cloud-native applications and development on development agility and automation bears notable similarities with the agility and automation delivered by cloud computing practices to the management of infrastructure, although the attributes of cloud-native applications and development do not necessarily map neatly to those of cloud computing in a one-to-one, one-to-many, many-to-one or many-to-many fashion. As such, cloud native applications and development represent a disruptive innovation to previous models of application design, development and delivery that borrows concepts commonly used in conversations about cloud computing, without replicating them or even using them as a foundational infrastructure.