530 lines
11 KiB
Markdown
530 lines
11 KiB
Markdown
---
|
|
description: Deploy to Kubernetes cluster
|
|
argument-hint: Optional deployment details
|
|
---
|
|
|
|
# Kubernetes Deployment
|
|
|
|
You are deploying applications to a Kubernetes cluster using the k8s-cluster-manager agent.
|
|
|
|
## Workflow
|
|
|
|
### 1. Gather Deployment Information
|
|
|
|
If not specified, ask for:
|
|
- **What to deploy**:
|
|
- Path to YAML manifests
|
|
- Helm chart name/path
|
|
- Kustomize directory
|
|
- Docker image (for quick deployment)
|
|
- **Target cluster**:
|
|
- Cluster context name
|
|
- Namespace (create if doesn't exist)
|
|
- Environment type (dev/staging/production)
|
|
- **Deployment strategy**:
|
|
- RollingUpdate (default, zero downtime)
|
|
- Recreate (stop old, start new)
|
|
- Blue-Green (switch service selector)
|
|
- Canary (gradual traffic shift)
|
|
- **Requirements**:
|
|
- Resource requests/limits
|
|
- Replica count
|
|
- Health check configuration
|
|
|
|
### 2. Pre-Deployment Validation
|
|
|
|
Before deploying, verify:
|
|
|
|
**Cluster connectivity**:
|
|
```bash
|
|
kubectl cluster-info
|
|
kubectl get nodes
|
|
```
|
|
|
|
**Namespace exists or create**:
|
|
```bash
|
|
kubectl get namespace [namespace]
|
|
# If doesn't exist:
|
|
kubectl create namespace [namespace]
|
|
```
|
|
|
|
**Context verification**:
|
|
```bash
|
|
kubectl config current-context
|
|
# Switch if needed:
|
|
kubectl config use-context [cluster-name]
|
|
```
|
|
|
|
**Manifest validation** (for YAML files):
|
|
```bash
|
|
# Dry run to validate
|
|
kubectl apply -f [manifest.yaml] --dry-run=client
|
|
|
|
# Validate all files in directory
|
|
kubectl apply -f [directory]/ --dry-run=client
|
|
|
|
# Server-side validation
|
|
kubectl apply -f [manifest.yaml] --dry-run=server
|
|
```
|
|
|
|
### 3. Execute Deployment
|
|
|
|
Launch **k8s-cluster-manager** agent with deployment method:
|
|
|
|
#### Option A: Direct YAML Manifests
|
|
|
|
```bash
|
|
# Single file
|
|
kubectl apply -f deployment.yaml -n [namespace]
|
|
|
|
# Multiple files
|
|
kubectl apply -f deployment.yaml -f service.yaml -f ingress.yaml -n [namespace]
|
|
|
|
# Entire directory
|
|
kubectl apply -f k8s/ -n [namespace]
|
|
|
|
# Recursive directory
|
|
kubectl apply -f k8s/ -n [namespace] --recursive
|
|
```
|
|
|
|
#### Option B: Helm Chart
|
|
|
|
```bash
|
|
# Add repository (if needed)
|
|
helm repo add [repo-name] [repo-url]
|
|
helm repo update
|
|
|
|
# Install new release
|
|
helm install [release-name] [chart] -n [namespace] \
|
|
--create-namespace \
|
|
--set replicas=3 \
|
|
--set image.tag=v1.2.3 \
|
|
--values values.yaml
|
|
|
|
# Upgrade existing release
|
|
helm upgrade [release-name] [chart] -n [namespace] \
|
|
--reuse-values \
|
|
--set image.tag=v1.2.4
|
|
|
|
# Install or upgrade (idempotent)
|
|
helm upgrade --install [release-name] [chart] -n [namespace]
|
|
```
|
|
|
|
#### Option C: Kustomize
|
|
|
|
```bash
|
|
# Apply with kustomize
|
|
kubectl apply -k overlays/[environment]/ -n [namespace]
|
|
|
|
# Preview what will be applied
|
|
kubectl kustomize overlays/[environment]/
|
|
```
|
|
|
|
#### Option D: Quick Deployment (Image Only)
|
|
|
|
```bash
|
|
# Create deployment from image
|
|
kubectl create deployment [name] \
|
|
--image=[image:tag] \
|
|
--replicas=3 \
|
|
-n [namespace]
|
|
|
|
# Expose as service
|
|
kubectl expose deployment [name] \
|
|
--port=80 \
|
|
--target-port=8080 \
|
|
--type=LoadBalancer \
|
|
-n [namespace]
|
|
```
|
|
|
|
### 4. Monitor Deployment Progress
|
|
|
|
**Watch rollout status**:
|
|
```bash
|
|
# For Deployments
|
|
kubectl rollout status deployment/[name] -n [namespace]
|
|
|
|
# For StatefulSets
|
|
kubectl rollout status statefulset/[name] -n [namespace]
|
|
|
|
# For DaemonSets
|
|
kubectl rollout status daemonset/[name] -n [namespace]
|
|
```
|
|
|
|
**Watch pods coming up**:
|
|
```bash
|
|
# Watch pods in real-time
|
|
kubectl get pods -n [namespace] -w
|
|
|
|
# Watch with labels
|
|
kubectl get pods -n [namespace] -l app=[name] -w
|
|
|
|
# Detailed view
|
|
kubectl get pods -n [namespace] -o wide
|
|
```
|
|
|
|
**Check events**:
|
|
```bash
|
|
kubectl get events -n [namespace] \
|
|
--sort-by='.lastTimestamp' \
|
|
--watch
|
|
```
|
|
|
|
### 5. Verify Deployment Health
|
|
|
|
**Pod status checks**:
|
|
```bash
|
|
# All pods running?
|
|
kubectl get pods -n [namespace]
|
|
|
|
# Check specific deployment
|
|
kubectl get deployment [name] -n [namespace]
|
|
|
|
# Detailed pod info
|
|
kubectl describe pod [pod-name] -n [namespace]
|
|
```
|
|
|
|
**Health check verification**:
|
|
```bash
|
|
# Check if pods are ready
|
|
kubectl get pods -n [namespace] -o json | \
|
|
jq '.items[] | {name: .metadata.name, ready: .status.conditions[] | select(.type=="Ready") | .status}'
|
|
|
|
# Check readiness probes
|
|
kubectl describe pod [pod-name] -n [namespace] | grep -A5 "Readiness"
|
|
```
|
|
|
|
**Service connectivity**:
|
|
```bash
|
|
# Check service endpoints
|
|
kubectl get endpoints [service-name] -n [namespace]
|
|
|
|
# Describe service
|
|
kubectl describe service [service-name] -n [namespace]
|
|
|
|
# Test service from within cluster
|
|
kubectl run test-pod --image=curlimages/curl -i --rm -- \
|
|
curl http://[service-name].[namespace].svc.cluster.local
|
|
```
|
|
|
|
**Resource usage**:
|
|
```bash
|
|
# Pod resource usage
|
|
kubectl top pods -n [namespace]
|
|
|
|
# Specific deployment
|
|
kubectl top pods -n [namespace] -l app=[name]
|
|
```
|
|
|
|
### 6. Post-Deployment Validation
|
|
|
|
**Application health checks**:
|
|
```bash
|
|
# Check application logs
|
|
kubectl logs -n [namespace] deployment/[name] --tail=50
|
|
|
|
# Follow logs
|
|
kubectl logs -n [namespace] -f deployment/[name]
|
|
|
|
# Logs from all pods
|
|
kubectl logs -n [namespace] -l app=[name] --all-containers=true
|
|
```
|
|
|
|
**Ingress/Route verification** (if applicable):
|
|
```bash
|
|
# Check ingress
|
|
kubectl get ingress -n [namespace]
|
|
|
|
# Test external access
|
|
curl https://[domain]
|
|
```
|
|
|
|
**ConfigMap/Secret verification**:
|
|
```bash
|
|
# Verify ConfigMaps mounted
|
|
kubectl get configmap -n [namespace]
|
|
|
|
# Verify Secrets exist
|
|
kubectl get secrets -n [namespace]
|
|
```
|
|
|
|
### 7. Update Deployment Records
|
|
|
|
Document deployment details:
|
|
- Deployment timestamp
|
|
- Image versions deployed
|
|
- Configuration changes
|
|
- Any issues encountered
|
|
- Rollback plan (previous version info)
|
|
|
|
## Deployment Strategies
|
|
|
|
### Rolling Update (Default)
|
|
|
|
**Configuration**:
|
|
```yaml
|
|
spec:
|
|
strategy:
|
|
type: RollingUpdate
|
|
rollingUpdate:
|
|
maxSurge: 1 # Max pods above desired count
|
|
maxUnavailable: 0 # Max pods below desired count
|
|
```
|
|
|
|
**Deploy**:
|
|
```bash
|
|
kubectl set image deployment/[name] \
|
|
[container]=[image:new-tag] \
|
|
-n [namespace]
|
|
```
|
|
|
|
### Recreate Strategy
|
|
|
|
**Configuration**:
|
|
```yaml
|
|
spec:
|
|
strategy:
|
|
type: Recreate
|
|
```
|
|
|
|
**Use case**: When you can afford downtime or need to avoid version mixing
|
|
|
|
### Blue-Green Deployment
|
|
|
|
**Steps**:
|
|
```bash
|
|
# 1. Deploy green version
|
|
kubectl apply -f deployment-green.yaml -n [namespace]
|
|
|
|
# 2. Verify green is healthy
|
|
kubectl get pods -n [namespace] -l version=green
|
|
|
|
# 3. Switch service selector
|
|
kubectl patch service [name] -n [namespace] \
|
|
-p '{"spec":{"selector":{"version":"green"}}}'
|
|
|
|
# 4. Remove blue version
|
|
kubectl delete deployment [name]-blue -n [namespace]
|
|
```
|
|
|
|
### Canary Deployment
|
|
|
|
**Steps**:
|
|
```bash
|
|
# 1. Deploy canary with 1 replica
|
|
kubectl apply -f deployment-canary.yaml -n [namespace]
|
|
|
|
# 2. Monitor metrics (error rate, latency)
|
|
kubectl logs -n [namespace] -l version=canary
|
|
|
|
# 3. Gradually increase canary replicas
|
|
kubectl scale deployment [name]-canary --replicas=3 -n [namespace]
|
|
|
|
# 4. If successful, update main deployment
|
|
kubectl set image deployment/[name] [container]=[new-image] -n [namespace]
|
|
|
|
# 5. Remove canary
|
|
kubectl delete deployment [name]-canary -n [namespace]
|
|
```
|
|
|
|
## Output Format
|
|
|
|
### Deployment Summary
|
|
|
|
**Deployment Information**:
|
|
- **Name**: [deployment-name]
|
|
- **Namespace**: [namespace]
|
|
- **Environment**: [dev/staging/production]
|
|
- **Strategy**: [RollingUpdate/Recreate/Blue-Green/Canary]
|
|
- **Timestamp**: [YYYY-MM-DD HH:MM:SS UTC]
|
|
|
|
**Resources Deployed**:
|
|
```
|
|
Deployments:
|
|
✓ [name]: 3/3 replicas ready
|
|
- Image: [image:tag]
|
|
- CPU: 100m request, 500m limit
|
|
- Memory: 128Mi request, 512Mi limit
|
|
|
|
Services:
|
|
✓ [name]: ClusterIP 10.96.1.10:80 → 8080
|
|
✓ [name]-lb: LoadBalancer [external-ip]:80 → 8080
|
|
|
|
Ingress:
|
|
✓ [name]: https://[domain] → [service]:80
|
|
|
|
ConfigMaps:
|
|
✓ [name]-config
|
|
|
|
Secrets:
|
|
✓ [name]-secrets
|
|
```
|
|
|
|
**Health Status**:
|
|
- Pods: 3/3 Running
|
|
- Ready: 3/3
|
|
- Restarts: 0
|
|
- Age: 2m30s
|
|
|
|
**Access Information**:
|
|
- Internal: http://[service].[namespace].svc.cluster.local:80
|
|
- External: https://[domain]
|
|
- Load Balancer: http://[external-ip]:80
|
|
|
|
### Verification Commands
|
|
|
|
Run these commands to verify deployment:
|
|
```bash
|
|
# Check deployment status
|
|
kubectl get deployment [name] -n [namespace]
|
|
|
|
# Check pod health
|
|
kubectl get pods -n [namespace] -l app=[name]
|
|
|
|
# View logs
|
|
kubectl logs -n [namespace] -l app=[name] --tail=20
|
|
|
|
# Test service
|
|
kubectl run test --image=curlimages/curl -i --rm -- \
|
|
curl http://[service].[namespace].svc.cluster.local
|
|
|
|
# Check resource usage
|
|
kubectl top pods -n [namespace] -l app=[name]
|
|
```
|
|
|
|
### Rollback Information
|
|
|
|
If issues occur, rollback with:
|
|
```bash
|
|
# View rollout history
|
|
kubectl rollout history deployment/[name] -n [namespace]
|
|
|
|
# Rollback to previous version
|
|
kubectl rollout undo deployment/[name] -n [namespace]
|
|
|
|
# Rollback to specific revision
|
|
kubectl rollout undo deployment/[name] -n [namespace] --to-revision=[num]
|
|
```
|
|
|
|
**Previous Version**:
|
|
- Revision: [number]
|
|
- Image: [previous-image:tag]
|
|
- Change cause: [previous-deployment-reason]
|
|
|
|
## Troubleshooting
|
|
|
|
### Pods Not Starting
|
|
|
|
**ImagePullBackOff**:
|
|
```bash
|
|
# Check image pull errors
|
|
kubectl describe pod [pod-name] -n [namespace] | grep -A10 "Events:"
|
|
|
|
# Verify image exists
|
|
docker pull [image:tag]
|
|
|
|
# Check imagePullSecrets
|
|
kubectl get secrets -n [namespace]
|
|
```
|
|
|
|
**CrashLoopBackOff**:
|
|
```bash
|
|
# Check application logs
|
|
kubectl logs [pod-name] -n [namespace] --previous
|
|
|
|
# Check startup command
|
|
kubectl describe pod [pod-name] -n [namespace] | grep -A5 "Command:"
|
|
|
|
# Check resource limits
|
|
kubectl describe pod [pod-name] -n [namespace] | grep -A10 "Limits:"
|
|
```
|
|
|
|
**Pending Status**:
|
|
```bash
|
|
# Check why pod is pending
|
|
kubectl describe pod [pod-name] -n [namespace] | grep -A10 "Events:"
|
|
|
|
# Check node resources
|
|
kubectl top nodes
|
|
|
|
# Check PVC status (if using persistent volumes)
|
|
kubectl get pvc -n [namespace]
|
|
```
|
|
|
|
### Rollout Stuck
|
|
|
|
```bash
|
|
# Check rollout status
|
|
kubectl rollout status deployment/[name] -n [namespace]
|
|
|
|
# Check deployment events
|
|
kubectl describe deployment [name] -n [namespace]
|
|
|
|
# Check replica sets
|
|
kubectl get rs -n [namespace]
|
|
|
|
# Force rollout
|
|
kubectl rollout restart deployment/[name] -n [namespace]
|
|
```
|
|
|
|
### Service Not Accessible
|
|
|
|
```bash
|
|
# Check service selector matches pod labels
|
|
kubectl get service [name] -n [namespace] -o yaml | grep selector -A5
|
|
kubectl get pods -n [namespace] --show-labels
|
|
|
|
# Check endpoints
|
|
kubectl get endpoints [name] -n [namespace]
|
|
|
|
# Check network policies
|
|
kubectl get networkpolicies -n [namespace]
|
|
|
|
# Test from debug pod
|
|
kubectl run debug --image=nicolaka/netshoot -i --rm -- \
|
|
curl http://[service].[namespace].svc.cluster.local
|
|
```
|
|
|
|
### High Resource Usage
|
|
|
|
```bash
|
|
# Check resource usage
|
|
kubectl top pods -n [namespace]
|
|
|
|
# Check for OOMKilled
|
|
kubectl get pods -n [namespace] -o json | \
|
|
jq '.items[] | select(.status.containerStatuses[].lastState.terminated.reason=="OOMKilled") | .metadata.name'
|
|
|
|
# Increase resources
|
|
kubectl set resources deployment [name] -n [namespace] \
|
|
--limits=cpu=1000m,memory=1Gi \
|
|
--requests=cpu=200m,memory=256Mi
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
**Pre-deployment**:
|
|
- Always use `--dry-run=client` first
|
|
- Test in dev/staging before production
|
|
- Review resource limits
|
|
- Verify image tags (avoid :latest in production)
|
|
|
|
**During deployment**:
|
|
- Monitor rollout status
|
|
- Watch logs for errors
|
|
- Check pod health continuously
|
|
- Verify endpoints are ready
|
|
|
|
**Post-deployment**:
|
|
- Document what was deployed
|
|
- Monitor for 10-15 minutes
|
|
- Keep previous version info for rollback
|
|
- Update monitoring dashboards
|
|
|
|
**Production deployments**:
|
|
- Use blue-green or canary for critical services
|
|
- Set PodDisruptionBudgets
|
|
- Configure HorizontalPodAutoscaler
|
|
- Enable auto-rollback on failure
|
|
- Schedule during maintenance windows
|