介紹

在這個高階 AWS DevOps 專案中,我們將建立一個複雜的 CI/CD 管道,以在 AWS 上自動部署基於微服務的應用程式。我們將利用關鍵的 DevOps 實踐,例如使用Terraform進行基礎設施即程式碼 (IaC) 、使用Amazon EKS(彈性 Kubernetes 服務)進行容器編排、與 Istio 進行服務網格集成,以及使用PrometheusGrafanaFluentd進行全面監控和日誌記錄。

該專案旨在涵蓋 AWS 和 DevOps 工程師經常遇到的複雜的現實場景,讓您深入了解如何建置、部署和管理現代雲端原生應用程式。

目錄

  1. 專案概況

  2. 先決條件

  3. 架構圖

  4. 逐步指南

 - Setting Up the VPC and Networking
 - IAM Roles and Policies
 - Creating an EKS Cluster
 - Integrating with RDS for Persistent Storage
 - Setting Up Jenkins on EC2 with Auto-Scaling
 - Configuring Jenkins Master-Slave Architecture
 - Installing Istio on EKS
 - Configuring Traffic Management, Security, and Observability
 - Integrating GitHub, Jenkins, Docker, and EKS
 - Implementing Blue-Green Deployments
 - Automated Canary Deployments with Istio
 - Setting Up Prometheus and Grafana
 - Configuring Fluentd for Centralized Logging
 - Setting Up Alertmanager for Incident Response
  1. 測試和驗證

  2. 結論

  3. 參考


一、專案概況

該專案將指導您設定高級 CI/CD 管道,使用 Kubernetes (EKS)、用於服務網格的 Istio 和用於 CI/CD 的 Jenkins,在 AWS 上自動部署基於微服務的應用程式。我們將涵蓋從使用 Terraform 進行基礎架構配置到在安全、可擴展且可觀察的環境中部署和管理微服務的整個生命週期。

2.前提條件

  • AWS 帳號:對 AWS 帳號的管理存取權。

  • AWS CLI :已安裝並使用適當的憑證進行設定。

  • Terraform :安裝在您的本機電腦上。

  • kubectl :安裝用於管理 Kubernetes 叢集。

  • Jenkins :安裝在 EC2 執行個體上或透過 Docker 設定。

  • Docker :在本機上安裝並執行。

  • Git :已安裝並設定。

  • Helm :安裝用於 Kubernetes 套件管理。

3.架構圖

圖片說明

該架構由具有公共和私有子網路的VPC、跨多個可用區部署的EKS 叢集、部署在具有自動擴展功能的EC2 上的高可用配置中的Jenkins、用於持久資料儲存的RDS 以及用於服務網格整合的Istio 組成。監控由 Prometheus 和 Grafana 處理,而 Fluentd 則集中記錄日誌。

架構圖概述

  • 1. 開發者工作站:

  • 開發人員將程式碼提交到GitHub儲存庫。

  • 2.持續集成:

  • Jenkins從 GitHub 拉取最新程式碼。

  • Jenkins 建立並測試應用程式。

  • Docker用於建立應用程式的 Docker 映像。

  • 建置的映像被推送到Docker 註冊表(例如 Amazon ECR)。

  • 3. 基礎設施即程式碼:

  • Terraform用於配置 AWS 基礎設施,包括:

- **VPC** for networking.
- **IAM Roles and Policies** for security.
- **EKS Cluster** for Kubernetes.
- **RDS** for persistent storage.
  • 4.持續部署:

  • Jenkins 使用 Kubernetes 清單或 Helm 圖表將 Docker 映像部署到Amazon EKS

  • Istio (服務網格)用於管理微服務之間的流量。

  • 5.服務網格:

  • Istio提供流量管理、安全性 (mTLS) 和可觀察性。

  • Istio Ingress Gateway管理對服務的外部存取。

  • 6. 監控和記錄:

  • Prometheus從 Kubernetes 集群和 Istio 收集指標。

  • Grafana將指標視覺化並提供儀表板。

  • Fluentd用於集中日誌記錄,將日誌傳送至Amazon CloudWatchElasticsearch

  • Alertmanager與 Prometheus 整合以進行警報。

  • 7.持續回饋:

  • Alertmanager會向 Slack 或電子郵件發送通知。

  • Jenkins 向開發人員提供建置和部署回饋。

