Giới thiệu dự án

Trong bối cảnh chuyển đổi số và xu hướng dịch chuyển hạ tầng lên điện toán đám mây (Cloud Native), vòng đời phát triển phần mềm đòi hỏi tốc độ phân phối nhanh chóng nhưng không được đánh đổi an toàn thông tin. Theo báo cáo thường niên State of DevOps của DORA, các nhóm hiệu suất cao (Elite Performers) có tần suất triển khai mã nguồn nhanh hơn 208 lần và thời gian phục hồi sau sự cố (MTTR) nhanh hơn 2.604 lần so với các nhóm truyền thống. Tuy nhiên, việc áp dụng mô hình kiến trúc Microservices phức tạp dẫn đến thách thức lớn trong khâu đóng gói, kiểm thử bảo mật và đồng bộ cấu hình triển khai.

Đồ án tốt nghiệp "Nghiên cứu giải pháp DevSecOps trong hỗ trợ phát triển phần mềm" do sinh viên Lê Quý Hoàng (Học viện Công nghệ Bưu chính Viễn thông - PTIT) thực hiện dưới sự hướng dẫn của ThS. Nguyễn Đình Hiến, tập trung giải quyết bài toán tự động hóa toàn diện từ mã nguồn đến vận hành thực tế bằng hệ sinh thái mã nguồn mở hoàn chỉnh.

flowchart LR
    Dev[Developer] -->|1. Git Push| Gitea[Gitea SCM]
    Gitea -->|2. Webhook| Jenkins[Jenkins CI]
    Jenkins -->|3. Static Code Analysis| SonarQube[SonarQube SAST]
    Jenkins -->|4. Build & Push Image| Harbor[Harbor Registry]
    Harbor -->|5. CVE Scan| Trivy[Trivy Scanner]
    Jenkins -->|6. Update Manifest| GitOpsRepo[GitOps Repo]
    GitOpsRepo -->|7. Auto Sync| ArgoCD[Argo CD]
    ArgoCD -->|8. Reconcile / Deploy| K8s[Kubernetes Cluster]
    K8s -->|9. Mesh & Trace| Istio[Istio + Kiali + Jaeger]

Problem Statement và Pain Points

Quy trình phát triển và vận hành phần mềm theo lối mòn truyền thống (Traditional/Monolithic Operations) đang tạo ra các nút thắt cổ chai nghiêm trọng:

  • Tích hợp và kiểm thử thủ công: Việc ghép nhánh (merge code) thủ công gây ra xung đột mã nguồn kéo dài ("Integration Hell"), thiếu các bước phân tích tĩnh dẫn đến lỗ hổng bảo mật (CVE) chỉ bị phát hiện khi đã lên môi trường Production.
  • Triển khai gián đoạn dịch vụ (Downtime): Cập nhật ứng dụng yêu cầu dừng hệ thống để ghi đè file thực thi hoặc cấu hình lại máy ảo, làm gián đoạn trải nghiệm của người dùng cuối.
  • Thiếu khả năng truy vết và giám sát động: Khi ứng dụng phân tán thành hàng chục dịch vụ nhỏ (Microservices), việc phân tích nguyên nhân gốc (Root Cause Analysis) và theo dõi độ trễ mạng giữa các dịch vụ gặp khó khăn nếu thiếu hệ thống Service Mesh chuyên dụng.

Mục tiêu dự án

  1. Nghiên cứu hệ thống hóa cơ sở lý thuyết về văn hóa DevOps, phương pháp luận DevSecOps và mô hình điều phối container (Container Orchestration).
  2. Thiết kế và thiết lập hạ tầng tự động hóa CI/CD khép kín, tích hợp kiểm định bảo mật tĩnh (SAST) và quét lỗ hổng container image (Vulnerability Scanning) sử dụng 100% công cụ mã nguồn mở Self-hosted.
  3. Hiện thực hóa mô hình GitOps thông qua Argo CD trên cụm Kubernetes, đảm bảo tính bất biến (Immutability) và khả năng tự phục hồi (Self-healing) của hệ thống.
  4. Triển khai thử nghiệm thành công ứng dụng microservice phân tán Bookinfo, tích hợp Istio Service Mesh để kiểm soát lưu lượng, phân tích phụ thuộc qua Kiali và giám sát truy vết phân tán qua Jaeger.

