Set up a multi-node Kubernetes cluster automatically with Jenkins

Setting up a multi-node Kubernetes cluster automatically using Jenkins involves creating a Jenkins pipeline that orchestrates the installation of Kubernetes on multiple nodes. This can be achieved using tools like kubeadm for cluster setup, along with Ansible or Shell scripts for automation. Below is a detailed guide on how to do this.

Prerequisites

  1. Jenkins Installed: Ensure Jenkins is installed and running.

  2. Nodes Ready: Have multiple nodes (VMs or physical servers) ready with SSH access.

  3. Kubernetes Packages: Ensure that kubelet, kubeadm, and kubectl are installed on all nodes (can be done during the Jenkins pipeline).

  4. Jenkins Node: Make sure your Jenkins instance can access all nodes via SSH.

Step-by-Step Guide

Step 1: Prepare Your Jenkins Job

  1. Create a New Pipeline Job:

    • Open your Jenkins dashboard.

    • Click on "New Item".

    • Enter a name for your job (e.g., Setup Kubernetes Cluster).

    • Select "Pipeline" and click OK.

Step 2: Configure the Pipeline Job

  1. In the job configuration page, scroll down to the "Pipeline" section.

  2. Choose "Pipeline script" from the dropdown.

Step 3: Add the Pipeline Script

In the "Pipeline" script text area, add the following script:

pipeline {
    agent any

    stages {
        stage('Prepare Nodes') {
            steps {
                script {
                    // Define your nodes
                    def nodes = [
                        'node1_ip',
                        'node2_ip',
                        'node3_ip'
                    ]

                    // Loop through nodes and install necessary packages
                    for (node in nodes) {
                        sh """
                        ssh -o StrictHostKeyChecking=no user@${node} 'sudo apt-get update -y && sudo apt-get install -y apt-transport-https ca-certificates curl && curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && sudo apt-get update -y && sudo apt-get install -y kubelet kubeadm kubectl && sudo systemctl enable kubelet && sudo systemctl start kubelet'
                        """
                    }
                }
            }
        }

        stage('Initialize Master Node') {
            steps {
                script {
                    def masterNode = 'node1_ip' // Set your master node IP

                    // Initialize Kubernetes on the master node
                    sh """
                    ssh -o StrictHostKeyChecking=no user@${masterNode} 'sudo kubeadm init --pod-network-cidr=192.168.0.0/16'
                    """
                }
            }
        }

        stage('Setup Kubeconfig') {
            steps {
                script {
                    def masterNode = 'node1_ip' // Set your master node IP

                    // Copy the kubeconfig file to the Jenkins node
                    sh """
                    ssh -o StrictHostKeyChecking=no user@${masterNode} 'mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config'
                    """
                }
            }
        }

        stage('Install Pod Network') {
            steps {
                script {
                    def masterNode = 'node1_ip' // Set your master node IP

                    // Install Calico or another Pod network (choose one)
                    sh """
                    ssh -o StrictHostKeyChecking=no user@${masterNode} 'kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml'
                    """
                }
            }
        }

        stage('Join Worker Nodes') {
            steps {
                script {
                    def masterNode = 'node1_ip' // Set your master node IP

                    // Get join command from the master node
                    def joinCommand = sh(script: "ssh -o StrictHostKeyChecking=no user@${masterNode} 'kubeadm token create --print-join-command'", returnStdout: true).trim()

                    // Define your worker nodes
                    def workerNodes = [
                        'node2_ip',
                        'node3_ip'
                    ]

                    // Join each worker node to the cluster
                    for (node in workerNodes) {
                        sh """
                        ssh -o StrictHostKeyChecking=no user@${node} '${joinCommand}'
                        """
                    }
                }
            }
        }
    }
}

Explanation of the Pipeline Script

  1. Prepare Nodes:

    • The script installs necessary packages (kubelet, kubeadm, kubectl) on all defined nodes (replace user with your SSH user).
  2. Initialize Master Node:

    • Initializes the Kubernetes master node with kubeadm init and sets a Pod network CIDR.
  3. Setup Kubeconfig:

    • Configures the kubeconfig file to allow the Jenkins pipeline to interact with the Kubernetes cluster.
  4. Install Pod Network:

    • Installs a Pod network add-on (in this case, Calico) to enable communication between Pods.
  5. Join Worker Nodes:

    • Retrieves the join command from the master node and executes it on each worker node to join them to the cluster.

Step 4: Save and Run the Job

  1. Click "Save" at the bottom of the job configuration page.

  2. Go back to the job's main page and click "Build Now" to execute the job.

Step 5: Verify the Cluster Setup

  1. Once the job completes, verify the cluster status by running:

     kubectl get nodes
    
  2. You should see the master and worker nodes listed in the output.

Additional Considerations

  • SSH Key Authentication: Make sure that the Jenkins user has SSH key access to all nodes without a password prompt.

  • Error Handling: Consider adding error handling in your script to manage potential failures.

  • Network Configuration: Ensure that all nodes can communicate with each other over the network.

  • Firewall Settings: Adjust firewall settings to allow Kubernetes traffic if necessary.

Conclusion

By following these steps, you have successfully created a Jenkins pipeline to set up a multi-node Kubernetes cluster automatically. This setup can be further customized based on your specific environment and requirements.