圖表元件

  1. GitHub :版本控制和原始碼儲存庫。

  2. Jenkins :用於自動化建置、測試和部署的 CI/CD 伺服器。

  3. Docker :將應用程式容器化以獲得一致的環境。

  4. Terraform :自動配置 AWS 基礎架構。

  5. Amazon ECR :Docker 映像儲存庫。

  6. Amazon EKS :用於部署和管理容器化應用程式的 Kubernetes 服務。

  7. Istio :用於管理服務間通訊的服務網格。

  8. Prometheus & Grafana :監控指標和儀表板的堆疊。

  9. Fluentd :集中式日誌記錄解決方案。

  10. Alertmanager :根據 Prometheus 收集的指標管理警報。

  11. Amazon CloudWatch :基於雲端的記錄和監控服務。

架構流程

  1. 程式碼提交:開發人員將程式碼推送到 GitHub。

  2. CI Pipeline :Jenkins 偵測程式碼變更、建置專案、執行測試並建置 Docker 映像。

  3. 映像推送:Jenkins 將 Docker 映像推送到 Amazon ECR。

  4. 基礎架構部署:Terraform 在 AWS 上配置必要的基礎架構。

  5. CD 管道:Jenkins 將應用程式部署到 Amazon EKS,並由 Istio 管理流量路由。

  6. 服務網格管理:Istio 處理服務通訊、安全性和監控。

  7. 監控和日誌記錄:Prometheus 收集指標,Grafana 將其視覺化,Fluentd 將日誌轉發到 CloudWatch。

  8. 警報:Alertmanager 根據 Prometheus 指標發送警報。

4.分步指南

使用 Terraform 進行基礎架構即程式碼

步驟:-1 設定 VPC 和網絡

  • 為 Terraform 檔案建立一個新目錄:
  mkdir advanced-aws-devops-project
  cd advanced-aws-devops-project
  • 初始化您的 Terraform 專案:
  terraform init
  • 建立一個包含以下內容的main.tf檔案來定義您的 VPC、子網路和網路元件:
  provider "aws" {
    region = "us-west-2"
  }

  resource "aws_vpc" "main_vpc" {
    cidr_block = "10.0.0.0/16"
    enable_dns_support = true
    enable_dns_hostnames = true
    tags = {
      Name = "advanced-devops-vpc"
    }
  }

  resource "aws_subnet" "public_subnet" {
    vpc_id            = aws_vpc.main_vpc.id
    cidr_block        = "10.0.1.0/24"
    map_public_ip_on_launch = true
    availability_zone = "us-west-2a"
    tags = {
      Name = "public-subnet"
    }
  }

  resource "aws_subnet" "private_subnet" {
    vpc_id            = aws_vpc.main_vpc.id
    cidr_block        = "10.0.2.0/24"
    availability_zone = "us-west-2b"
    tags = {
      Name = "private-subnet"
    }
  }

  resource "aws_internet_gateway" "igw" {
    vpc_id = aws_vpc.main_vpc.id
    tags = {
      Name = "main-igw"
    }
  }

  resource "aws_route_table" "public_route_table" {
    vpc_id = aws_vpc.main_vpc.id

    route {
      cidr_block = "0.0.0.0/0"
      gateway_id = aws_internet_gateway.igw.id
    }

    tags = {
      Name = "public-route-table"
    }
  }

  resource "aws_route_table_association" "public_subnet_association" {
    subnet_id      = aws_subnet.public_subnet.id
    route_table_id = aws_route_table.public_route_table.id
  }
  • 應用 Terraform 配置:
  terraform apply

