Container services and Kubernetes

Overview

Teaching: 20 min
Exercises: 20 min
Questions
  • How should services like databases or portals be deployed?

  • What is different about deploying services versus HPC applications?

Objectives
  • Learn about different frameworks used for deploying services

Container Services and Kubernetes

First Steps

kubectl get nodes
kubectl get pods
kubectl get pods -A

Create a Namespace

kubectl create namespace NAME

Deploy the Application

Create demo-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend-api
  template:
    metadata:
      labels:
        app: backend-api
    spec:
      containers:
      - name: api
        image: nginx:alpine
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend-api
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - host: demo.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 80
kubectl apply -f demo-app.yaml -n NAME  # OR --namespace=NAME
kubectl get pods,svc,ingress -n NAME

Key Kubernetes Features

Self-Healing

# Show running pods
kubectl get pods -n NAME

# Kill a pod
kubectl delete pod pod-name-xyz -n NAME

# Watch Kubernetes automatically recreate it
kubectl get pods -w -n NAME

Scaling

# Scale up during "traffic spike"
kubectl scale deployment backend-api --replicas=5 -n NAME
kubectl get pods -n NAME

# Scale down
kubectl scale deployment backend-api --replicas=2 -n NAME

Rolling Updates

# Update to new version with zero downtime
kubectl set image deployment/backend-api api=nginx:1.21-alpine -n NAME

# Watch the rolling update
kubectl rollout status deployment/backend-api -n NAME
kubectl get pods -n NAME

# Rollback if needed
kubectl rollout undo deployment/backend-api -n NAME

Resource Management

# Show resource usage
kubectl top nodes
kubectl top pods -n NAME

Port Forwarding

curl http://localhost:8000

# Forward local port to the service
kubectl port-forward svc/backend-service 8000:80 -n NAME

# Access in browser or curl
curl http://localhost:8000
# or open http://localhost:8000 in browser

Clean up Namespaces

kubectl delete namespaces NAME

Key Points

  • Docker Compose is a simple tool to deploy basic services using containers

  • Frameworks like Kubernetes, Rancher and OpenShift can help with deploying and managing complex containerized services.