This is just my opinion. Feedback is encouraged. I did a lot of thinking about definitions when writing
Cloud Native Infrastructure with Kris Nova last year.
In the book I define cloud native infrastructure as
Cloud native infrastructure is infrastructure that is hidden behind useful abstractions, controlled by APIs, managed by software, and has the purpose of running applications.
The definitions for the CNCF are not just about running infrastructure and also impact how applications are designed and managed.
I defined cloud native applications as
A cloud native application is engineered to run on a platform and is designed for resiliency, agility, operability, and observability. Resiliency embraces failures instead of trying to prevent them; it takes advantage of the dynamic nature of running on a platform. Agility allows for fast deployments and quick iterations. Operability
adds control of application life cycles from inside the application instead of relying on external processes and monitors. Observability provides information to answer questions about application state.
A possible elevator pitch could be something like.
Declarative, dynamic, resilient, and scalable.
For me these expand to mean
Declarative APIs backed by infrastructure as software (not static code) that converge on a desired state. This applies to infrastructure, policy, application deployments, everything!
Dynamic because of the high rate of change and making frequent deployments (applications and infrastructure). This also can be used to describe service discovery as well as testing patterns and service mesh style routing.
Resilient to changes and discovery of environments. Microservices is one pattern for this but it also can include other options. Resiliency enables reliability which is the single most important factor of complex systems (or so I've read from numerous sources)
Scalable means applications need to be packaged in a way to scale horizontally instead of vertically. Ideally this would be containers but it can also be what I'd call "accidental containers" for things like lambda, app engine, or any PaaS where you don't explicitly package your code into an executable unit.