Chỉ số kỳ vọng (Expected Metrics)

  • Tự động hóa 100% quy trình từ khâu git push đến triển khai Kubernetes.
  • 0 giây downtime trong quá trình cập nhật phiên bản microservice (Zero-downtime Rolling Update).
  • 100% Container Image được rà quét bảo mật tự động qua Quality Gate trước khi kích hoạt quy trình đồng bộ GitOps.
  • Kiểm soát trực quan 100% lưu lượng giao tiếp liên dịch vụ qua Service Mesh.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí Triển khai truyền thống (Bare-metal/VM) Nền tảng Managed Cloud (SaaS/PaaS) Giải pháp DevSecOps Self-Hosted (Đồ án)
Chi phí bản quyền Thấp đến Trung bình (tùy OS) Rất cao (chi phí vận hành Cloud tăng theo tải) Tối ưu hóa (100% Open-source tools)
Bảo mật & Quyền riêng tư Kiểm tra thủ công, dễ sót lọt Phụ thuộc chính sách nhà cung cấp Tự chủ hoàn toàn (SAST + Scanner nội bộ)
Khả năng mở rộng (Scaling) Kém, mở rộng theo chiều dọc (Scale-up) Nhanh nhưng tốn kém Mở rộng tự động theo Pod/Node linh hoạt
Tính nhất quán môi trường Thấp (Lỗi "chạy trên máy tôi nhưng lỗi trên server") Cao Tuyệt đối (Đóng gói đồng nhất qua Docker Image)
Độ phức tạp triển khai Thủ công (FTP/SSH copy), rủi ro cao Thấp (Tự động hóa dịch vụ) Tự động hóa khai báo (Declarative GitOps)

Phân loại yêu cầu theo mô hình MoSCoW

  • Must-have: Hệ thống quản lý mã nguồn nội bộ (Gitea), Pipeline CI/CD tự động (Jenkins), Quét bảo mật mã nguồn (SonarQube), Quản lý Registry an toàn (Harbor + Trivy), Đồng bộ GitOps (Argo CD), Điều phối Container (Kubernetes).
  • Should-have: Service Mesh (Istio) quản lý giao tiếp L7, Trực quan hóa kiến trúc (Kiali), Truy vết phân tán (Jaeger), Cân bằng tải cụm On-premise (MetalLB).
  • Could-have: Thiết lập cảnh báo tự động qua Webhook về kênh liên lạc (Slack/Telegram), Tích hợp xác thực tập trung qua SSO/OIDC.
  • Won't-have (giai đoạn này): Tự động phát hiện bất thường động (DAST) theo thời gian thực tại runtime (Falco), Khởi tạo hạ tầng tự động đa đám mây (Cross-cloud IaC qua Terraform).

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình microservices phân tán, phân chia rõ ràng các phân vùng chức năng thông qua mạng nội bộ và Reverse Proxy Nginx bảo mật SSL/TLS:

[ Developer ]
      │ (git push)
      ▼
┌──────────────────┐      Webhook      ┌────────────────────────────────────────┐
│   Gitea Server   │ ────────────────> │             Jenkins Server             │
│ (Source Control) │                   │  - Stage 1: Checkout Code              │
└──────────────────┘                   │  - Stage 2: SonarQube SAST Analysis    │
                                       │  - Stage 3: Build Docker Image         │
                                       │  - Stage 4: Push to Harbor Registry    │
                                       │  - Stage 5: Harbor/Trivy Vulnerability │
                                       │  - Stage 6: Update GitOps Manifest     │
                                       └──────────────────┬─────────────────────┘
                                                          │ (Push manifest)
                                                          ▼