步驟 2:IAM 角色與策略

  • 建立iam.tf檔案來定義 EKS、RDS 和其他 AWS 服務的 IAM 角色和原則:
  resource "aws_iam_role" "eks_role" {
    name = "eks_role"
    assume_role_policy = jsonencode({
      "Version": "2012-10-17",
      "Statement": [{
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
          "Service": "eks.amazonaws.com"
        }
      }]
    })
  }

  resource "aws_iam_role_policy_attachment" "eks_policy_attachment" {
    role       = aws_iam_role.eks_role.name
    policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
  }

  resource "aws_iam_role" "rds_role" {
    name = "rds_role"
    assume_role_policy = jsonencode({
      "Version": "2012-10-17",
      "Statement": [{
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
          "Service": "rds.amazonaws.com"
        }
      }]
    })
  }

  resource "aws_iam_role_policy_attachment" "rds_policy_attachment" {
    role       = aws_iam_role.rds_role.name
    policy_arn = "arn:aws:iam::aws:policy/AmazonRDSFullAccess"
  }
  • 應用 IAM 角色配置:
  terraform apply

步驟3:建立EKS集群

  • 將以下內容新增至main.tf以建立具有自動擴展節點組的 EKS 叢集:
  module "eks" {
    source          = "terraform-aws-modules/eks/aws"
    cluster_name    = "advanced-eks-cluster"
    cluster_version = "1.24"
    vpc_id          = aws_vpc.main_vpc.id
    subnets         = [aws_subnet.public_subnet.id, aws_subnet.private_subnet.id]

    node_groups = {
      eks_nodes = {
        desired_capacity = 3
        max_capacity     = 5
        min_capacity     = 2

        instance_type = "t3.medium"
        key_name      = "your-key-pair"
        tags = {
          Name = "advanced-eks-node"
        }
      }
    }
  }
  • 應用 EKS 配置:
  terraform apply

步驟 4:與 RDS 整合以實現持久存儲

  • rds.tf檔案中建立用於持久性儲存的 RDS 實例:
  resource "aws_db_instance" "db_instance" {
    allocated_storage    = 20
    engine               = "mysql"
    engine_version       = "8.0"
    instance_class       = "db.t3.micro"
    name                 = "microservicesdb"
    username             = "admin"
    password             = "password"
    parameter_group_name = "default.mysql8.0"
    skip_final_snapshot  = true

    vpc_security_group_ids = [aws_security_group.eks_sg.id]
    db_subnet_group_name   = aws_db_subnet_group.rds_subnet_group.name
  }

  resource "aws_db_subnet_group" "rds_subnet_group" {
    name       = "rds-subnet-group"
    subnet_ids = [aws_subnet.private_subnet.id]

    tags = {
      Name = "RDS Subnet Group"
    }
  }
  • 應用 RDS 配置:
  terraform apply

在高可用配置中部署 Jenkins

第 5 步:在 EC2 上使用自動擴展設定 Jenkins

  • 在啟用了 Auto-Scaling 的 EC2 執行個體上啟動 Jenkins:

 resource "aws_launch_configuration" "jenkins_lc" {
    image_id      = "ami-0abcdef1234567890"
    instance_type = "t3.medium"
    key_name      = "your-key-pair"
    security_groups = [aws_security_group.jenkins_sg.id]

    lifecycle {
      create_before_destroy = true
    }

    user_data = <<-EOF
              #!/bin/bash
              sudo yum update -y
              sudo yum install -y java-1.8.0-openjdk
              sudo wget -O /etc/yum.repos.d/jenkins.repo \
                https://pkg.jenkins.io/redhat-stable/jenkins.repo
              sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
              sudo yum install -y jenkins
              sudo systemctl start jenkins
              sudo systemctl enable jenkins
              EOF
  }

  resource "aws_autoscaling_group" "jenkins_asg" {
    launch_configuration = aws_launch_configuration.jenkins_lc.id
    min_size             = 2
    max_size             = 4
    desired_capacity     = 2
    vpc_zone_identifier  = [aws_subnet.public_subnet.id]

    tags = [
      {
        key                 = "Name"
        value               = "Jenkins Instance"
        propagate_at_launch = true
      },
    ]
  }
  • 應用 Jenkins EC2 設定:
  terraform apply

第六步:配置Jenkins主從架構

