Kubernetes Deploying
Deploy and manage applications on Kubernetes.
Core Resources
Deployment
yamlapiVersion: apps/v1 kind: Deployment metadata: name: my-app labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-registry/my-app:v1.2.3 ports: - containerPort: 3000 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /healthz port: 3000 initialDelaySeconds: 10 periodSeconds: 30 readinessProbe: httpGet: path: /ready port: 3000 initialDelaySeconds: 5 periodSeconds: 10 env: - name: DATABASE_URL valueFrom: secretKeyRef: name: my-app-secrets key: database-url - name: NODE_ENV value: production
Service
yamlapiVersion: v1 kind: Service metadata: name: my-app spec: selector: app: my-app ports: - port: 80 targetPort: 3000 type: ClusterIP
Ingress
yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app annotations: cert-manager.io/cluster-issuer: letsencrypt-prod spec: tls: - hosts: - app.example.com secretName: my-app-tls rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app port: number: 80
ConfigMap & Secret
yamlapiVersion: v1 kind: ConfigMap metadata: name: my-app-config data: LOG_LEVEL: info FEATURE_FLAGS: '{"darkMode": true}' --- apiVersion: v1 kind: Secret metadata: name: my-app-secrets type: Opaque stringData: database-url: postgresql://user:pass@host:5432/db api-key: sk-abc123
Common Commands
bash# Apply manifests kubectl apply -f k8s/ # Check deployment status kubectl rollout status deployment/my-app # View pods kubectl get pods -l app=my-app # View logs kubectl logs -f deployment/my-app # Execute into a pod kubectl exec -it <pod-name> -- /bin/sh # Scale kubectl scale deployment/my-app --replicas=5 # Rollback kubectl rollout undo deployment/my-app # Port forward for local debugging kubectl port-forward svc/my-app 3000:80
Deployment Strategies
| Strategy | How | When |
|---|---|---|
| Rolling update (default) | Replace pods one at a time | Most deployments |
| Recreate | Kill all old pods, start new ones | When you can't run two versions simultaneously |
| Blue/green | Run two full environments, switch traffic | Need instant rollback |
| Canary | Route small % of traffic to new version | High-risk changes |
Rolling update config:
yamlspec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0
Health Checks
Always set both:
- livenessProbe: "Is the process healthy?" — restarts the pod if it fails
- readinessProbe: "Can it handle traffic?" — removes from service if it fails
Common probe types:
httpGet: Hit an HTTP endpoint (most common)exec: Run a command in the containertcpSocket: Check if a port is open
Horizontal Pod Autoscaler
yamlapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-app 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
Tips
- Always set resource requests and limits
- Use namespaces to isolate environments (
dev,staging,prod) - Never put secrets in plaintext YAML committed to git — use Sealed Secrets, SOPS, or external secret managers
- Tag images with specific versions, never use
:latestin production - Set
PodDisruptionBudgetfor high-availability workloads


