Skip to main content

Operator reference

Everyday language

For day-to-day product terms (environment, instance, copies, connection file, public URL), see Terms we use. This page is an advanced operator reference and may use Kubernetes object names when describing low-level setup. Day-one readers should stay on the Quickstart.

Building on the Quickstart cluster setup, this guide covers deeper sizing, troubleshooting, and advanced scenarios.

Prerequisites deep dive​

System requirements analysis​

Before setting up any cluster, understand your workload requirements:

Control plane specifications​

Development environment:

  • CPU: 2 vCPUs minimum, 4 vCPUs recommended
  • RAM: 4GB minimum, 8GB recommended
  • Storage: 40GB SSD minimum, 60GB recommended
  • Network: 1Gbps minimum

Production environment:

  • CPU: 4 vCPUs minimum, 8 vCPUs recommended
  • RAM: 8GB minimum, 16GB recommended
  • Storage: 50GB SSD minimum, 100GB recommended
  • Network: 10Gbps recommended

Worker node specifications​

Development environment:

  • CPU: 2 vCPUs minimum, 4 vCPUs recommended
  • RAM: 4GB minimum, 8GB recommended
  • Storage: 40GB SSD minimum, 60GB recommended

Production environment:

  • CPU: 4 vCPUs minimum, 8+ vCPUs recommended
  • RAM: 8GB minimum, 16GB+ recommended
  • Storage: 50GB SSD minimum, 100GB+ recommended
Resource Planning

Always plan for 20-30% overhead beyond your application requirements for system processes and scaling.

Advanced Cluster Configuration​

Network Architecture Deep Dive​

Pod Network Configuration​

# Example Calico network policy
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-app-traffic
namespace: production
spec:
selector: app == "web-app"
ingress:
- action: Allow
protocol: TCP
destination:
ports: [80, 443]
egress:
- action: Allow
protocol: TCP
destination:
ports: [53, 3306, 6379]

Service Mesh Integration​

For advanced networking, consider service mesh options:

Istio Configuration:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: web-app-vs
spec:
hosts:
- web-app
http:
- match:
- headers:
version:
exact: "v2"
route:
- destination:
host: web-app
subset: v2
- route:
- destination:
host: web-app
subset: v1

Storage Configuration​

Persistent Volume Setup​

Local Storage (Development):

apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1

Cloud Storage (Production):

apiVersion: v1
kind: PersistentVolume
metadata:
name: cloud-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: cloud-ssd
awsElasticBlockStore:
volumeID: vol-1234567890abcdef0
fsType: ext4

Security Hardening​

RBAC Configuration​

Custom Role for Application Deployment:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: app-deployer
rules:
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "watch", "create", "update", "patch"]

Pod Security Standards​

apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
containers:
- name: app
image: myapp:latest
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL

Troubleshooting Guide​

Common Cluster Issues​

Node Not Ready​

Symptoms:

  • Node shows "NotReady" status
  • Pods stuck in "Pending" state

Diagnosis:

# Check node status
kubectl describe node <node-name>

# Check kubelet logs
journalctl -u kubelet -f

# Verify container runtime
systemctl status containerd

Solutions:

  1. Disk Space Issues:

    # Clean up unused images
    docker system prune -a

    # Check disk usage
    df -h
  2. Memory Pressure:

    # Check memory usage
    free -h

    # Identify memory-heavy processes
    ps aux --sort=-%mem | head
  3. Network Issues:

    # Test connectivity
    ping <master-ip>

    # Check firewall rules
    iptables -L

Pod Startup Failures​

Common Causes:

  1. Image Pull Errors:

    # Check image availability
    docker pull <image-name>

    # Verify registry credentials
    kubectl get secrets
  2. Resource Constraints:

    # Check resource requests vs limits
    kubectl describe pod <pod-name>

    # Verify node capacity
    kubectl top nodes
  3. Configuration Issues:

    # Validate YAML syntax
    kubectl apply --dry-run=client -f <config-file>

    # Check ConfigMap/Secret references
    kubectl get configmap <config-name> -o yaml

Performance Optimization​

Cluster Resource Optimization​

Node Resource Management:

apiVersion: v1
kind: Node
metadata:
name: worker-1
spec:
# Reserve resources for system processes
systemReserved:
cpu: "100m"
memory: "100Mi"
ephemeral-storage: "1Gi"
kubeReserved:
cpu: "100m"
memory: "100Mi"
ephemeral-storage: "1Gi"

Pod Resource Limits:

apiVersion: apps/v1
kind: Deployment
metadata:
name: optimized-app
spec:
template:
spec:
containers:
- name: app
image: myapp:latest
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"

Horizontal Pod Autoscaling​

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80

Advanced Scenarios​

Multi-Cluster Management​

Cluster Federation Setup​

apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-config
namespace: kube-system
data:
clusters.yaml: |
clusters:
- name: production-us
server: https://prod-us.example.com
- name: production-eu
server: https://prod-eu.example.com

Cross-Cluster Service Discovery​

apiVersion: v1
kind: Service
metadata:
name: cross-cluster-service
annotations:
federation.kubernetes.io/service: "true"
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080

Disaster Recovery​

Backup Strategy​

ETCD Backup:

#!/bin/bash
# Automated etcd backup script
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%Y%m%d-%H%M%S).db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key

Application Data Backup:

apiVersion: batch/v1
kind: CronJob
metadata:
name: db-backup
spec:
schedule: "0 2 * * *" # Daily at 2 AM
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:13
command:
- /bin/bash
- -c
- |
pg_dump $DATABASE_URL > /backup/db-$(date +%Y%m%d).sql
aws s3 cp /backup/db-$(date +%Y%m%d).sql s3://my-backup-bucket/
volumeMounts:
- name: backup-storage
mountPath: /backup
volumes:
- name: backup-storage
persistentVolumeClaim:
claimName: backup-pvc
restartPolicy: OnFailure

Monitoring and Observability​

Cluster Monitoring Setup​

Prometheus Configuration​

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod

Grafana Dashboards​

apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-dashboard
data:
dashboard.json: |
{
"dashboard": {
"title": "Kubernetes Cluster Overview",
"panels": [
{
"title": "CPU Usage",
"type": "graph",
"targets": [
{
"expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
}
]
}
]
}
}

Next Steps​

With your cluster properly configured and optimized: