Integrating Jenkins with Kubernetes: A Step-by-Step Guide

In today's fast-paced software development environment, Continuous Integration and Continuous Delivery (CI/CD) have become essential practices for teams striving to improve their workflows. One powerful combination for achieving efficient CI/CD pipelines is the integration of Jenkins with Kubernetes. In this post, we'll explore how to set up Jenkins on an Ubuntu server and connect it to a Kubernetes cluster, enabling you to automate deployment processes and manage containerized applications effectively.

Why Integrate Jenkins with Kubernetes?

Junke the integration of Jenkins and Kubernetes, you can:

  • Dynamically Provision Jenkins Agents: Jenkins can automatically create Jenkins agents as Kubernetes pods, allowing for efficient resource management.

  • Simplify Application Deployment: Deploy applications directly from Jenkins pipelines into your Kubernetes cluster.

  • Manage Kubernetes Resources: Use Jenkins jobs to orchestrate and manage your Kubernetes resources easily.

Prerequisites

Before you begin, make sure you have:

  • An Ubuntu machine (server or VM).

  • Jenkins installed and running. If not, follow these installation steps.

  • A Kubernetes cluster ready to use, which can be a local setup using Minikube or MicroK8s for development, or a managed service like EKS, AKS, or GKE for production.

Step 1: Install Jenkins on Ubuntu

If Jenkins isn't installed, here's how you can set it up:

  1. Update System Packages:

     sudo apt update
     sudo apt upgrade -y
    
  2. Install Java: Jenkins requires Java to run.

     sudo apt install openjdk-11-jdk -y
    
  3. Add Jenkins Repository and Install Jenkins:

     wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
     sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
     sudo apt update
     sudo apt install jenkins -y
    
  4. Start and Enable Jenkins Service:

     sudo systemctl start jenkins
     sudo systemctl enable jenkins
    
  5. Access Jenkins: Go to your browser and navigate to http://your_server_ip_or_domain:8080 to complete the setup.

Step 2: Install and Set Up Kubernetes

You can use Minikube for local testing. Here’s how:

  1. Install Minikube:

     curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
     sudo install minikube-linux-amd64 /usr/local/bin/minikube
    
  2. Start Minikube:

     minikube start --driver=docker
    
  3. Verify the Kubernetes Cluster:

     kubectl get nodes
    

Step 3: Install and Configure kubectl

kubectl is the command-line tool for interacting with Kubernetes:

  1. Install kubectl:

     sudo apt-get update
     sudo apt-get install -y apt-transport-https gnupg2
     curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
     echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
     sudo apt-get update
     sudo apt-get install -y kubectl
    
  2. Test kubectl Installation:

     kubectl version --client
    

Step 4: Install the Jenkins Kubernetes Plugin

  1. Install the Kubernetes Plugin: Go to the Jenkins Dashboard → Manage Jenkins → Manage Plugins. In the "Available" tab, search for "Kubernetes" and install the "Kubernetes" plugin.

  2. Restart Jenkins: Ensure the plugin is fully integrated.

     sudo systemctl restart jenkins
    

Step 5: Configure Jenkins to Use Kubernetes

  1. Add Kubernetes Cloud in Jenkins: Go to Manage Jenkins → Configure System. Under "Cloud", select "Add a new cloud" and choose "Kubernetes".

  2. Configure the Kubernetes Plugin:

    • Give your Kubernetes Cloud a name (e.g., "K8s").

    • Set the Kubernetes URL, which can be obtained using kubectl cluster-info.

    • Specify the Kubernetes Namespace (default is usually fine).

    • Add any required credentials.

  3. Test Your Connection: Click "Test Connection" to ensure Jenkins is linked to your Kubernetes cluster.

  4. Configure Pod Templates: Under the Kubernetes section, you can specify pod templates for your Jenkins agents.

Step 6: Create a Jenkins Pipeline to Deploy on Kubernetes

  1. Create a New Pipeline Job in the Jenkins dashboard.

  2. Define the Pipeline Script: Here's a sample script that runs a command in a Kubernetes pod:

     pipeline {
         agent {
             kubernetes {
                 label 'jenkins-agent'
                 yaml """
                 apiVersion: v1
                 kind: Pod
                 metadata:
                     labels:
                         some-label: some-label-value
                 spec:
                     containers:
                     - name: busybox
                       image: busybox
                       command:
                       - cat
                       tty: true
                 """
             }
         }
         stages {
             stage('Run') {
                 steps {
                     container('busybox') {
                         sh 'echo Hello from Kubernetes pod!'
                     }
                 }
             }
         }
     }
    
  3. Save and Run the Pipeline: Click "Build Now" to execute your pipeline.

Step 7: Verify the Integration

  • Use kubectl get pods to verify that a new pod was created in Kubernetes for your Jenkins agent.

  • Check Jenkins logs to ensure that the pipeline executed successfully.

Conclusion

Integrating Jenkins with Kubernetes on Ubuntu allows teams to leverage the orchestration capabilities of Kubernetes for efficient CI/CD pipelines. By dynamically provisioning Jenkins agents and deploying applications directly from Jenkins, you can significantly enhance your development workflows. This setup is particularly impactful for environments leveraging containerized applications and requiring robust automation.

Feel free to experiment with your pipeline configurations and explore the possibilities that this powerful integration offers!


This blog post can be further customized with visuals, code snippets, or personal anecdotes to enhance engagement with your audience. Happy blogging!