Cloud / HELM Interview Questions
How do you implement Blue-Green and Canary deployments with Helm?
Advanced deployment patterns with Helm require careful release management and service routing.
Blue-Green deployment pattern: # values.yaml blue: enabled: true replicaCount: 3 image: tag: blue-1.0 green: enabled: false replicaCount: 3 image: tag: green-2.0 service: selectorVersion: blue # templates/deployment-blue.yaml {{- if .Values.blue.enabled }} apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "myapp.fullname" . }}-blue labels: version: blue spec: replicas: {{ .Values.blue.replicaCount }} selector: matchLabels: app: {{ include "myapp.name" . }} version: blue template: metadata: labels: version: blue spec: containers: - name: app image: {{ .Values.image.repository }}:{{ .Values.blue.image.tag }} {{- end }} # Same for deployment-green.yaml # Service toggles between versions apiVersion: v1 kind: Service metadata: name: {{ include "myapp.fullname" . }} spec: selector: version: {{ .Values.service.selectorVersion }}
Blue-Green deployment procedure: # Deploy blue (current) helm upgrade --install myapp ./chart \\ --set blue.enabled=true,green.enabled=false,service.selectorVersion=blue # Deploy green alongside helm upgrade --install myapp ./chart \\ --set blue.enabled=true,green.enabled=true,service.selectorVersion=blue # Test green kubectl port-forward deployment/myapp-green 8080:80 # Switch traffic to green helm upgrade --install myapp ./chart \\ --set blue.enabled=true,green.enabled=true,service.selectorVersion=green # Remove blue after verification helm upgrade --install myapp ./chart \\ --set blue.enabled=false,green.enabled=true,service.selectorVersion=green
Canary deployment with Istio weights: # templates/virtualservice.yaml apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: {{ include "myapp.fullname" . }} spec: hosts: - {{ include "myapp.fullname" . }} http: - route: - destination: host: {{ include "myapp.fullname" . }} subset: stable weight: {{ sub 100 .Values.canary.weight }} - destination: host: {{ include "myapp.fullname" . }} subset: canary weight: {{ .Values.canary.weight }}
Automated canary deployment script: #!/bin/bash WEIGHT=10 STEP=10 MAX_WEIGHT=100 while [ $WEIGHT -le $MAX_WEIGHT ]; do helm upgrade myapp ./chart --set canary.weight=$WEIGHT # Monitor metrics ERROR_RATE=$(curl -s prometheus:9090/api/v1/query?query=error_rate) if [ $(echo "$ERROR_RATE > 0.01" | bc) -eq 1 ]; then echo "Error rate too high, rolling back" helm rollback myapp break fi sleep 300 # Wait 5 minutes WEIGHT=$((WEIGHT + STEP)) done
Argo Rollouts with Helm: apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: myapp spec: strategy: canary: steps: - setWeight: 20 - pause: {duration: 1m} - setWeight: 40 - pause: {duration: 1m} - setWeight: 60 - pause: {duration: 1m} - setWeight: 80 - pause: {duration: 1m} - setWeight: 100 template: metadata: labels: app: myapp spec: containers: - name: app image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
More Related questions...