DEV Community

Abhay Singh Kathayat
Abhay Singh Kathayat

Posted on

Deploying Dockerized Applications with Helm Charts on Kubernetes

Docker and Helm Charts for Kubernetes: Simplifying Containerized Application Deployment

In the world of Kubernetes, Helm is the de facto package manager that simplifies the deployment and management of applications, making it easier to install, upgrade, and manage complex Kubernetes applications. When combined with Docker, Helm charts enable efficient and reproducible deployments of containerized applications in a Kubernetes environment.

In this article, we'll dive into how Docker and Helm work together, how to use Helm charts for deploying Dockerized applications on Kubernetes, and best practices for Helm-based Kubernetes application management.


What are Docker and Helm Charts?

  • Docker: Docker is a platform used to build, ship, and run applications in containers. It allows you to package an application and all its dependencies into a single container image, which can be easily deployed and run across different environments.

  • Helm: Helm is a package manager for Kubernetes that helps you define, install, and manage Kubernetes applications. Helm charts are pre-configured application templates that allow users to quickly deploy complex applications on Kubernetes with minimal configuration.


How Docker and Helm Work Together

  • Docker Containers: Docker provides the foundational environment where applications run inside containers. These containers are packaged with all their dependencies, making it easy to deploy applications consistently.

  • Helm Charts: Helm charts define Kubernetes resources such as deployments, services, and ingress. When you want to deploy a Dockerized application in Kubernetes, you can use a Helm chart to define how Kubernetes should configure and deploy the application container.

In essence, Helm is used to automate and streamline the deployment of Docker containers to Kubernetes clusters.


Key Components of Helm Charts

Helm charts are packaged applications that include the following components:

  1. Chart.yaml: Contains metadata about the chart, including its name, version, and description.

  2. Templates: Kubernetes manifests (YAML files) that define resources like Deployments, Services, ConfigMaps, Secrets, etc. These templates can be parameterized with values that are supplied at install or upgrade time.

  3. Values.yaml: The default configuration values for the chart. These values can be overridden by users when deploying the chart.

  4. Charts: A directory that contains other Helm charts (optional). Charts can be dependencies for the application being deployed.

  5. README.md: Provides documentation and usage instructions for the chart.


How to Deploy Dockerized Applications with Helm Charts on Kubernetes

Let’s go through the steps of using Helm charts to deploy a Dockerized application to a Kubernetes cluster.

1. Create a Dockerized Application

Start by creating a Dockerized application. Let's assume you're deploying a simple web application (e.g., a Node.js app) in a Docker container.

  • Example Dockerfile for a Node.js app:
   # Use the official Node.js image from Docker Hub
   FROM node:14

   # Set the working directory inside the container
   WORKDIR /app

   # Copy the package.json and package-lock.json files
   COPY package*.json ./

   # Install dependencies
   RUN npm install

   # Copy the rest of the application code
   COPY . .

   # Expose the port the app will run on
   EXPOSE 3000

   # Start the application
   CMD ["npm", "start"]
Enter fullscreen mode Exit fullscreen mode

After building the Docker image, push it to a container registry like Docker Hub or your private registry.

   docker build -t my-node-app .
   docker push my-node-app:latest
Enter fullscreen mode Exit fullscreen mode

2. Create a Helm Chart for the Application

Now that you have your Docker image, you can create a Helm chart to deploy it to Kubernetes.

  • Install Helm (if not installed):
   curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Enter fullscreen mode Exit fullscreen mode
  • Create a Helm chart:

Use Helm to generate a basic chart for your application:

   helm create my-node-app
Enter fullscreen mode Exit fullscreen mode

This will generate a directory structure like this:

   my-node-app/
   ├── charts/
   ├── templates/
   ├── Chart.yaml
   ├── values.yaml
Enter fullscreen mode Exit fullscreen mode
  • Customize the values.yaml file:

Update the values.yaml file to point to the Docker image and specify configuration options:

   replicaCount: 2

   image:
     repository: my-node-app
     tag: "latest"
     pullPolicy: IfNotPresent

   service:
     type: ClusterIP
     port: 80

   ingress:
     enabled: false

   resources: {}
Enter fullscreen mode Exit fullscreen mode
  • Modify the deployment template (templates/deployment.yaml):

Ensure the deployment template uses the image.repository and image.tag values:

   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: {{ .Release.Name }}
   spec:
     replicas: {{ .Values.replicaCount }}
     selector:
       matchLabels:
         app: {{ .Release.Name }}
     template:
       metadata:
         labels:
           app: {{ .Release.Name }}
       spec:
         containers:
           - name: {{ .Release.Name }}
             image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
             ports:
               - containerPort: 80
Enter fullscreen mode Exit fullscreen mode

This will deploy your Dockerized application on Kubernetes.

3. Install the Helm Chart on Kubernetes

  • Install the chart:

Use Helm to deploy the chart to your Kubernetes cluster:

   helm install my-node-app ./my-node-app
Enter fullscreen mode Exit fullscreen mode

This will deploy your Dockerized application as a Kubernetes deployment, along with the required services and other resources defined in the Helm chart.

  • Check the Deployment:

You can verify that the deployment was successful by checking the Kubernetes resources:

   kubectl get deployments
   kubectl get pods
   kubectl get services
Enter fullscreen mode Exit fullscreen mode

4. Upgrade or Rollback the Helm Release

  • Upgrade the application:

When you need to update your Docker image or make changes to the configuration, you can modify the chart and upgrade the Helm release:

   helm upgrade my-node-app ./my-node-app
Enter fullscreen mode Exit fullscreen mode
  • Rollback the application:

If something goes wrong, Helm allows you to easily rollback to a previous release:

   helm rollback my-node-app 1
Enter fullscreen mode Exit fullscreen mode

Advantages of Using Docker and Helm Together

  1. Simplified Management: Helm charts abstract away complex Kubernetes configurations, making it easier to deploy and manage Dockerized applications.

  2. Version Control: Helm charts can be versioned, enabling you to track changes and easily roll back to previous versions of your application.

  3. Configuration Customization: Helm charts allow you to define configuration parameters that can be easily adjusted at install or upgrade time without changing the core application code.

  4. Reusability: Helm charts are reusable, and you can share them across teams or the community, speeding up the deployment process.

  5. Integration with CI/CD: Helm charts are a great fit for continuous integration and delivery (CI/CD) pipelines, allowing for automated deployment of Dockerized applications in Kubernetes environments.


Best Practices for Using Docker and Helm Charts in Kubernetes

  1. Organize Helm Charts: Keep your Helm charts organized in a repository. You can create your own Helm chart repository or use public repositories like Helm Hub or Artifact Hub to manage charts.

  2. Use Docker Multistage Builds: If your Dockerfile is complex, consider using multistage builds to optimize the size of your images and speed up deployment.

  3. Helm Chart Testing: Before deploying Helm charts to production, test them in a staging or testing environment. You can use Helm’s helm test command to run tests on your charts.

  4. Version Control: Always version your Helm charts and Docker images so you can easily track changes and perform rollbacks.

  5. Kubernetes Resource Requests and Limits: Define appropriate CPU and memory requests and limits in your Helm chart’s values.yaml to ensure that your application runs efficiently in Kubernetes.


Conclusion

Combining Docker with Helm charts for Kubernetes provides a powerful and scalable solution for deploying, managing, and upgrading containerized applications. Docker ensures that your application is packaged consistently, while Helm provides a robust way to define and deploy Kubernetes resources with minimal effort. By leveraging both tools, you can simplify the deployment of Dockerized applications in Kubernetes, making it easier to scale and manage complex, cloud-native systems.


Top comments (0)