Organizing and scaling your Kubernetes manifests becomes much simpler when you adopt a consistent directory structure and leverage Kustomize . In this guide, we’ll walk through:
Defining a clear directory layout
Deploying resources manually with kubectl
Introducing Kustomize for centralized and per-directory customization
Directory Layout
Under the k8s/ folder, structure your manifests by component:
k8s/
├── api/
├── cache/
└── db/
Directory Components k8s/api API Deployment & Service k8s/cache Redis Deployment, Service & Credentials k8s/db MongoDB Deployment, Service & Credentials
Each subfolder contains the YAML files for its service.
Sample Manifests
Database Deployment (db/db-depl.yaml)
apiVersion : apps/v1
kind : Deployment
metadata :
name : db-deployment
spec :
replicas : 1
selector :
matchLabels :
component : db
template :
metadata :
labels :
component : db
spec :
containers :
- name : mongo
image : mongo
env :
- name : MONGO_INITDB_ROOT_USERNAME
valueFrom :
configMapKeyRef :
name : db-credentials
key : username
- name : MONGO_INITDB_ROOT_PASSWORD
valueFrom :
configMapKeyRef :
name : db-credentials
key : password
Redis Service (cache/redis-service.yaml)
apiVersion : v1
kind : Service
metadata :
name : redis-cluster-ip-service
spec :
type : ClusterIP
selector :
component : redis
ports :
- port : 6379
targetPort : 6379
Redis Credentials (cache/redis-config.yaml)
apiVersion : v1
kind : ConfigMap
metadata :
name : redis-credentials
data :
username : "redis"
password : "password123"
Manual Deployment
Apply each directory in sequence:
kubectl apply -f k8s/api
kubectl apply -f k8s/cache
kubectl apply -f k8s/db
Or chain them:
kubectl apply -f k8s/api -f k8s/cache -f k8s/db
Make sure your kubectl context is pointed to the correct cluster and you have permission to create resources.
Cleaning Up
kubectl delete -f k8s/api -f k8s/cache -f k8s/db
Introducing Kustomize
Kustomize lets you define and compose resources without template syntax. Start by creating a root kustomization.yaml under k8s/:
apiVersion : kustomize.config.k8s.io/v1beta1
kind : Kustomization
resources :
- api/api-depl.yaml
- api/api-service.yaml
- cache/redis-config.yaml
- cache/redis-depl.yaml
- cache/redis-service.yaml
- db/db-config.yaml
- db/db-depl.yaml
- db/db-service.yaml
Generate the merged manifest:
Apply directly to the cluster:
kustomize build k8s/ | kubectl apply -f -
Or use kubectl’s built-in Kustomize support:
You can apply overlays without installing the standalone Kustomize binary by running: See [Kubectl apply documentation].
Verify your pods:
Per-Directory Kustomization
For better modularity, place a kustomization.yaml in each subfolder.
api/kustomization.yaml
apiVersion : kustomize.config.k8s.io/v1beta1
kind : Kustomization
resources :
- api-depl.yaml
- api-service.yaml
cache/kustomization.yaml
apiVersion : kustomize.config.k8s.io/v1beta1
kind : Kustomization
resources :
- redis-config.yaml
- redis-depl.yaml
- redis-service.yaml
db/kustomization.yaml
apiVersion : kustomize.config.k8s.io/v1beta1
kind : Kustomization
resources :
- db-config.yaml
- db-depl.yaml
- db-service.yaml
Finally, update the root kustomization.yaml to reference directories:
apiVersion : kustomize.config.k8s.io/v1beta1
kind : Kustomization
resources :
- api/
- cache/
- db/
Apply all components in one command:
Confirm everything is running:
This scalable structure keeps your manifests organized and ready for production-grade overlays.
Links and References