Jenkins 主從(或控制器-代理)架構可讓您在多台機器上指派建置、測試和部署應用程式的工作負載。這種架構增強了效能並提供了更好的資源利用率,特別是在大規模環境中。這是在此架構中設定 Jenkins 的詳細指南。

先決條件
  1. Jenkins Master :主要的 Jenkins 伺服器,也稱為控制器,它編排建置任務並將其分發到代理節點。

  2. Jenkins 代理程式:執行 Jenkins 主伺服器指派的建置任務的附加伺服器(從伺服器)。

步驟 6.1:設定 Jenkins Master

您已在前面的步驟中在 EC2 執行個體上設定了 Jenkins。該實例將作為您的 Jenkins master。確保以下各項到位:

  • Java 安裝:Jenkins 需要 Java 才能運作。驗證 Java 是否已安裝:
  java -version

如果未安裝,您可以透過以下方式進行安裝:

  sudo yum install -y java-1.8.0-openjdk
  • Jenkins 安裝:Jenkins 應該正在運作並可透過 Web 瀏覽器存取。在瀏覽器中導航至http://<Jenkins_Master_IP>:8080進行確認。
步驟6.2:準備Jenkins代理節點

您需要額外的 EC2 執行個體來充當 Jenkins 代理程式。設定它們的方法如下:

  1. 為 Jenkins 代理程式啟動 EC2 執行個體
  • 使用 AWS 管理主控台啟動新的 EC2 執行個體。您可以選擇 Amazon Linux 2 AMI(或任何其他 Linux 發行版)。

  • 確保這些實例具有足夠的資源(例如,t2.medium)並且與 Jenkins master 位於同一 VPC 中。

  1. 安全群組
  • 確保安全群組允許從 Jenkins master 進行 SSH 存取。

  • 允許 Jenkins 代理與主站通訊所需的連接埠上的通訊(預設 SSH 連接埠 22)。

  1. 在代理節點上安裝 Java
  • 透過 SSH 連接到每個代理節點並安裝 Java:
     sudo yum update -y
     sudo yum install -y java-1.8.0-openjdk
  1. 在代理節點上建立 Jenkins 使用者
  • 建立一個專門用於在代理節點上執行 Jenkins 的使用者:
     sudo useradd jenkins
  • 為此使用者設定 SSH 存取權限,以便 Jenkins master 可以連線:
     sudo mkdir /home/jenkins/.ssh
     sudo chown jenkins:jenkins /home/jenkins/.ssh
     sudo chmod 700 /home/jenkins/.ssh
  • 將 SSH 公鑰從 Jenkins master 複製到每個代理程式的/home/jenkins/.ssh/authorized_keys檔案。
  1. 在代理節點上安裝 Jenkins 代理程式
  • 從 Jenkins master 下載 Jenkins 代理程式(也稱為slave.jar )。關於詹金斯大師:
     wget http://<Jenkins_Master_IP>:8080/jnlpJars/agent.jar
  • 將此agent.jar檔案傳輸到每個代理節點,並將其放置在/home/jenkins等目錄中。
步驟 6.3:設定 Jenkins Master 使用代理
  1. 在 Jenkins 中新增節點
  • 在 Jenkins 儀表板上,前往管理 Jenkins > 管理節點和雲端 > 新節點

  • 輸入新節點的名稱(例如Agent-1 ),選擇Permanent Agent ,然後按一下OK

  1. 配置節點設定
  • 遠端根目錄:指定代理程式上 Jenkins 應執行的目錄,例如/home/jenkins

  • Labels :為節點指派標籤以方便作業分配(例如linux-agent )。

  • 啟動方法:選擇透過 SSH 啟動代理程式

  • Host :輸入代理節點的私有IP位址。

  • 憑證:為jenkins用戶新增 SSH 憑證(使用者名稱和私鑰)。

  1. 測試連接
  • 按一下「儲存」 ,然後按一下「透過 SSH 啟動代理」

  • Jenkins 將嘗試透過 SSH 連線到代理節點。如果成功,您將看到代理狀態變更為「已連線」。

  1. 對其他代理重複
  • 重複上述步驟以設定任何其他 Jenkins 代理節點。
