Home » Backend Dev » kubernetes » 30 Days kubernetes » Day 21: Kubernetes – CI/CD Pipelines with Kubernetes

Day 21: Kubernetes – CI/CD Pipelines with Kubernetes

Introduction to CI/CD Pipelines with Kubernetes

Continuous Integration (CI) and Continuous Deployment/Delivery (CD) are essential practices for modern application development. Kubernetes, being a powerful platform for container orchestration, integrates seamlessly with CI/CD pipelines to automate the building, testing, and deployment of applications.

This guide covers setting up a basic CI/CD pipeline, integrating popular tools like Jenkins or GitLab, and deploying applications to a Kubernetes cluster.


What is a CI/CD Pipeline?

Continuous Integration (CI):

Automates the process of integrating code changes into a shared repository, followed by automated builds and tests.

Continuous Deployment/Delivery (CD):

Automates the release process, ensuring code changes are deployed to production (or staging) after passing the CI phase.

Benefits of CI/CD in Kubernetes:

  • Automation: Streamlines the software delivery process.
  • Consistency: Reduces human error.
  • Scalability: Handles complex deployments with ease.
  • Faster Time-to-Market: Speeds up the release cycle.

Setting Up a CI/CD Pipeline

Step 1: Choose Your CI/CD Tool

Popular CI/CD tools compatible with Kubernetes include:

  1. Jenkins
  2. GitLab CI/CD
  3. ArgoCD
  4. Tekton

Example: Setting Up CI/CD with Jenkins

Prerequisites:

  • A running Kubernetes cluster.
  • Jenkins installed (can be deployed as a Kubernetes pod).

Step 1: Deploy Jenkins on Kubernetes

  1. Use Helm to install Jenkins:helm repo add jenkins https://charts.jenkins.io helm repo update helm install jenkins jenkins/jenkins --namespace jenkins --create-namespace
  2. Access Jenkins:kubectl get svc -n jenkinsUse the external IP or NodePort to access the Jenkins UI.
  3. Retrieve the admin password:kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- cat /run/secrets/chart-admin-password

Step 2: Configure Jenkins Pipeline for Kubernetes

  1. Install necessary plugins:
    • Kubernetes Plugin
    • Pipeline Plugin
  2. Create a Jenkinsfile:pipeline { agent { kubernetes { label 'jenkins-slave' yaml """ apiVersion: v1 kind: Pod spec: containers: - name: maven image: maven:3.6.3-jdk-11 command: - cat tty: true """ } } stages { stage('Build') { steps { sh 'mvn clean install' } } stage('Test') { steps { sh 'mvn test' } } stage('Deploy') { steps { kubernetesDeploy(kubeconfigId: 'k8s-config', configs: 'k8s/deployment.yaml') } } } }
  3. Commit the Jenkinsfile to your repository.
  4. Set up a Jenkins job to use this pipeline.

Step 3: Deploy to Kubernetes

Define your Kubernetes deployment in k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-docker-repo/my-app:latest
        ports:
        - containerPort: 8080

Apply the deployment:

kubectl apply -f k8s/deployment.yaml

Example: Setting Up CI/CD with GitLab

Step 1: Install GitLab Runner on Kubernetes

  1. Use Helm to deploy GitLab Runner:helm repo add gitlab https://charts.gitlab.io helm repo update helm install gitlab-runner gitlab/gitlab-runner --namespace gitlab --create-namespace
  2. Register the Runner:kubectl exec -it <gitlab-runner-pod> -- gitlab-runner register

Step 2: Create a .gitlab-ci.yml File

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker build -t my-docker-repo/my-app:latest .
    - docker push my-docker-repo/my-app:latest

test:
  stage: test
  script:
    - docker run my-docker-repo/my-app:latest npm test

deploy:
  stage: deploy
  script:
    - kubectl apply -f k8s/deployment.yaml

Step 3: Commit and Push

Commit the .gitlab-ci.yml file to your repository. GitLab will automatically detect and execute the pipeline.


Best Practices for CI/CD Pipelines in Kubernetes

  1. Use Immutable Docker Images: Avoid modifying images after creation.
  2. Secure Secrets: Use Kubernetes Secrets to manage sensitive data.
  3. Monitor Pipelines: Integrate monitoring tools like Prometheus.
  4. Optimize Builds: Use caching mechanisms to speed up builds.
  5. Automate Rollbacks: Ensure rollback mechanisms are in place for failed deployments.

Conclusion

CI/CD pipelines bring automation, consistency, and efficiency to application development and deployment. Integrating tools like Jenkins or GitLab with Kubernetes allows teams to build scalable and reliable workflows for modern applications.


References

⭐⭐⭐ Your support will help me continue to bring new Content. Love Coding ⭐⭐⭐ ❤️


Feedback and Discussion

Have questions or feedback? Comment below! Let’s build a collaborative learning environment. Check out more articles on Node.js, Express.js, and System Design.

Leave a Comment

Your email address will not be published. Required fields are marked *