namespace-with-quota.yaml — Namespace with ResourceQuota¶
# Development environment with quotas and limitsapiVersion:v1kind:Namespacemetadata:name:developmentlabels:environment:dev---apiVersion:v1kind:ResourceQuotametadata:name:dev-quotanamespace:developmentspec:hard:# Compute resourcesrequests.cpu:"4"requests.memory:8Gilimits.cpu:"8"limits.memory:16Gi# Object countspods:"10"services:"5"persistentvolumeclaims:"3"configmaps:"10"secrets:"10"# Storagerequests.storage:20Gi---apiVersion:v1kind:LimitRangemetadata:name:dev-limitsnamespace:developmentspec:limits:# Container defaults and limits-type:Containerdefault:# Default limits if not specifiedcpu:300mmemory:512MidefaultRequest:# Default requests if not specifiedcpu:100mmemory:128Mimax:# Maximum allowedcpu:"1"memory:2Gimin:# Minimum requiredcpu:50mmemory:64Mi# Pod limits (all containers combined)-type:Podmax:cpu:"2"memory:4Gi# PVC limits-type:PersistentVolumeClaimmin:storage:1Gimax:storage:10Gi---# Production environment with higher limitsapiVersion:v1kind:Namespacemetadata:name:productionlabels:environment:prod---apiVersion:v1kind:ResourceQuotametadata:name:prod-quotanamespace:productionspec:hard:requests.cpu:"20"requests.memory:40Gilimits.cpu:"40"limits.memory:80Gipods:"50"services:"20"persistentvolumeclaims:"10"requests.storage:100Gi---apiVersion:v1kind:LimitRangemetadata:name:prod-limitsnamespace:productionspec:limits:-type:Containerdefault:cpu:500mmemory:1GidefaultRequest:cpu:250mmemory:512Mimax:cpu:"4"memory:8Gimin:cpu:100mmemory:128Mi-type:Podmax:cpu:"8"memory:16Gi
# Backend namespace and serviceapiVersion:v1kind:Namespacemetadata:name:backendlabels:tier:backend---apiVersion:apps/v1kind:Deploymentmetadata:name:apinamespace:backendspec:replicas:2selector:matchLabels:app:apitemplate:metadata:labels:app:apispec:containers:-name:nginximage:nginx:1.25-alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:api-servicenamespace:backendspec:selector:app:apiports:-port:8080targetPort:80---# Frontend namespaceapiVersion:v1kind:Namespacemetadata:name:frontendlabels:tier:frontend---# Frontend pod that accesses backend serviceapiVersion:v1kind:Podmetadata:name:web-clientnamespace:frontendspec:containers:-name:clientimage:curlimages/curl:8.5.0command:["/bin/sh","-c"]args:-|echo "Testing cross-namespace communication..."echo ""echo "1. Short name (will fail - different namespace):"curl -v http://api-service:8080 2>&1 || echo "Failed - service not in same namespace"echo ""echo "2. Fully qualified domain name (will succeed):"curl -v http://api-service.backend.svc.cluster.local:8080echo ""echo "Sleeping..."sleep 3600restartPolicy:Never# DNS Resolution in Kubernetes:# Same namespace: <service-name># Cross namespace: <service-name>.<namespace>.svc.cluster.local# External DNS: <service-name>.<namespace>.svc.cluster.local
# Docker Compose - Project-based isolation# In Compose, isolation is achieved through project names# Each docker-compose.yml in a different directory = different project# Project 1: development (in ./dev directory)# docker-compose up -d --project-name developmentservices:frontend:image:nginx:1.25-alpinenetworks:-app-networkdeploy:resources:limits:cpus:'0.5'memory:512Mbackend:image:nginx:1.25-alpinenetworks:-app-networkdeploy:resources:limits:cpus:'0.5'memory:512Mnetworks:app-network:# Project 2: production (in ./prod directory)# docker-compose up -d --project-name production# (same services but different project)# Kubernetes Equivalent:# Multiple namespaces with ResourceQuotas## kubectl create namespace development# kubectl create namespace production## Each namespace has its own:# - ResourceQuota (like deploy.resources.limits but cluster-wide)# - LimitRange (defaults for all pods)# - RBAC (who can access)# - NetworkPolicies (traffic isolation)# Key Differences:## 1. Isolation Level:# Compose: Project name + network# K8s: Namespace + NetworkPolicy## 2. Resource Limits:# Compose: Per service (deploy.resources)# K8s: Per namespace (ResourceQuota) + per pod (LimitRange)## 3. DNS:# Compose: service-name (within same project)# K8s: service-name (same namespace) or service.namespace.svc.cluster.local## 4. Management:# Compose: docker-compose -p <project> up/down# K8s: kubectl -n <namespace> apply/delete## 5. Default Behavior:# Compose: Project name from directory name# K8s: "default" namespace unless specified## 6. Cleanup:# Compose: docker-compose down (removes project resources)# K8s: kubectl delete namespace <name> (removes all resources in namespace)