步驟 6.4:設定 Jenkins 作業以使用特定代理

現在您的 Jenkins master 已連接到代理節點,您可以將作業配置為在特定代理上執行:

  1. 建立或配置 Jenkins 作業
  • 前往 Jenkins 儀表板上的「新專案」或選擇現有作業。
  1. 指定節點用途
  • 在作業配置下,尋找「限制此專案可以運作的位置」部分。

  • 輸入您想要執行作業的代理程式的標籤(例如, linux-agent )。

  1. 保存並建構
  • 儲存作業配置並觸發建置。

  • 該作業現在應該在指定的 Jenkins 代理節點上執行。

步驟6.5:監控與管理Jenkins代理
  • 節點監控

  • Jenkins 為每個代理節點提供內建監控。您可以透過導航到Manage Jenkins > Manage Nodes and Clouds來查看此訊息,您將在其中看到每個代理程式的狀態、空閒時間和負載。

  • 阻垢劑

  • 對於大型環境,您可以使用 AWS Auto Scaling Groups 為代理節點配置自動擴展,從而允許 Jenkins 根據工作負載自動擴展代理程式數量。

  • 代理可用性

  • 透過為代理程式配置強大的執行狀況檢查(例如 CPU、記憶體和磁碟使用情況監控)來確保代理程式始終可用。與 CloudWatch 或 Prometheus 等監控工具整合可以幫助自動化。

建置和 Docker 化微服務

第 7 步:微服務應用程式概述

  • 假設您有一個包含以下元件的微服務應用程式:

  • 使用者服務:管理使用者身份驗證和設定檔。

  • 訂單服務:處理訂單處理和管理。

  • 支付服務:與支付網關整合以處理付款。

  • 為每個服務建立 Dockerfile:

使用者服務 Dockerfile

  FROM openjdk:8-jdk-alpine
  VOLUME /tmp
  ARG JAR_FILE=target/user-service.jar
  COPY ${JAR_FILE} user-service.jar
  ENTRYPOINT ["java","-jar","/user-service.jar"]

訂單服務 Dockerfile

  FROM openjdk:8-jdk-alpine
  VOLUME /tmp
  ARG JAR_FILE=target/order-service.jar
  COPY ${JAR_FILE} order-service.jar
  ENTRYPOINT ["java","-jar","/order-service.jar"]

支付服務 Dockerfile

  FROM openjdk:8-jdk-alpine
  VOLUME /tmp
  ARG JAR_FILE=target/payment-service.jar
  COPY ${JAR_FILE} payment-service.jar
  ENTRYPOINT ["java","-jar","/payment-service.jar"]
  • 建立 Docker 映像並將其推送到 Amazon ECR:
  docker build -t user-service ./user-service
  docker build -t order-service ./order-service
  docker build -t payment-service ./payment-service

  # Push images to ECR
  aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com
  docker tag user-service:latest <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/user-service:latest
  docker push <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/user-service:latest

使用 Istio 實施服務網格

步驟 8:在 EKS 上安裝 Istio

  • 使用 Helm 在 EKS 叢集上安裝 Istio:
  helm repo add istio https://istio-release.storage.googleapis.com/charts
  helm install istio-base istio/base -n istio-system --create-namespace
  helm install istiod istio/istiod -n istio-system
  helm install istio-ingress istio/gateway -n istio-system

步驟 9:設定流量管理、安全性和可觀察性

  • 定義 Istio VirtualService 和 DestinationRule 進行流量管理:
  apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService
  metadata:
    name: user-service
  spec:
    hosts:
      - user-service
    http:
      - route:
          - destination:
              host: user-service
              subset: v1

  apiVersion: networking.istio.io/v1alpha3
  kind: DestinationRule
  metadata:
    name: user-service
  spec:
    host: user-service
    subsets:
      - name: v1
        labels:
          version: v1
  • 使用 Istio 的雙向 TLS (mTLS) 應用安全策略:
  apiVersion: security.istio.io/v1beta1
  kind: PeerAuthentication
  metadata:
    name: default
    namespace: istio-system
  spec:
    mtls:
      mode: STRICT
  • 透過將 Istio 遙測技術與 Prometheus 和 Grafana 整合來實現可觀察性。

