DEV Community

Cover image for Deployments and Load Balancing in Kubernetes
Zoo Codes
Zoo Codes

Posted on

Deployments and Load Balancing in Kubernetes

As modern web applications become increasingly complex and distributed, managing their deployment and operations can be a daunting task. Kubernetes, the popular open-source container orchestration platform, simplifies this process by providing a robust set of tools and abstractions for deploying, scaling, and managing applications in a reliable and scalable manner. In this article, we'll explore how Kubernetes can streamline the lifecycle of your web applications, from initial deployment to scaling, updates, monitoring, and more.

Introduction to Kubernetes Deployments

The foundation of running applications on Kubernetes is the deployment. A deployment defines how your application will be deployed and managed on the Kubernetes cluster. It specifies details like the number of replicated pods to run, the container images for the app, configuration data like environment variables, and update/rollout strategies.

Deployment Examples

For example, let's say you have a Python Flask web app built with the official python:3.9-slim image. Your deployment YAML could look like:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-web-app
spec:
  replicas: 5
  selector:
    matchLabels:
      app: flask-web
  template:
    metadata:
      labels:
        app: flask-web
    spec:
      containers:
      - name: flask-app
        image: my-docker-repo/flask-web:v2
        ports:
        - containerPort: 5000
        env:
        - name: FLASK_ENV
          value: production
Enter fullscreen mode Exit fullscreen mode

This instructs Kubernetes to create 5 replicated pods for the flask-web application. Each pod runs a container from the my-docker-repo/flask-web:v2 image with the container's port 5000 exposed. It also injects the FLASK_ENV=production environment variable.

You can define more advanced rollout configurations as well. For example:

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
Enter fullscreen mode Exit fullscreen mode

This rollout strategy does a rolling update - creating new pods slowly and taking old ones out of service until all are updated. The maxSurge setting allows provisioning 1 extra pod temporarily during updates, while maxUnavailable ensures all existing pods stay available.

Once you've defined your deployment YAML, you can apply it with kubectl apply -f deployment.yaml. Kubernetes will create/update the deployment, scheduling pods across nodes as needed.

Exposing Applications with Kubernetes Services

While a deployment runs your app's pods, a Kubernetes service exposes them for traffic from inside or outside the cluster. Common service types are:

  • ClusterIP (internal cluster access)
  • NodePort (external traffic on node ports 30000-32767)
  • LoadBalancer (provisions external cloud load balancer)

Service Examples

Continuing the Flask example, you could define a ClusterIP service like:

apiVersion: v1
kind: Service
metadata:
  name: flask-web  
spec:
  selector:
    app: flask-web
  ports:
  - port: 80
    targetPort: 5000
Enter fullscreen mode Exit fullscreen mode

This internally exposes the flask-web pods on port 80, load balancing traffic to the container's port 5000. To access externally, you'd change the type to LoadBalancer.

You apply the service YAML via kubectl apply -f service.yaml. Kubernetes will configure the service and allocate a cluster IP (and external load balancer for LoadBalancer type).

Scaling and Updating Deployments

One of Kubernetes' key benefits is the ability to easily scale and update your deployments.

To scale up or down, you simply modify the replicas count and apply the updated deployment:

kubectl edit deployment/flask-web # Change replicas
kubectl apply -f deployment.yaml
Enter fullscreen mode Exit fullscreen mode

Kubernetes will make sure additional pods get provisioned or terminated to match the desired replica count.

Updating to a new app version is just as straightforward - modify the container image tag in the deployment YAML and re-apply. Kubernetes will start a rolling update, gradually spinning up new pods on the updated image version and taking old ones out of service.

You can monitor rollout status via kubectl rollout status deployment/flask-web or get detailed rollout history with kubectl rollout history deployment/flask-web.

If you need to roll back to a previous version, that's just kubectl rollout undo deployment/flask-web.

Ingress and External Access

To expose services externally, you've seen you can use LoadBalancer services. There's also the concept of Ingress which acts as an external HTTP(S) load balancer.

An Ingress resource defines routing rules for external traffic to hit different services. For example:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-web
spec:
  defaultBackend:
    service:
      name: default-service
      port:
        number: 80
  rules:
  - http:
      paths:
      - path: /flask
        pathType: Prefix
        backend:
          service:
            name: flask-web
            port:
              number: 80
      - path: /django
        pathType: Prefix
        backend:
          service:
            name: django-web
            port:
              number: 8000
Enter fullscreen mode Exit fullscreen mode

This routes traffic to the /flask path to the flask-web service on port 80, /django to django-web service on 8000, and any other traffic to the default-service.

Monitoring and Logging

Finally, monitoring the health and logs of your deployments is crucial for ensuring the reliability and performance of your web applications. Kubernetes provides capabilities like:

  • Liveness and Readiness Probes to check app health
  • Resource Monitoring of CPU/Memory usage
  • Accessing Container Logs via kubectl logs
  • Integrating with Monitoring Services like Prometheus

For example, a liveness probe constantly checks if your app is running properly by hitting an endpoint like /healthz. If it fails, Kubernetes will restart the container.

You can also integrate various log shippers/aggregators to collect and analyze your application logs across all pods.

Conclusion

Kubernetes provides a rich set of tools and abstractions that simplify deploying, operating, scaling and monitoring modern web applications. By leveraging deployments, services, ingress, probes and other features effectively, you can run your apps in a highly available, self-healing environment. With Kubernetes, you can streamline the entire life-cycle of your web applications, from initial deployment to scaling, updates, monitoring, and beyond, enabling you to focus on building and improving your applications rather than worrying about the underlying infrastructure.

References:

Top comments (2)

Collapse
 
talhakhalid101 profile image
TalhaKhalid101

One LoadBalancer for public traffic, one for private traffic usually. Host based routing for all traffic with a single IP on each load balancers. Throw in cert-manager and external-dns and you got a stew going.

Collapse
 
ken_mwaura1 profile image
Zoo Codes

Exactly...! am working on part 2 to delve into LoadBalancer