DevOps 项目:Kubernetes 上基于微服务的应用程序的 CI/CD 管道
目录
- 概述
- 项目架构
- 步骤1:设置微服务存储库
- 第 2 步:使用 Jenkins 实现 CI/CD
- 2.1 Jenkins 设置
- 2.2为 CI/CD 创建 Jenkinsfile
- 步骤 3:使用 Docker 容器化微服务
- 步骤 4:部署到 Kubernetes
- 4.1设置 Kubernetes 集群
- 4.2创建 Kubernetes 清单
- 4.3应用清单
- 步骤5:使用Prometheus和Grafana实现监控
- 步骤 6:使用 ELK Stack 实现日志记录
- 结论
- 最后的想法
概述
该项目将指导您为基于微服务的应用程序设置端到端 CI/CD 流水线。您将学习如何使用Jenkins、Docker、Kubernetes、Prometheus、Grafana 和 ELK Stack构建、部署、监控和记录微服务架构。
项目架构
该项目由以下部分组成:
- 微服务:用户服务、订单服务、支付服务。
- Jenkins:用于持续集成和部署。
- Docker:用于服务的容器化。
- Kubernetes:用于协调部署。
- Prometheus 和 Grafana:用于监控和可观察性。
- ELK Stack:用于日志记录和日志管理。
步骤1:设置微服务存储库
1.1. 创建存储库
您需要为每个微服务创建三个单独的 Git 存储库:
- 用户服务
- 订单服务
- 支付服务
1.2. 微服务结构
每个存储库应具有以下目录结构:
- src/
- main/
- java/
- resources/
- Dockerfile
- Jenkinsfile
- pom.xml (for Maven projects) or package.json (for Node.js projects)
这种结构确保了跨服务的一致性并促进了 CI/CD 流程。
1.3. 克隆存储库
首先,将每个存储库克隆到本地机器:
git clone https://github.com/SelimHorri/ecommerce-microservice-backend-app/user-service
git clone https://github.com/SelimHorri/ecommerce-microservice-backend-app/order-service
git clone https://github.com/SelimHorri/ecommerce-microservice-backend-app/payment-service
第 2 步:使用 Jenkins 实现 CI/CD
2.1. Jenkins 设置
Jenkins 是我们 CI/CD 流水线中的关键组件。请按照以下步骤进行设置:
- 安装 Jenkins:
wget -q -O - https://pkg.jenkins.io/debian/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-get update
sudo apt-get install jenkins
- 启动 Jenkins:
sudo systemctl start jenkins
-
访问 Jenkins:在浏览器中
打开http://localhost:8080
以访问 Jenkins 仪表板。 -
安装所需的插件:
- 导航到管理 Jenkins >管理插件。
- 安装以下插件:
- Docker 管道插件
- Kubernetes 插件
- Git插件
2.2. 为 CI/CD 创建 Jenkinsfile
每个微服务都应该在其存储库中有一个Jenkinsfile
来定义 CI/CD 管道。
Jenkinsfile 示例:
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/yourusername/user-service.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Docker Build & Push') {
steps {
script {
dockerImage = docker.build("yourdockerhub/user-service:${env.BUILD_ID}")
docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-credentials') {
dockerImage.push("${env.BUILD_ID}")
dockerImage.push("latest")
}
}
}
}
stage('Deploy to Kubernetes') {
steps {
sh 'kubectl apply -f kubernetes/deployment.yaml'
}
}
}
}
这Jenkinsfile
将自动执行构建、Docker 镜像创建以及到 Kubernetes 的部署。
步骤 3:使用 Docker 容器化微服务
3.1. 为每个服务创建 Dockerfile
每个微服务都需要Dockerfile
定义如何构建容器镜像。
示例 Dockerfile(用于基于 Java 的服务):
# Use an official Java runtime as a parent image
FROM openjdk:11-jre-slim
# Set the working directory in the container
WORKDIR /app
# Copy the jar file into the container
COPY target/user-service.jar /app/user-service.jar
# Run the jar file
ENTRYPOINT ["java", "-jar", "/app/user-service.jar"]
# Expose the port the application runs on
EXPOSE 8080
3.2. 构建并推送 Docker 镜像
创建 Dockerfile 后,构建 Docker 镜像并将其推送到 Docker Hub。
docker build -t yourdockerhub/user-service:latest .
docker push yourdockerhub/user-service:latest
order-service
对和重复该过程payment-service
。
步骤 4:部署到 Kubernetes
4.1. 设置 Kubernetes 集群
您可以选择使用 Minikube 在本地 Kubernetes 集群上部署应用程序,或者在生产环境中在 AWS EKS 上部署应用程序。
Minikube 设置:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start
EKS 设置(需要 AWS CLI):
aws eks --region us-west-2 create-cluster --name DevOpsCluster --role-arn arn:aws:iam::YOUR_ACCOUNT_ID:role/EKSRole --resources-vpc-config subnetIds=subnet-0123456789abcdef0,subnet-abcdef0123456789
4.2. 创建 Kubernetes 清单
为每个微服务创建部署和服务清单。
示例部署清单(deployment.yaml
):
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
replicas: 3
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: yourdockerhub/user-service:latest
ports:
- containerPort: 8080
服务清单示例(service.yaml
):
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
type: NodePort
selector:
app: user-service
ports:
- port: 8080
targetPort: 8080
nodePort: 30001
4.3. 应用清单
使用以下命令将微服务部署到 Kubernetes 集群:
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
order-service
对和重复该过程payment-service
。
步骤5:使用Prometheus和Grafana实现监控
5.1. 安装 Prometheus 和 Grafana
要安装 Prometheus 和 Grafana,请使用 Kubernetes 的包管理器 Helm。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm install prometheus prometheus-community/prometheus
helm install grafana grafana/grafana
5.2. 配置 Prometheus 来抓取 Kubernetes 指标
通过编辑文件配置 Prometheus 以从 Kubernetes 集群中抓取指标prometheus.yml
:
scrape_configs:
- job_name: 'kubernetes'
kubernetes_sd_configs:
- role: node
5.3. 访问 Grafana 仪表板
访问 Grafanahttp://localhost:3000
并使用默认凭据登录admin/admin
。导入 Prometheus 作为数据源并创建仪表板以可视化指标。
步骤 6:使用 ELK Stack 实现日志记录
6.1. 在 Kubernetes 上部署 ELK Stack
使用 Helm 部署 ELK(Elasticsearch、Logstash、Kibana)堆栈:
helm repo add elastic https://helm.elastic.co
helm install elasticsearch elastic/elasticsearch
helm install kibana elastic/kibana
helm install logstash elastic/logstash
6.2. 配置 Logstash 收集 Kubernetes 日志
创建 Logstash 配置文件以从 Kubernetes 收集日志:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
}
6.3. 访问 Kibana 仪表板
访问 Kibanahttp://localhost:5601
并可视化从 Kubernetes 收集的日志。
结论
在本项目中,您学习了如何为基于微服务的应用程序设置端到端 CI/CD 流水线,将其部署到 Kubernetes,并使用 Prometheus、Grafana 和 ELK Stack 进行监控。此设置具有高度可扩展性,并为任何微服务架构提供了坚实的基础。
最后的想法
该项目旨在为 DevOps 工程师提供全面的学习体验。通过遵循本指南,您将获得关键 DevOps 工具和实践的实践经验。如需了解更多详细内容和讨论,请访问Dev.to 上的完整文章。
👤 作者

加入我们的电报社区||在 GitHub 上关注我以获取更多 DevOps 内容!
文章来源:https://dev.to/prodevopsguytech/devops-project-cicd-pipeline-for-a-microservices-based-application-on-kubernetes-1ba8