設定 Jenkins CI/CD 管道

步驟 10:整合 GitHub、Jenkins、Docker 和 EKS

  • 建立 Jenkins 管道腳本來自動化建置、測試和部署流程:
  pipeline {
    agent any
    stages {
      stage('Checkout') {
        steps {
          git 'https://github.com/your-repo/microservices-app.git'
        }
      }
      stage('Build') {
        steps {
          sh 'mvn clean package'
        }
      }
      stage('Docker Build & Push') {
        steps {
          script {
            docker.build("user-service:latest").push("${env.BUILD_TAG}")
          }
        }
      }
      stage('Deploy to EKS') {
        steps {
          script {
            sh 'kubectl apply -f k8s/deployment.yaml'
            sh 'kubectl apply -f k8s/service.yaml'
          }
        }
      }
    }
  }

第11步:實施藍綠部署

  • 定義藍綠部署的 Kubernetes 清單:
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: user-service-green
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: user-service
        version: green
    template:
      metadata:
        labels:
          app: user-service
          version: green
      spec:
        containers:
        - name: user-service
          image: <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/user-service:green
          ports:
          - containerPort: 8080
  • 使用 Istio 應用綠色部署並切換流量:
  kubectl apply -f k8s/user-service-green.yaml
  kubectl apply -f k8s/virtualservice.yaml

第 12 步:使用 Istio 進行自動化金絲雀部署

  • 在 Istio VirtualService 中實施金絲雀部署策略:
  apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService
  metadata:
    name: user-service
  spec:
    hosts:
      - user-service
    http:
      - route:
          - destination:
              host: user-service
              subset: v1
            weight: 90
          - destination:
              host: user-service
              subset: v2
            weight: 10

監控、記錄和警報

第 13 步:設定 Prometheus 和 Grafana

  • 透過 Helm 安裝 Prometheus 和 Grafana:
  helm install prometheus prometheus-community/prometheus
  helm install grafana grafana/grafana
  • 存取Grafana並新增Prometheus作為資料來源,然後導入Istio儀表板進行監控。

步驟 14:設定 Fluentd 進行集中日誌記錄

  • 在 EKS 叢集上設定 Fluentd DaemonSet 以聚合來自所有微服務的日誌:
  apiVersion: apps/v1
  kind: DaemonSet
  metadata:
    name: fluentd
  spec:
    selector:
      matchLabels:
        app: fluentd
    template:
      metadata:
        labels:
          app: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.11
        env:
          - name: FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch"
          - name: FLUENT_ELASTICSEARCH_PORT
            value: "9200"
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true

步驟 15:設定 Alertmanager 以進行事件回應

  • 配置 Prometheus Alertmanager 以根據指標和閾值發送警報:
  global:
    smtp_smarthost: 'smtp.gmail.com:587'
    smtp_from: 'alertmanager

@example.com'
    smtp_auth_username: '[email protected]'
    smtp_auth_password: 'password'
  route:
    receiver: 'email-alert'
  receivers:
  - name: 'email-alert'
    email_configs:
    - to: '[email protected]'
  • 將 Alertmanager 與 Slack 整合以取得即時事件通知。

結論:

該專案展示了先進的 AWS DevOps 設置,其中包含多服務架構、Jenkins CI/CD 管道、Docker、Kubernetes 和 Istio 服務網格。提供的詳細步驟涵蓋基礎設施配置、自動化部署、監控、日誌記錄和警報,為 AWS 和 DevOps 工程師提供全面的指南。此設定可確保高可用性、可擴充性、安全性和可觀察性,使其成為在雲端原生環境中管理微服務的強大解決方案。


👤 作者

橫幅

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


原文出處:https://dev.to/prodevopsguytech/aws-devops-project-advanced-automated-cicd-pipeline-with-infrastructure-as-code-microservices-service-mesh-and-monitoring-3o13


共有 0 則留言