2.1詹金斯設置
4.3應用清單
此專案將指導您為基於微服務的應用程式設定端對端 CI/CD 管道。您將學習如何使用Jenkins、Docker、Kubernetes、Prometheus、Grafana 和 ELK Stack建置、部署、監控和記錄微服務架構。
此專案由以下部分組成:
微服務:用戶服務、訂單服務、支付服務。
Jenkins :用於持續整合和部署。
Docker :用於服務的容器化。
Kubernetes :用於編排部署。
Prometheus & Grafana :用於監控和可觀察性。
ELK Stack :用於日誌記錄和日誌管理。
您需要為每個微服務建立三個單獨的 Git 儲存庫:
使用者服務
訂單服務
支付服務
每個儲存庫應具有以下目錄結構:
- src/
- main/
- java/
- resources/
- Dockerfile
- Jenkinsfile
- pom.xml (for Maven projects) or package.json (for Node.js projects)
這種結構確保了服務之間的一致性並促進了 CI/CD 流程。
首先,將每個儲存庫克隆到本機:
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
Jenkins 是我們 CI/CD 管道中的關鍵元件。請依照以下步驟進行設定:
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
sudo systemctl start jenkins
在瀏覽器中開啟http://localhost:8080
以存取 Jenkins 儀表板。
導覽至管理 Jenkins >管理插件。
安裝以下插件:
- Docker Pipeline Plugin
- Kubernetes Plugin
- Git Plugin
每個微服務的儲存庫中都應該有一個Jenkinsfile
來定義 CI/CD 管道。
詹金斯文件範例:
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 的操作。
每個微服務都需要一個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
建立 Dockerfile 後,建置 Docker 映像並將其推送到 Docker Hub。
docker build -t yourdockerhub/user-service:latest .
docker push yourdockerhub/user-service:latest
對order-service
和payment-service
重複該程序。
您可以選擇使用 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
為每個微服務建立部署和服務清單。
部署清單範例 ( 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
使用以下命令將微服務部署到 Kubernetes 叢集:
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
對order-service
和payment-service
重複該程序。
若要安裝 Prometheus 和 Grafana,請使用 Helm(Kubernetes 的套件管理器)。
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
透過編輯prometheus.yml
檔案來配置 Prometheus 從 Kubernetes 叢集中抓取指標:
scrape_configs:
- job_name: 'kubernetes'
kubernetes_sd_configs:
- role: node
透過http://localhost:3000
存取 Grafana 並使用預設admin/admin
登入。導入 Prometheus 作為資料來源並建立儀表板以視覺化指標。
使用 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
建立 Logstash 設定檔以從 Kubernetes 收集日誌:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
}
透過http://localhost:5601
存取 Kibana 並視覺化從 Kubernetes 收集的日誌。
在此專案中,您學習如何為基於微服務的應用程式設定端對端 CI/CD 管道,將其部署到 Kubernetes,並使用 Prometheus、Grafana 和 ELK Stack 對其進行監控。此設定具有高度可擴展性,並為任何微服務架構提供了堅實的基礎。
該計畫旨在為 DevOps 工程師提供全面的學習體驗。透過遵循本指南,您將獲得關鍵 DevOps 工具和實踐的實務經驗。有關更詳細的內容和討論,請造訪Dev.to 上的完整文章。
加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!