Warrior, you've now learned EKS on AWS. The important realization of this chapter is:
Kubernetes itself is largely cloud-agnostic. The cloud provider mainly supplies the infrastructure around Kubernetes.
We'll compare:
AWS EKS
GCP GKE
Azure AKSand understand what actually changes when you move your application between clouds.
You already know this architecture:
Internet
↓
Load Balancer / Ingress
↓
Service
↓
Deployment
↓
Pods
↓
ContainersThat architecture is Kubernetes.
It doesn't fundamentally change because you're using AWS, GCP, or Azure.
What changes is the surrounding infrastructure.
Kubernetes
│
┌───────────┼───────────┐
↓ ↓ ↓
AWS GCP Azure
EKS GKE AKS
│ │ │
EC2 Compute VMSS
ECR Artifact ACR
ALB LB Azure LB
IAM IAM Entra ID
RDS Cloud SQL Azure DB| Cloud | Kubernetes Service |
|---|---|
| AWS | Amazon EKS |
| Google Cloud | Google Kubernetes Engine (GKE) |
| Microsoft Azure | Azure Kubernetes Service (AKS) |
So:
AWS → EKS
Google → GKE
Azure → AKSYou could theoretically install Kubernetes yourself on virtual machines.
For example:
VM 1 → Control Plane
VM 2 → Control Plane
VM 3 → Control Plane
VM 4 → Worker
VM 5 → Worker
VM 6 → WorkerBut then you're responsible for a huge amount of operational work.
Managed Kubernetes services reduce that burden.
Conceptually:
Self-managed
────────────────
You manage Kubernetes
You manage control plane
You manage upgrades
You manage availability
You manage infrastructure
Managed Kubernetes
────────────────
Cloud provider manages much of the control-plane infrastructure
You focus more on workloads and platform configurationThe exact division of responsibility depends on the service and configuration.
GKE is Google's managed Kubernetes service.
Architecture:
Google Cloud
│
↓
GKE
│
↓
Node Pools
│
┌───┼───┐
↓ ↓ ↓
Pod Pod PodGoogle has been deeply involved in Kubernetes since its origins, so GKE is an important Kubernetes platform to understand.
GKE provides a managed Kubernetes control plane.
You interact with it using:
kubectlFor example:
kubectl get nodesor:
kubectl get podsThe commands are fundamentally the same as EKS.
This is the power of Kubernetes abstraction.
GKE uses node pools.
Think:
GKE Cluster
│
├── Node Pool A
│ ├── Node
│ └── Node
│
└── Node Pool B
├── Node
└── NodeNode pools are useful when workloads have different requirements.
For example:
General workloads
↓
general-purpose nodesand:
AI / GPU workloads
↓
GPU node poolGKE provides two important operating models:
You have more direct control over nodes and node pools.
GKE
↓
Node Pools
↓
Nodes
↓
PodsGoogle manages more of the underlying infrastructure and node operations for you.
Conceptually:
GKE Autopilot
↓
You specify workloads
↓
Google manages more infrastructure
↓
PodsThis is similar in spirit to other cloud providers' more automated Kubernetes operating models.
GKE integrates tightly with Google Cloud networking.
Your cluster can interact with:
VPC
Subnets
Load Balancers
Firewall rules
Cloud NAT
Cloud DNSConceptually:
GCP VPC
│
├── Subnet
│ ├── Node
│ ├── Node
│ └── Pod networking
│
└── Load BalancerGKE commonly uses Google's VPC-native networking model.
Suppose you create a Kubernetes Service of an appropriate type.
Google Cloud can provision a load-balancing resource.
Conceptually:
Internet
↓
Google Cloud Load Balancer
↓
Kubernetes Service
↓
PodsFor HTTP/HTTPS applications, you may also use Gateway API or Ingress-based solutions depending on the architecture.
You need a container registry.
Google Cloud provides:
Artifact Registry
Architecture:
Developer
↓
Docker build
↓
Artifact Registry
↓
GKE
↓
PodFor example:
Artifact Registry
└── node-api
├── 1.0.0
├── 1.1.0
└── 1.2.0Instead of running PostgreSQL inside Kubernetes:
PostgreSQL Podyou can use:
Cloud SQL
Architecture:
Node.js Pods
│
↓
Cloud SQL PostgreSQLThis is conceptually similar to:
EKS → RDS
GKE → Cloud SQL
AKS → Azure DatabaseFor Redis-like caching, Google Cloud offers:
Memorystore
Architecture:
Node.js
│
├── Cloud SQL
│
└── MemorystoreSo your Kubernetes cluster can focus primarily on application workloads.
Suppose your application needs to access:
Cloud Storage
Secret Manager
Pub/Sub
BigQueryYou shouldn't put service-account keys inside your container.
Instead, Google provides workload identity mechanisms for associating Kubernetes workloads with Google Cloud identities.
Conceptually:
Pod
↓
Kubernetes ServiceAccount
↓
Workload Identity
↓
Google Cloud IAM
↓
Cloud StorageThis follows the same principle we discussed with EKS:
Give workloads identities rather than embedding long-lived credentials.
Now let's move to Microsoft Azure.
AKS is:
Azure Kubernetes Service
Architecture:
Azure
│
↓
AKS
│
↓
Node Pools
│
├── Node
├── Node
└── Node
│
↓
PodsAgain:
kubectl
↓
AKS
↓
PodsThe Kubernetes commands remain familiar.
AKS also supports node pools.
Example:
AKS
│
├── System Node Pool
│
└── User Node Pool
├── Node
├── Node
└── NodeYou can create specialized node pools.
For example:
CPU workloads
↓
CPU node pool
GPU workloads
↓
GPU node poolThen Kubernetes scheduling concepts from Chapter 17 become useful:
nodeSelector
affinity
taints
tolerationsAKS integrates with Azure networking.
Relevant components include:
Virtual Network
Subnets
Load Balancer
Network Security Groups
Azure DNSConceptually:
Azure VNet
│
├── Subnet
│ └── AKS nodes
│
└── Load BalancerAzure provides:
Azure Container Registry — ACR
Architecture:
Developer
↓
Docker build
↓
ACR
↓
AKS
↓
PodsSo now you have:
AWS
ECR
GCP
Artifact Registry
Azure
ACRFor PostgreSQL, you can use Azure's managed database services rather than running PostgreSQL yourself in Kubernetes.
Conceptually:
AKS
│
└── Node.js Pods
│
↓
Azure managed PostgreSQLFor Redis:
Node.js
↓
Azure managed Redis serviceThe exact Azure service offering and naming can evolve, so verify the current Azure product when designing a new deployment.
Azure's identity ecosystem uses:
Microsoft Entra ID
formerly known as Azure Active Directory.
This can integrate with Azure access control and AKS authentication/authorization workflows.
Conceptually:
Developer
↓
Entra ID
↓
Azure
↓
AKSNow let's compare the major building blocks.
| Requirement | AWS | GCP | Azure |
|---|---|---|---|
| Kubernetes | EKS | GKE | AKS |
| Container registry | ECR | Artifact Registry | ACR |
| VM compute | EC2 | Compute Engine | Azure VM |
| Load balancing | ALB/NLB | Cloud Load Balancing | Azure Load Balancer / Application Gateway |
| Managed PostgreSQL | RDS | Cloud SQL | Azure Database for PostgreSQL |
| Managed Redis | ElastiCache | Memorystore | Azure managed Redis offering |
| Object storage | S3 | Cloud Storage | Blob Storage |
| Identity | IAM | Cloud IAM | Entra ID / Azure RBAC |
| Kubernetes CLI | kubectl | kubectl | kubectl |
The important part:
kubectl stays the same.
This is one of the most important lessons.
Your Deployment:
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3can generally work across:
EKS
GKE
AKSYour Service:
apiVersion: v1
kind: Serviceis still Kubernetes.
Your ConfigMap:
kind: ConfigMapis still Kubernetes.
Your Secret:
kind: Secretis still Kubernetes.
Your HPA:
kind: HorizontalPodAutoscaleris still Kubernetes.
Cloud-specific infrastructure changes.
For example:
Container Registrychanges:
ECR
Artifact Registry
ACRLoad-balancer integration changes.
Identity integration changes.
Managed database changes.
Object storage changes.
Networking implementation changes.
Autoscaling integration can change.
So think:
Kubernetes layer
+
Cloud layerSuppose your Node.js application needs:
PostgreSQL
Redis
Object storageIf your application directly hardcodes:
aws.s3(...)then you're more tightly coupled to AWS.
Instead, you can abstract your application interface.
For example:
await storage.upload(file);Then the implementation can be:
AWS → S3
GCP → Cloud Storage
Azure → Blob StorageThe application interface remains stable.
The same idea applies to Kubernetes.
Your application doesn't need to know:
EKS
GKE
AKSIt simply runs inside:
Podand communicates through:
ServiceThis is one reason Kubernetes became so valuable.
Be careful.
You can write:
kind: Deploymentand run it almost anywhere.
But this:
annotations:
service.beta.kubernetes.io/aws-load-balancer-...is cloud-specific.
Similarly, cloud-specific storage classes:
AWS EBS
GCP Persistent Disk
Azure Diskcan differ.
So:
Core Kubernetes
↓
Portable
Cloud-specific extensions
↓
Less portableSuppose your application uses:
kind: PersistentVolumeClaimThe PVC itself is Kubernetes-native.
But the underlying StorageClass might be cloud-specific.
Example conceptually:
AWS → EBS-backed StorageClass
GCP → Persistent Disk-backed StorageClass
Azure → Azure Disk-backed StorageClassSo the application YAML might need overlays.
This is where Kustomize from Chapter 26 becomes useful.
You could have:
k8s/
│
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
│
└── overlays/
├── aws/
│ └── kustomization.yaml
│
├── gcp/
│ └── kustomization.yaml
│
└── azure/
└── kustomization.yamlBase:
Node.js Deployment
Service
ConfigMapAWS overlay:
AWS-specific annotations
ECR image
AWS storageGCP overlay:
GCP-specific annotations
Artifact Registry
GCP storageAzure overlay:
Azure-specific annotations
ACR
Azure storageThis is a practical use of Kustomize.
Your application might use:
kind: Ingressbut the implementation can differ.
For example:
AWS
↓
AWS Load Balancer Controller
↓
ALBGCP:
GKE
↓
Google Cloud Load Balancing integrationAzure:
AKS
↓
Azure networking/load-balancing integrationTherefore, don't assume an Ingress manifest is automatically identical across clouds.
You've already heard about Gateway API.
This is increasingly important for modern Kubernetes networking.
Conceptually:
Ingress
↓
Traditional HTTP routing
Gateway API
↓
More expressive Kubernetes networking APIIt provides a richer model for:
Gateway
Routes
Traffic policies
Cross-team ownershipYou don't need to master Gateway API yet.
We'll encounter it again as you move deeper into production architecture.
All three clouds support Kubernetes autoscaling patterns, but the implementation details differ.
The conceptual architecture remains:
HPA
↓
Podsand:
Node autoscaling
↓
NodesGKE, EKS, and AKS each provide cloud-specific integrations for scaling node capacity.
The exact tooling has evolved over time, so don't memorize one cloud-specific component as the universal answer.
This is especially relevant for your AI/LLM interests.
Suppose you want:
AI inferenceYou might have:
GPU Node Pool
│
├── AI Pod
├── AI Pod
└── AI PodKubernetes can request GPU resources.
Example:
resources:
limits:
nvidia.com/gpu: 1Then scheduling mechanisms can ensure the Pod lands on an appropriate GPU node.
This works conceptually across major cloud Kubernetes platforms, although the GPU instance types, drivers, device plugins, and cloud setup differ.
For an AI application:
Internet
│
↓
Ingress
│
↓
API Deployment
│
┌────────┼────────┐
↓ ↓ ↓
Redis RAG Model
│ Server
↓
Vector DBThe model server might run on:
GPU node poolwhile normal APIs run on:
CPU node poolScheduling separates the workloads.
Don't try to memorize hundreds of cloud-specific commands.
Remember this:
Managed Kubernetes
│
┌────────────┼────────────┐
↓ ↓ ↓
AWS GCP Azure
│ │ │
EKS GKE AKS
│ │ │
ECR Artifact Reg. ACR
│ │ │
IAM Cloud IAM EntraThe Kubernetes concepts remain:
Pod
Deployment
Service
Ingress
ConfigMap
Secret
PVC
HPA
RBAC
NetworkPolicyIf an interviewer asks:
"How portable is Kubernetes across cloud providers?"
A strong answer is:
"Core Kubernetes resources such as Deployments, Pods, Services, ConfigMaps and HPA are largely portable because they're defined through the Kubernetes API. However, cloud-specific integrations such as load balancers, storage classes, IAM/workload identity, container registries and networking annotations can differ. We can isolate many of those differences using abstractions, Kustomize overlays, Helm values, or platform-specific infrastructure configuration."
That's a very strong answer.
Suppose your company uses:
AWS
+
GCPYou could have:
Git
│
↓
CI/CD Pipeline
│
┌─────┴─────┐
↓ ↓
AWS GCP
↓ ↓
EKS GKE
↓ ↓
Pods PodsThe application manifests can share a common base.
Base
│
├── AWS overlay
│
└── GCP overlayNot necessarily.
Multi-cloud can provide certain organizational or resilience benefits, but it also increases:
Operational complexity
Monitoring complexity
Networking complexity
IAM complexity
Skill requirements
Deployment complexity
Cost-management complexitySo:
Multi-cloud ≠ automatically betterThe architecture should match the business and operational requirements.
Open-source orchestration platformAWS managed KubernetesGoogle Cloud managed KubernetesAzure managed KubernetesImagine this Node.js Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-api
spec:
replicas: 3
selector:
matchLabels:
app: node-api
template:
metadata:
labels:
app: node-api
spec:
containers:
- name: node-api
image: node-api:1.0.0
ports:
- containerPort: 3000The fundamental Kubernetes structure doesn't care whether the cluster is:
EKS
GKE
AKSThat's the abstraction.
AWS:
ECR
↓
node-api:1.0.0GCP:
Artifact Registry
↓
node-api:1.0.0Azure:
ACR
↓
node-api:1.0.0So Kustomize/Helm can manage this difference.
Look how much you've covered:
Chapter 1
Kubernetes fundamentals
↓
Chapter 2
Docker
↓
Chapter 3
Architecture
↓
Chapter 4
kubectl
↓
Chapter 5
Pods
↓
Chapter 6
Deployments
↓
Chapter 7
Services
↓
Chapter 8
Namespaces
↓
Chapter 9
ConfigMaps/Secrets
↓
Chapter 10
Storage
↓
Chapter 11
Networking
↓
Chapter 12
Ingress
↓
Chapter 13
Resources
↓
Chapter 14
Probes
↓
Chapter 15
HPA
↓
Chapter 16
Cluster Autoscaling
↓
Chapter 17
Scheduling
↓
Chapter 18
Jobs/CronJobs
↓
Chapter 19
Security/RBAC
↓
Chapter 20
NetworkPolicy
↓
Chapter 21
Logging
↓
Chapter 22
Monitoring
↓
Chapter 23
Troubleshooting
↓
Chapter 24
Rollouts/Rollbacks
↓
Chapter 25
Helm
↓
Chapter 26
Kustomize
↓
Chapter 27
Local Kubernetes
↓
Chapter 28
AWS EKS
↓
Chapter 29
GKE + AKSYou are now moving into the CI/CD and GitOps portion.
AWS
↓
EKS
↓
ECR
↓
IAM
GCP
↓
GKE
↓
Artifact Registry
↓
Cloud IAM
Azure
↓
AKS
↓
ACR
↓
Entra ID / Azure RBACEKS = AWS
GKE = Google Cloud
AKS = AzureECR = AWS
Artifact Registry = GCP
ACR = AzurePod
Deployment
Service
Ingress
ConfigMap
Secret
PVC
HPA
RBAC
NetworkPolicyKubernetes gives you the common orchestration API; cloud providers supply compute, networking, identity, storage, load balancing, and managed services around it.
This is a major chapter.
We'll build the complete pipeline:
Developer
↓
Git Push
↓
GitHub
↓
CI Pipeline
↓
Run Tests
↓
Build Docker Image
↓
Push Image to Registry
↓
Update Kubernetes
↓
Rolling Deployment
↓
Readiness Checks
↓
ProductionWe'll specifically build a Node.js + Docker + Kubernetes CI/CD pipeline, including GitHub Actions, image tagging, registries, deployment strategies, secrets, rollback, and production best practices.
Mark it as complete to track your mastery.