TL;DR: An application environment provides the infrastructure context in which an application runs, while infrastructure isolation defines the boundaries between that environment and other workloads.
In the previous post, Infrastructure Composition, we discussed how an Application Environment combines networking, subnets, routing, security policies, compute resources, databases, storage, and observability into a single operational stack designed to run an application.
However, running a single composition is rarely sufficient. Infrastructure Isolation addresses the requirement to separate development, staging, and production workloads into distinct execution spaces to contain blast radiuses and enforce security boundaries.
This article breaks down these two core concepts separately before synthesizing them to show how to build scalable, isolated application environments.
Application Environments
Do you remember this?
Application Environment
│
├── Network
│ ├── VPC / VNet
│ ├── Subnets
│ └── Routing
│
├── Security
│ ├── Firewall rules
│ ├── IAM
│ └── Secrets
│
├── Compute
│ ├── Kubernetes cluster
│ └── Node pools
│
├── Data
│ ├── Database
│ └── Object storage
│
└── Observability
├── Logs
├── Metrics
└── Alerts
An application environment is the infrastructure context in which an application runs.
A typical application may have:
Application
│
├── Development
├── Testing
├── Staging
└── Production
Each environment can contain a similar collection of resources:
Production
├── Application
├── Database
├── Cache
├── Message Queue
├── Network
├── Secrets
├── Monitoring
└── Storage
The important point is that an environment is a logical boundary around a collection of infrastructure resources and services that together support an application or workload.
For example, an application might have:
dev.example.com
└── Development environment
staging.example.com
└── Staging environment
example.com
└── Production environment
The environments may use the same architecture while having different capacity, configuration, data, access policies, and operational characteristics.
Infrastructure Isolation
Isolation answers a different question:
How do we prevent resources belonging to one workload, environment, or team from interfering with another?
There are several levels of isolation.
At the simplest level:
VM A <-> VM B
VMs provide process and resource boundaries.
Containers provide another layer:
Host
├── Container A
├── Container B
└── Container C
Kubernetes extends this concept:
Cluster
├── Namespace: team-a
│ ├── App A
│ └── App B
│
└── Namespace: team-b
├── App C
└── App D
Cloud platforms can provide stronger infrastructure boundaries:
Cloud
├── Subscription / Account A
│ └── Production
│
└── Subscription / Account B
└── Development
And networks add another dimension:
VPC / VNet
├── Public subnet
├── Application subnet
└── Database subnet
So isolation isn’t necessarily one technology. It is a collection of boundaries applied at different layers.
Application Environments & Infrastructure Isolation
Consider three applications:
Application A
Application B
Application C
You could give each application completely independent infrastructure:
A > Cluster A > Network A > Database A
B > Cluster B > Network B > Database B
C > Cluster C > Network C > Database C
This gives strong isolation, but it can become expensive and difficult to operate.
Alternatively:
Shared Cluster
│
┌─────────┼─────────┐
↓ ↓ ↓
Team A Team B Team C
Namespace Namespace Namespace
This provides resource sharing while maintaining logical boundaries.
The platform engineer therefore has to decide where the isolation boundary should exist.
That could be:
Organization > Cloud Account / Subscription > Network > Cluster > Namespace > Workload > Container > Process
Each layer provides different levels of isolation, cost, operational complexity, and security.
A developer generally wants to say something like:
I need an application environment.
They shouldn’t have to manually construct:
VNet
Subnet
NSG
IAM
Kubernetes namespace
Database
Storage
Secrets
DNS
Monitoring
Backup
That where Infrastructure Composition, connects.
Infrastructure Composition might define:
Application Environment
│
├── Network
├── Compute
├── Database
├── Storage
├── Identity
├── Secrets
└── Observability
Then the platform can instantiate that composition repeatedly:
Application
│
├── Dev Environment
├── Test Environment
├── Staging Environment
└── Production Environment
while applying different isolation policies to each.
For example:
Dev
└── Shared Kubernetes Cluster
└── Namespace
Staging
└── Shared Kubernetes Cluster
└── Namespace + NetworkPolicy
Production
└── Dedicated Cluster
└── Dedicated Network
Same conceptual application environment, different implementation and isolation level.
Application environments define the infrastructure context in which a workload operates, while infrastructure isolation defines the boundaries that separate that workload from other workloads.
And this leads to next topics:
Application Environments > Infrastructure Isolation > Developer Portals > Service Catalogs > Golden Paths
Back to Certified Cloud Native Platform Engineering Associate Preparation