DevOps 项目:Kubernetes 上基于微服务的应用程序的 CI/CD 管道

2025-05-26

DevOps 项目:Kubernetes 上基于微服务的应用程序的 CI/CD 管道

目录

  1. 概述
  2. 项目架构
  3. 步骤1:设置微服务存储库
  4. 第 2 步:使用 Jenkins 实现 CI/CD
  5. 步骤 3:使用 Docker 容器化微服务
  6. 步骤 4:部署到 Kubernetes
  7. 步骤5:使用Prometheus和Grafana实现监控
  8. 步骤 6:使用 ELK Stack 实现日志记录
  9. 结论
  10. 最后的想法

概述

该项目将指导您为基于微服务的应用程序设置端到端 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)
Enter fullscreen mode Exit fullscreen mode

这种结构确保了跨服务的一致性并促进了 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
Enter fullscreen mode Exit fullscreen mode

第 2 步:使用 Jenkins 实现 CI/CD

2.1. Jenkins 设置

Jenkins 是我们 CI/CD 流水线中的关键组件。请按照以下步骤进行设置:

  1. 安装 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
Enter fullscreen mode Exit fullscreen mode
  1. 启动 Jenkins
   sudo systemctl start jenkins
Enter fullscreen mode Exit fullscreen mode
  1. 访问 Jenkins:在浏览器中
    打开http://localhost:8080以访问 Jenkins 仪表板。

  2. 安装所需的插件

    • 导航到管理 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'
            }
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

3.2. 构建并推送 Docker 镜像

创建 Dockerfile 后,构建 Docker 镜像并将其推送到 Docker Hub。

docker build -t yourdockerhub/user-service:latest .
docker push yourdockerhub/user-service:latest
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

服务清单示例(service.yaml

apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  type: NodePort
  selector:
    app: user-service
  ports:
    - port: 8080
      targetPort: 8080


 nodePort: 30001
Enter fullscreen mode Exit fullscreen mode

4.3. 应用清单

使用以下命令将微服务部署到 Kubernetes 集群:

kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

5.2. 配置 Prometheus 来抓取 Kubernetes 指标

通过编辑文件配置 Prometheus 以从 Kubernetes 集群中抓取指标prometheus.yml

scrape_configs:
  - job_name: 'kubernetes'
    kubernetes_sd_configs:
      - role: node
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

6.2. 配置 Logstash 收集 Kubernetes 日志

创建 Logstash 配置文件以从 Kubernetes 收集日志:

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
  }
}
Enter fullscreen mode Exit fullscreen mode

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
PREV
DevOps 项目 - 终极 CICD 企业 DevOps 管道项目 postgres 命令语法不正确,正确的 cmd 是
NEXT
DevOps 初学者指南:完整的入门路线图