{"id":14984741,"url":"https://github.com/sumitm01/ci-cd-for-docker-kubernetes-using-jenkins","last_synced_at":"2025-03-16T22:24:33.974Z","repository":{"id":181615776,"uuid":"666947177","full_name":"SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins","owner":"SumitM01","description":"This project contains documented details of implementation of a CI CD pipeline using Jenkins for Docker and Kubernetes","archived":false,"fork":false,"pushed_at":"2023-07-19T11:16:26.000Z","size":4751,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-23T08:34:39.882Z","etag":null,"topics":["continous-deployment","continous-integration","docker","docker-compose","dockerfile","dockerhub","dockerhub-image","helm-charts","jenkins","jenkins-pipeline","jenkins-plugins","jenkinsfile","kops","kubernetes","pipeline-as-a-code"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SumitM01.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-16T05:55:37.000Z","updated_at":"2025-01-09T06:20:28.000Z","dependencies_parsed_at":"2023-07-16T14:25:31.623Z","dependency_job_id":"d26523d8-0fdf-4674-bbb2-fb0ce52c47ba","html_url":"https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins","commit_stats":{"total_commits":18,"total_committers":2,"mean_commits":9.0,"dds":0.05555555555555558,"last_synced_commit":"8fde62d1c25b5f5e3a635e053d21a31bbc77b07b"},"previous_names":["sumitm01/ci-cd-for-docker-kubernetes-using-jenkins"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SumitM01%2FCI-CD-for-Docker-Kubernetes-using-Jenkins","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SumitM01%2FCI-CD-for-Docker-Kubernetes-using-Jenkins/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SumitM01%2FCI-CD-for-Docker-Kubernetes-using-Jenkins/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SumitM01%2FCI-CD-for-Docker-Kubernetes-using-Jenkins/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SumitM01","download_url":"https://codeload.github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243941381,"owners_count":20372232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["continous-deployment","continous-integration","docker","docker-compose","dockerfile","dockerhub","dockerhub-image","helm-charts","jenkins","jenkins-pipeline","jenkins-plugins","jenkinsfile","kops","kubernetes","pipeline-as-a-code"],"created_at":"2024-09-24T14:09:35.823Z","updated_at":"2025-03-16T22:24:33.951Z","avatar_url":"https://github.com/SumitM01.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CI-CD-for-Docker-Kubernetes-using-Jenkins\nThis project contains documented details of implementation of a CI CD pipeline using Jenkins for Docker and Kubernetes\n## Overview\nThe project focuses on implementing continuous delivery for Docker containers 🐳. The aim is to continuously build Docker images and deploy them to a Kubernetes cluster 🚀. This approach is commonly used in microservice architecture, but it can be applied anywhere containers are used.\n\nWith continuous code changes, there needs to be a continuous build and test process 🔨, as well as regular deployment of the containers 🚛. The deployment process is typically handled by the operations team 👷‍♂️, who manage the container orchestration tool like Kubernetes 🌐. However, manual deployment can create dependencies 🔗 and be time-consuming ⏰.\n\nTo address this, the project aims to automate the build and release process of container images, allowing for fast and continuous deployment as soon as code changes are made by developers 💻. This will be achieved through the implementation of a continuous delivery or deployment pipeline for Docker containers 📦.\n\n## Services used\n\u003cdiv width=\"50%\"\u003e\n\u003ca href=\"https://jenkins.io/\"\u003e\u003cimg src=\"https://logowik.com/content/uploads/images/jenkins8460.jpg\" height=\"80px\" alt=\"Jenkins\"\u003e\u003c/a\u003e\n\u003ca href=\"sonarqube.org\"\u003e\u003cimg src=\"https://1.bp.blogspot.com/-zYP58acwgq8/X_2nBaX8ESI/AAAAAAAAAIg/T8Jzb-Pfr00_9rIYpaa6DECiNHmg6S-sgCLcBGAsYHQ/s320/sonarqube-logo-square-small.png\" height=\"80px\" alt=\"Sonarqube Scanner\"\u003e\u003c/a\u003e\n\u003ca href=\"https://maven.apache.org/\"\u003e\u003cimg src=\"https://logowik.com/content/uploads/images/maven-apache3537.jpg\" height=\"80px\" alt=\"Maven\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.docker.com/\"\u003e\u003cimg src=\"https://logowik.com/content/uploads/images/301_docker.jpg\" height=\"80px\" alt=\"Docker\"\u003e\u003c/a\u003e\n\u003ca href=\"https://kubernetes.io/\"\u003e\u003cimg src=\"https://logowik.com/content/uploads/images/kubernetes5574.jpg\" height=\"80px\" alt=\"Kubernetes\"\u003e\u003c/a\u003e\n\u003ca href=\"https://helm.sh/\"\u003e\u003cimg src=\"https://logowik.com/content/uploads/images/helm6256.jpg\" height=\"80px\" alt=\"Helm\"\u003e\u003c/a\u003e\n\u003ca href=\"https://aws.amazon.com/ec2/\"\u003e\u003cimg src=\"https://seeklogo.com/images/A/aws-ec2-elastic-compute-cloud-logo-2F9E73DBA5-seeklogo.com.png\" height=\"80px\" alt=\"AWS EC2\"\u003e\u003c/a\u003e\n\u003ca href=\"https://aws.amazon.com/s3/\"\u003e\u003cimg src=\"https://logowik.com/content/uploads/images/amazon-s37765.jpg\" height=\"80px\" alt=\"AWS S3\"\u003e\u003c/a\u003e\n\u003ca href=\"https://aws.amazon.com/route53/\"\u003e\u003cimg src=\"https://seeklogo.com/images/A/aws-route-53-logo-EEB0D14819-seeklogo.com.png\" height=\"80px\" alt=\"AWS Route53\"\u003e\u003c/a\u003e\n\u003ca href=\"https://aws.amazon.com/elasticloadbalancing/\"\u003e\u003cimg src=\"https://seeklogo.com/images/A/aws-elastic-load-balancing-logo-73F2ABF601-seeklogo.com.png\" height=\"80px\" alt=\"AWS ELB\"\u003e\u003c/a\u003e\n\u003ca href=\"https://aws.amazon.com/iam/\"\u003e\u003cimg src=\"https://seeklogo.com/images/A/aws-iam-identity-and-access-management-logo-99B1CACF5A-seeklogo.com.png\" height=\"80px\" alt=\"AWS IAM\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/\"\u003e\u003cimg src=\"https://seeklogo.com/images/G/github-logo-5F384D0265-seeklogo.com.png\" height=\"80px\" alt=\"Github\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n## Project Architecture\nThe following events happen serially:\n\n- A developer makes a code change and pushes it to GitHub 💻.\n- Jenkins fetches the code, including the Dockerfile, Jenkinsfile, and Helm charts 📥.\n- The code is tested and analyzed using Checkstyle and SonarQube scanner 🔍, with results uploaded to SonarQube Server 📈.\n- If the code passes all quality gates, an artifact is built with Maven 🔨.\n- A Docker build process starts to build the Docker image 🐳.\n- If everything passes, the Docker image is pushed to Docker Hub 🚀.\n- Jenkins uses Helm to deploy the Helm charts to the Kubernetes Cluster 🌐.\n- The Helm chart deployment creates all necessary resources, such as pods, services, secrets, and volumes 📦.\n- If any changes are made, such as a new image tag for an application pod, they are implemented 🔧.\n\n## Implementation Details\n\n### Continous Integration Setup 🛠️\nFollow the README.md file in https://github.com/SumitM01/CI-using-Jenkins–Nexus-and-Sonaqube repository to create and setup the Continous Integration pipeline. Create instances for Jenkins and Sonarqube scanner only. Do not create an instance for Nexus artifact storage as it is not required.\n\n### Setup Jenkins server\n- Install these additional plugins on Jenkins.\n    - Docker pipeline 🐳\n- Log in to jenkins instance using SSH and install openjdk-11-jdk and openjdk-8-jdk using the following commands 🔧\n```bash\nsudo apt update\nsudo apt install openjdk-8-jdk -y\nsudo apt install openjdk-11-jdk -y\n```\n![configure-jenkins-maven](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/884b5ddd-6ed8-48fa-a9b3-fc41e48b7d2a)\n![configure-jenkins-credentials](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/e2d2e75f-a17f-4fb6-b619-dad633323ef3)\n\n- Configure JDK installation on Jenkins by providing Java_Home path.\n![configure-jenkins-jdk-8](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/7c0cc15a-5a01-4476-8fca-0cea82c00356)\n![configure-jenkins-jdk-11](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/54c88bc9-9d57-4143-b480-9365e66dc497)\n\n- Configure Sonarqube scanner and sonarqube server with sonarqube token 🔍\n![configure-jenkins-sonarqube-scanner](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/3d6dc20b-274d-4864-9f7c-c31d535d671e)\n![configure-jenkins-system-sonarqube-server](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/74f8b9b9-d0dc-42ca-864c-e9a55e6dd44f)\n\n- SSH to the instance and install docker engine in it using the following commands 🐳\n```bash\n#!/bin/bash\nsudo apt-get update\nsudo apt-get install ca-certificates curl gnupg -y\nsudo install -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -y\nsudo chmod a+r /etc/apt/keyrings/docker.gpg\necho \\\n\"deb [arch=\"$(dpkg --print-architecture)\" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\\n\"$(. /etc/os-release \u0026\u0026 echo \"$VERSION_CODENAME\")\" stable\" | \\\nsudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null\nsudo apt-get update\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y\n```\n- Add Jenkins user to Docker group 🔧\n```bash\nusermod -aG docker jenkins\n```\n\n### Complete kOps pre-requisites\n- Create a domain in GoDaddy and a subdomain in Route 53.🌐\n    - Create a Domain on GoDaddy like this.🖱️\n  ![domain-created](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/d0104093-b08f-464c-b23f-07f6e20db5f9)\n\n    - Create a sub-domain/hosted zone on AWS Route 53 like this.🖱️\n ![sub-domain-created](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/8fa21120-8e2b-4021-83c6-33bfbd2488d6)\n\n- Copy the NameServer records to Godaddy DNS manager 📋 from the subdomain.\n    - After creation of hosted zone, copy the displayed records 📋.\n  ![sub-domain-ns-recs](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/510fc11d-496b-4ce7-a860-c8ef7ab1840a)\n\n    - **On Godaddy DNS Manager**\n        - Under *Nameservers* section, click on *Change Numservers* and paste the copied records individually.\n    ![domain-ns-recs-replaced](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/f0612bcd-aa8a-421f-a591-e02c20d708fe)\n\n- Launch the kOps server instance with the following specifications 🚀:\n    - *AMI*: Ubuntu 20/18\n    - *Instance type/*: t2.micro\n    - *Security Group Inbound Rules*: 22 allowed from your IP\n![kops-server-created](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/d1c7e521-8cac-4a81-9b8f-80dd2619fd29)\n\n- Create an S3 bucket 🪣 on the same region as the server.\n    - During creation of the bucket ensure the bucket is in the same zone as the kops server.\n![s3-bucket-created](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/cbaa6172-9ada-431b-9921-6cdf17c1e9a7)\n\n- Create an IAM 🔐 role for using awscli and store its credentials.\n![iam-user-created](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/0c1f1212-cb9f-4b78-a6ee-a37f5b30a327)\n\n- Install awscli on kOps server and configure it with the IAM credentials 🔐.\n![configure-awscli](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/e87ae1db-2764-44fb-a43f-eb18e54e12e2)\n\n- Run the following command to download ⬇ awscli :\n```bash\napt get update\napt install awscli -y\n```\n- Install kubectl and kops from the kubernetes site 🌐:\n    - Install kubectl using the following command 🔧:\n    ```bash\n     curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl\"\n    ```\n    - Install kOps from Kubernetes site using the following command 🔧:\n    ```bash\n    curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '\"' -f 4)/kops-linux-amd64\n    ```\n    \n### Configure SSH key login to github remote:\n- Generate the ssh keys on the kops server using ssh-keygen 🔑\n- Go to account settings -\u003e SSH and GPG keys -\u003e add key -\u003e paste the contents of the public ssh key -\u003e save 💾\n![git-ssh-keys-created](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/65b17e78-dde6-4bba-9360-b2d28b0181a2)\n\n### Create a separate repository for the project 📁:\n- Clone the created repo into your kops machine using SSH link 🔗.\n```bash\ngit clone git@github.com:git_username/git_repository_name.git\n```\n- ***IMPORTANT***: Cloning the repository on the machine validates the authentication using the created SSH keys🔑.\n- Copy the contents 📋 of the vprofile-project/cicd-kube branch.\n- Clone 🔗 the vprofile-project repo onto the kops machine.\n```bash\ngit clone https://github.com/devopshydclub/vprofile-project.git\n```\n- Checkout to cicd-kube branch🔀.\n```bash\ngit checkout cicd-kube\n```\n- Copy all the files in the root to the created repository folder 📋.\n```bash\ncp -r * ../your_created_repo/ \n```\n- Delete files inside your created repo that are not required: docker-db, docker-web, ansible,compose 🗑️.\n```bash\nrm -rf docker-db docker-web ansible compose\n```\n- Copy dockerfile from inside docker-app folder to root and delete dockerapp folder 📋.\n```bash\ncp Dockerapp/Dockerfile .\nrm -rf Dockerapp\n```\n- Delete 🗑️ contents 📋 inside helm/vprofilecharts/templates folder 📁 and replace them with contents of Deploying-an-application-on-Kubernetes-    cluster/Setupfiles folder📁.\n```bash\ncd helm/vprofilecharts/templates\nrm -rf\ncd \ngit clone https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster.git\ncp -r Deploying-an-application-on-Kubernetes-cluster/Setupfiles/* your_created_repo/helm/vprofilecharts/templates/\n```\n### Create an EC2 volume and configure it 💽:\n- Create an EC2 volume using the following command🔧:\n```bash\naws ec2 create-volume --availability-zone=your_prefered_zone --size=3 --volume-type=gp2\n```\n![ec2-volume-created](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/eddbd266-e9ac-471e-91c9-4462cd424c68)\n\n- Note down the volume ID as displayed after volume creation📝.\n- Specify the volume ID in the vprodbdep.yml file with the copied ID 🔧.\n- **On AWS console**\n    - Go to EC2 management console🖱️.\n    - On Navigation Pane, go to volumes 🖱️.\n    - Search for the created volume with the volume ID and select it🔍.\n    - Click on Manage tags and add the following tag to it🔧:\n        - Key : KubernetesCluster\n        - Value : your_subdomain_name\n        - ***IMPORTANT:*** This is necessary because without the cluster tags the volume won't get attached to the required instance for database purposes⚡.\n      \n\n### Create Kubernetes Cluster using kops🌐:\n- Run the following command to create a Kubernetes cluster using kOps:🚀\n```bash\nkops create cluster --name=your_subdomain_name --state=s3://your_bucket_name --zones=your_preferred_zone --node-count=2 --node-size=t2.small --master-size=t3.medium --dns-zone=your_subdomain_name\n```\n### Launch Kubernetes cluster using kops:🚢\n- Run the following command to launch the created cluster using kOps:🚀\n```bash\nkops update cluster --name vprofile.sumitmishra.info --state=s3://vprofile-kube-project --yes --admin\n```\n- Wait for 10-15 minutes for the cluster to launch fully.⏳\n\n### Install Helm on the instance☸️\n- While you wait for the cluster to be launched, you can install Helm on the kops server using the following commands\n```bash\ncd\nwget https://get.helm.sh/helm-v3.12.2-linux-amd64.tar.gz \ntar -zxvf helm-v3.12.2-linux-amd64.tar.gz\nmv linux-amd64/helm /usr/local/bin/helm\nhelm --help\n```\n![Installing-helm](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/5979710e-aba6-4847-902f-5a86e561bb8c)\n\n### Check health of the cluster using kops:\n- Run the following command to validate the created cluster using kOps:✅\n```bash\nkops validate cluster --name=vprofile.sumitmishra.info --state=s3://vprofile-kube-project\n```\n![cluster-validation](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/c589e62c-87dc-4404-93c1-09dc4433d064)\n\n### Configure nodes of kubernetes cluster:⚙️\n- Run the following command to taint all nodes to be Scheduled on launch.\n```bash\nkubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-\n```\n- ***IMPORTANT:*** This is very important because, the latest kubernetes versions do not allow scheduling to be done on control nodes which causes various errors during deployment, to avoid that we should allow scheduling on the control node.\n- Run the following command to check whether all nodes have the same zone.⚡\n```bash\nkubectl get nodes -L zone\n```\n- If there are no records under Zone then assign zones to individual nodes by running the following command for each node.\n```bash\nkubectl label nodes \u003cnode-name\u003e zone=your_prefered_zone\n```\n- ***IMPORTANT:*** This is necessary because the node should be in the same zone as the created volume in order to get attached to it and in the same zone as specified in the deployment files in order to not raise an error during deployment.⚡\n\n### Configure Node on Jenkins and kops server: 🖥️\n- **On kops server**\n- Connect to kops-server using SSH client.\n- Using ubuntu user, install open-jdk-11 in the server.📦\n```bash\nsudo apt update\nsudo apt install openjdk-11-jdk -y\n```\n- Create a folder as /opt/jenkins-slave and provide ownership of jenkins-slave to ubuntu user.📁\n```bash\nsudo mkdir /opt/jenkins-slave\nsudo chown ubuntu.ubuntu /opt/jenkins-slave\n```\n- **On Jenkins server**\n- Configure a node with the following settings:⚙️\n    - Remote root directory : /opt/jenkins-slave\n    - Labels:KOPS\n    - Usage: only build jobs with label expressions matching this node\n    - Launch method:launch agents via ssh\n    - Host: private kops IP\n    - Credentials: kops instance private login key\n    - Host key verification strategy: non verifying verification strategy\n    - Availability: keep this agent online as much as possible\n\n### Write the Jenkinsfile ✍️\n- **On local_machine**\n- Write a Jenkinsfile inside your-created-repository by referring to the Jenkinsfile present in vprofile-project/cicd-kube directory.\n- Push the contents to github remote repo.\n\n### Configure and Run the pipeline:🚀\n- **On jenkins**\n    - Create a pipeline\n    - Choose Poll SCM and provide * * * * * \n    - Choose Pipeline script from SCM and provide your github repository, branch and Jenkinsfile path then save.💾\n    - Now commit to the repository then see that the pipeline gets automatically triggered after the commit.🚨\n    - Wait for the pipeline to be completed successfully.✅\n![Pipeline-success](https://github.com/SumitM01/CI-CD-for-Docker-Kubernetes-using-Jenkins/assets/65524561/89887083-1ba6-4395-8515-267371ead5c6)\n\n\n- After the successful completion of the pipeline do the following\n### Create a Route53 record 📝\n- **On kops server**\n- SSH to kops-server. \n- Run the following command to list all the running services in the project.📋\n```bash\nkubectl get svc\n```\n- Copy the Load balancer ARN from the displayed services.\n- Create a new record in the hosted zone of route 53 with the value as the dns of load balancer.🌐\n\n## Results🎉\nAfter everything is done, wait for 5-10 mins⏳ then validate the services by accessing the website using the URL.🔗\n- We can see that the website is up and the frontend services are running fine.\n**Login Page**\n  ![login-page](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/bf3251d9-50da-4203-be7a-767d3a47d98c)\n\n**Welcome Page**\n  ![welcome-page](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/25627cee-dcd4-4c03-9915-2b1695592b06)\n\n\n- Here we can see that the backend services have been created and configured and are also running fine.\n**User details Page (Database Validation)**\n  ![db-validation](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/2970b6b7-2336-429f-a20d-21c322864d01)\n\n**User details Page (Cache Validation)**\n![cache-validation](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/1b129f62-1ce8-4613-a41c-d5a580ee3194)\n\n**Rabbitmq status Page**\n  ![rabbitmq-page](https://github.com/SumitM01/Deploying-an-application-on-Kubernetes-cluster/assets/65524561/6f7ec5e4-843b-412d-851a-a17d4841f20f)\n  \n## Cleanup🧹\n- Cleanup the services one by one.\n- Delete the cluster in the kops vm using the following command\n```bash\nkops delete cluster --name your_subdomain_name --state=s3://your_bucket_name --yes\n```\n- Take a snapshot of the entire stack and store it in an s3 bucket for future use.🔮\n- Poweroff/terminate the instances\n- Delete security groups.🗑️\n- Delete S3 buckets if you don't require them.🗑️\n- Delete the hosted zone on AWS Route53 if not required.🗑️\n\n## Conclusion\nThis project implmented the complete Continous Integration and Continous Deployment pipeline using Jenkins for production deployment on Docker and Kubernetes cluster. This ensures efficient and streamlined development process and maintenance of the application.  \n\nAs documented in this README file, I have invested MANY MANY HOURS of my time in **researching 🔎, learning 📖, debugging 👨‍💻** to implement this project. If you appreciate this document please give it a ⭐, share with friends and do give it a try. Thank you for reading this! 😊\n\n## References\n- https://github.com/devopshydclub/vprofile-project/tree/cicd-kube\n- https://www.udemy.com/course/decodingdevops\n- https://Kubernetes.io\n- https://hub.docker.com\n- https://dcc.godaddy.com\n- https://google.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumitm01%2Fci-cd-for-docker-kubernetes-using-jenkins","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsumitm01%2Fci-cd-for-docker-kubernetes-using-jenkins","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumitm01%2Fci-cd-for-docker-kubernetes-using-jenkins/lists"}