┌───────────────────────────────────────────────────────────────────────────────┐
│ Kubernetes Bare-Metal Cluster                                                 │
│                                                                               │
│  ┌─────────────────────────┐   Sync Manifest   ┌───────────────────────────┐  │
│  │   Argo CD Controller    │ <──────────────── │   Git Deployment Repo     │  │
│  └────────────┬────────────┘                   └───────────────────────────┘  │
│               │ (Reconciliation Loop)                                         │
│               ▼                                                               │
│  ┌─────────────────────────────────────────────────────────────────────────┐  │
│  │ Namespace: default (Bookinfo Microservices with Istio Sidecar Injected) │  │
│  │                                                                         │  │
│  │  [Ingress Gateway] (MetalLB LoadBalancer IP)                            │  │
│  │         │                                                               │  │
│  │         ▼                                                               │  │
│  │  [productpage] ───> [details]                                           │  │
│  │         │                                                               │  │
│  │         └───> [reviews-v1 / reviews-v2 / reviews-v3] ───> [ratings]     │  │
│  │                                                                         │  │
│  │  [Istio Envoy Proxy Sidecars] ──> Telemetry/Metrics ──> [Jaeger/Kiali]  │  │
│  └─────────────────────────────────────────────────────────────────────────┘  │
└───────────────────────────────────────────────────────────────────────────────┘

Technology Stack & Versions

  • Source Control Management: Gitea v1.20+ (Hỗ trợ Git hooks, Webhook trigger, Lightweight Go binary).
  • Continuous Integration: Jenkins LTS (Jenkins Pipeline DSL, BlueOcean UI, Docker Pipeline Plugin).
  • Static Application Security Testing (SAST): SonarQube Community Edition (Cấu hình Quality Gate: 0 Security Vulnerabilities, Coverage > 80%).
  • Container Registry & Security: Harbor v2.8+ tích hợp scanner Trivy (CVE vulnerability engine, SBOM extractor).
  • Continuous Delivery & GitOps: Argo CD v2.7+ (Application CRD, Automated Sync Policy, Prune Resources).
  • Container Orchestration: Kubernetes v1.26+ (Architecture: 1 Control Plane Node, 1 Worker Node, Containerd Runtime, Calico CNI).
  • Network & Bare-metal Load Balancing: MetalLB v0.13+ (Layer 2 Mode IP Allocation).
  • Service Mesh & Observability: Istio v1.18+, Kiali Server, Jaeger Tracing, Prometheus, Grafana.

Implementation và kết quả

Development Process & Pipeline Definition

Hệ thống hiện thực hóa đường ống CI thông qua Jenkinsfile tiêu chuẩn với Declarative Pipeline, quản lý toàn diện các bước kiểm định chất lượng:

pipeline {
    agent any
    environment {
        HARBOR_CREDENTIALS = credentials('harbor-robot-account')
        HARBOR_REGISTRY    = 'registry.devsecops.local/bookinfo'
        IMAGE_NAME         = 'productpage'
        IMAGE_TAG          = "${env.BUILD_NUMBER}"
        SONAR_TOKEN        = credentials('sonar-analysis-token')
    }
    stages {
        stage('Source Checkout') {
            steps {
                git branch: 'main', url: 'https://gitea.devsecops.local/bookinfo/productpage.git'
            }
        }
        stage('SonarQube Quality Gate') {
            steps {
                withSonarQubeEnv('SonarQubeServer') {
                    sh 'sonar-scanner -Dsonar.projectKey=bookinfo-productpage -Dsonar.sources=. -Dsonar.login=${SONAR_TOKEN}'
                }
                timeout(time: 5, unit: 'MINUTES') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }
        stage('Docker Build & Local Scan') {
            steps {
                sh "docker build -t ${HARBOR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} ."
            }
        }
        stage('Push Image to Harbor') {
            steps {
                sh """
                    echo \${HARBOR_CREDENTIALS_PSW} | docker login ${HARBOR_REGISTRY} -u \${HARBOR_CREDENTIALS_USR} --password-stdin
                    docker push ${HARBOR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
                """
            }
        }
        stage('Update GitOps Deployment Manifest') {
            steps {
                sh """
                    git clone https://gitea.devsecops.local/bookinfo/gitops-manifests.git
                    cd gitops-manifests/apps/productpage
                    sed -i 's|image: ${HARBOR_REGISTRY}/${IMAGE_NAME}:.*|image: ${HARBOR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}|g' deployment.yaml
                    git config user.email "jenkins-bot@devsecops.local"
                    git config user.name "Jenkins CI Bot"
                    git commit -am "chore(release): update productpage image tag to ${IMAGE_TAG}"
                    git push origin main
                """
            }
        }
    }
}

Phía hạ tầng Kubernetes, ứng dụng được quản lý khai báo qua cấu hình Argo CD Application Custom Resource:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: bookinfo-productpage
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://gitea.devsecops.local/bookinfo/gitops-manifests.git'
    targetRevision: HEAD
    path: apps/productpage
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Testing và Validation

  1. Kiểm định mã nguồn (SAST Analysis):
    • SonarQube quét toàn bộ cấu trúc mã nguồn Python của microservice productpage.
    • Kết quả: Đạt 0 Bugs, 0 Vulnerabilities, 0 Security Hotspots, Quality Gate báo trạng thái Passed.
  2. Kiểm định lỗ hổng Container (Vulnerability Scanning):
    • Harbor kích hoạt Trivy tự động ngay khi image hoàn tất quá trình push.
    • Báo cáo phân loại chi tiết: 0 Lỗ hổng nghiêm trọng (Critical), 1 Lỗ hổng trung bình (Medium - liên quan đến gói base OS) và được phê duyệt triển khai an toàn.
  3. Kiểm định tính liên tục và giám sát (Observability Verification):
    • Kích hoạt quy trình cập nhật giao diện productpage (thay đổi tiêu đề và banner).
    • kubectl get pods -w ghi nhận cơ chế Rolling Update: Pod mới đạt trạng thái Running và sẵn sàng nhận traffic trước khi Pod cũ bị chấm dứt (Terminating).
    • Kiali hiển thị biểu đồ phân phối lưu lượng ổn định, phản hồi HTTP 200 đạt 100%.
    • Jaeger ghi nhận đầy đủ Span và Trace ID trên toàn bộ chuỗi: productpage -> reviews -> ratings.
[Benchmark Metrics]
├── Thời gian chạy CI Pipeline: 2 phút 15 giây (Bao gồm SonarQube Scan & Docker Build)
├── Thời gian phát hiện & đồng bộ của Argo CD: 12 giây (Tự động kích hoạt)
├── Tỷ lệ mất gói (Packet Drop) khi nâng cấp: 0%
└── Downtime ghi nhận: 0.00 giây

Đổi mới và đóng góp

  1. Xây dựng hệ sinh thái DevSecOps 100% On-Premise / Open-Source: Khác với các giải pháp phụ thuộc hoàn toàn vào dịch vụ điện toán đám mây công cộng (AWS CodePipeline, GitHub Actions Hosted Runner), đồ án chứng minh tính khả thi tuyệt đối của việc tự lưu trữ (Self-hosted) toàn bộ chuỗi công cụ, bảo toàn 100% dữ liệu nhạy cảm của doanh nghiệp với chi phí đầu tư phần mềm 0 VNĐ.
  2. Triển khai chuẩn mực GitOps nâng cao: Thay vì cho phép máy chủ CI (Jenkins) truy cập trực tiếp vào Cluster API (tiềm ẩn rủi ro lộ quyền ClusterAdmin), giải pháp cô lập hoàn toàn quyền hạn. Jenkins chỉ ghi vào GitOps Repository, và Argo CD bên trong cluster đóng vai trò kéo (Pull-based) thay đổi về, loại bỏ hoàn toàn các vector tấn công từ bên ngoài.
  3. Bảo mật Shift-Left toàn diện: Tích hợp kiểm định bảo mật tại 2 chốt chặn độc lập (SonarQube kiểm tra mã nguồn tĩnh + Trivy kiểm tra artifact nhị phân), chặn đứng lỗ hổng bảo mật ngay từ giai đoạn tiền triển khai.

Ứng dụng thực tế và triển khai

Yêu cầu cấu hình hệ thống (System Requirements)

  • Hạ tầng máy chủ (Tối thiểu 3 Nodes Bare-metal / KVM Virtual Machines):
    • Server 1 (CI/SCM): 4 vCPU, 8GB RAM, 100GB SSD (Gitea, Jenkins, SonarQube, Harbor).
    • Server 2 (K8s Control Plane): 2 vCPU, 4GB RAM, 50GB SSD (Kubernetes Master, etcd, Argo CD).
    • Server 3 (K8s Worker Node): 4 vCPU, 8GB RAM, 100GB SSD (Istio Envoy, Microservices Workloads).
  • Hệ điều hành: Ubuntu Server 22.04 LTS (Kernel 5.15+).
  • Mạng: Cấu hình dải IP tĩnh, MetalLB Layer 2 IP Pool (ví dụ: 192.168.1.200 - 192.168.1.220).

Hướng dẫn xử lý sự cố (Troubleshooting Guide)

  • Sự cố 1: Argo CD báo trạng thái OutOfSync nhưng không tự động cập nhật:
    • Nguyên nhân: Cơ chế selfHeal chưa được kích hoạt hoặc tài nguyên trên cluster bị can thiệp thủ công làm sai lệch schema.
    • Khắc phục: Kiểm tra syncPolicy.automated.selfHeal: true trong manifest Application, hoặc chạy argocd app sync <app-name> --force.
  • Sự cố 2: MetalLB không cấp phát External-IP cho Istio Ingress Gateway:
    • Nguyên nhân: Xung đột IPAddressPool hoặc mâu thuẫn Layer2Advertisement CRD.
    • Khắc phục: Kiểm tra log của MetalLB Speaker pod: kubectl logs -n metallb-system -l app=metallb,component=speaker.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Cụm Kubernetes thử nghiệm mới chỉ thiết lập ở quy mô 1 Control Plane và 1 Worker Node, chưa đạt chuẩn sẵn sàng cao (High Availability - HA) cho môi trường doanh nghiệp lớn.
  • Khâu kiểm thử bảo mật mới dừng lại ở mức phân tích tĩnh (SAST) và quét cấu trúc image (Vulnerability Scan), chưa tích hợp kiểm thử bảo mật động (DAST) khi ứng dụng đang chạy.

Hướng phát triển

  1. Nâng cấp cụm Kubernetes lên mô hình Multi-Master sử dụng mô hình đồng thuận Raft phân tán (External etcd topology).
  2. Tích hợp công cụ DAST tự động như OWASP ZAP vào giai đoạn Post-deployment của Pipeline.
  3. Bổ sung hệ thống giám sát an ninh runtime với Falco để phát hiện các hành vi bất thường trong container theo thời gian thực.

Đối tượng hưởng lợi

mindmap
  root((Hệ sinh thái DevSecOps))
    Sinh viên & Nghiên cứu sinh
      Mô hình tham chiếu thực tế
      Tài liệu thực hành Kubernetes & Service Mesh chuẩn hóa
    Lập trình viên Software Engineers
      Loại bỏ gánh nặng cài đặt môi trường
      Tự động hóa phản hồi chất lượng code
    Doanh nghiệp & Startup
      Tiết kiệm 60-80% chi phí bản quyền công cụ
      Rút ngắn thời gian phát hành tính năng Time-to-Market
  • Sinh viên & Giảng viên ngành CNTT: Đồ án là tài liệu tham khảo chi tiết về cách kết hợp các công nghệ Cloud Native hiện đại (Docker, K8s, Istio, GitOps) thành một hệ thống thực thi hoàn chỉnh thay vì lý thuyết rời rạc.
  • Kỹ sư Phần mềm & DevOps: Nắm vững cấu trúc Pipeline as Code, cách tách biệt mã nguồn ứng dụng và mã nguồn cấu hình hạ tầng (GitOps Separation of Concerns).
  • Doanh nghiệp vừa và nhỏ (SMEs): Có được bản thiết kế kiến trúc hoàn chỉnh để triển khai hệ thống DevSecOps nội bộ với chi phí tối ưu, tự chủ bảo mật và nâng cao tính cạnh tranh.

Câu hỏi thường gặp

1. Cần cấu hình phần cứng tối thiểu như thế nào để triển khai toàn bộ hệ thống này?

Để vận hành ổn định tất cả các thành phần (Gitea, Jenkins, SonarQube, Harbor, K8s, Istio, Argo CD), bạn cần tối thiểu 3 máy chủ vật lý hoặc máy ảo với tổng tài nguyên khoảng 10-12 vCPU, 20-24GB RAM và 250GB SSD lưu trữ.

2. Tại sao nên chọn Argo CD (GitOps) thay vì để Jenkins trực tiếp chạy lệnh kubectl apply?

Jenkins triển khai trực tiếp (Push-based) yêu cầu cấp quyền quản trị Kubernetes Cluster cho Jenkins, tạo ra lỗ hổng bảo mật nghiêm trọng nếu máy chủ CI bị tấn công. Argo CD (Pull-based) chạy bên trong Cluster, liên tục đối soát trạng thái thực tế với Git, ngăn chặn triệt để hiện tượng lệch cấu hình (Configuration Drift) và cho phép rollback phiên bản chỉ bằng 1 thao tác git revert.

3. Việc tích hợp Istio Service Mesh có làm tăng đáng kể độ trễ (Latency) của ứng dụng không?

Istio sử dụng Envoy Proxy viết bằng C++ hiệu năng cao được nhúng dưới dạng Sidecar. Độ trễ gia tăng thông thường chỉ ở mức sub-millisecond (dưới 2-3ms cho mỗi hop mạng), hoàn toàn không đáng kể so với những lợi ích to lớn mang lại về quản lý lưu lượng, bảo mật mTLS tự động và khả năng quan sát chi tiết.

4. SonarQube và Trivy có làm chậm tiến độ phát hành của CI/CD Pipeline không?

Trong quá trình thử nghiệm, thời gian quét SAST của SonarQube và quét CVE của Trivy chỉ chiếm khoảng 30-50 giây trên mỗi lượt build. Đây là khoảng thời gian rất nhỏ để đổi lấy sự đảm bảo tuyệt đối về chất lượng mã nguồn và ngăn chặn các lỗ hổng bảo mật nghiêm trọng phát sinh trên môi trường Production.

5. Khả năng mở rộng (Scalability) của hệ thống này trong tương lai như thế nào?

Kiến trúc hoàn toàn mở rộng linh hoạt theo cả chiều ngang (Horizontal Scaling). Bạn có thể dễ dàng bổ sung thêm các Worker Node vào cụm Kubernetes bằng kubeadm join, cấu hình Jenkins Distributed Builds với Dynamic Kubernetes Agent Pods, và mở rộng dung lượng lưu trữ phân tán cho Harbor/SonarQube thông qua Ceph hoặc NFS StorageClass.


Kết luận

Đồ án tốt nghiệp "Nghiên cứu giải pháp DevSecOps trong hỗ trợ phát triển phần mềm" đã giải quyết trọn vẹn bài toán xây dựng quy trình phát triển và phân phối phần mềm hiện đại. Bằng việc kết hợp hài hòa giữa các công cụ mã nguồn mở đầu ngành như Gitea, Jenkins, SonarQube, Harbor, Argo CD, KubernetesIstio, hệ thống đã thiết lập một chu trình khép kín, tự động hóa từ khâu kiểm thử tĩnh, quét an ninh container đến triển khai GitOps không thời gian chết. Kết quả thử nghiệm trên ứng dụng microservices Bookinfo khẳng định tính khả thi, độ tin cậy và tiềm năng ứng dụng to lớn của mô hình này trong việc nâng cao năng suất và chất lượng sản phẩm phần mềm cho các tổ chức, doanh nghiệp trong kỷ nguyên số.