目錄

  1. 概述

  2. 專案架構

  3. 第 1 步:設定微服務儲存庫

  1. 第 2 步:使用 Jenkins 實施 CI/CD
  1. 第 3 步:使用 Docker 容器化微服務
  1. 第 4 步:部署到 Kubernetes
  1. 步驟5:使用Prometheus和Grafana實施監控
  1. 第 6 步:使用 ELK Stack 實作日誌記錄
  1. 結論

  2. 最後的想法


概述

此專案將指導您為基於微服務的應用程式設定端對端 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 是我們 CI/CD 管道中的關鍵元件。請依照以下步驟進行設定:

  1. 安裝詹金斯
   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
  1. 啟動詹金斯
   sudo systemctl start jenkins
  1. 存取詹金斯

在瀏覽器中開啟http://localhost:8080以存取 Jenkins 儀表板。

  1. 安裝所需的插件
  • 導覽至管理 Jenkins >管理插件

  • 安裝以下插件:

 - Docker Pipeline Plugin
 - Kubernetes Plugin
 - Git Plugin

2.2.為 CI/CD 建立 Jenkinsfile

每個微服務的儲存庫中都應該有一個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 的操作。


第 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-servicepayment-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-servicepayment-service重複該程序。


步驟5:使用Prometheus和Grafana實施監控

5.1.安裝 Prometheus 和 Grafana

若要安裝 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

5.2.配置 Prometheus 來抓取 Kubernetes 指標

透過編輯prometheus.yml檔案來配置 Prometheus 從 Kubernetes 叢集中抓取指標:

scrape_configs:
  - job_name: 'kubernetes'
    kubernetes_sd_configs:
      - role: node

5.3.造訪 Grafana 儀表板

透過http://localhost:3000存取 Grafana 並使用預設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 儀表板

透過http://localhost:5601存取 Kibana 並視覺化從 Kubernetes 收集的日誌。


結論

在此專案中,您學習如何為基於微服務的應用程式設定端對端 CI/CD 管道,將其部署到 Kubernetes,並使用 Prometheus、Grafana 和 ELK Stack 對其進行監控。此設定具有高度可擴展性,並為任何微服務架構提供了堅實的基礎。


最後的想法

該計畫旨在為 DevOps 工程師提供全面的學習體驗。透過遵循本指南,您將獲得關鍵 DevOps 工具和實踐的實務經驗。有關更詳細的內容和討論,請造訪Dev.to 上的完整文章


👤 作者

橫幅

加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!


原文出處:https://dev.to/prodevopsguytech/devops-project-cicd-pipeline-for-a-microservices-based-application-on-kubernetes-1ba8


共有 0 則留言