Implementing CI/CD Workflows Using GitHub Actions and ArgoCD

Overview
This lab guides you through setting up a complete CI/CD workflow using GitHub Actions and ArgoCD to deploy applications to a Kubernetes cluster. The process automates building, testing, and deploying applications whenever changes are pushed to your repositories.

Architech
CI/CD process includes three main components:
Two GitHub Repositories:
Application Repository: Stores application source code, Dockerfile, and GitHub Actions workflows
Manifest Repository: Stores Kubernetes YAML files that ArgoCD will use to deploy the application
GitHub Actions:
Automatically builds Docker images when changes are pushed to the Application Repository
Updates image tags in the Manifest Repository
ArgoCD:
Continuously monitors the Manifest Repository
Automatically applies changes to the Kubernetes cluster
Phần 1: Thiết lập môi trường
1.1 Cài đặt các công cụ cần thiết
| No. | Tool | Purpose | URL |
| 1 | AWS CLI | A command-line tool for managing AWS services and resources. | AWS CLI Installation Guide |
| 2 | kubectl | A command-line tool for controlling Kubernetes clusters. | kubectl Installation Guide |
| 3 | helm | A package manager for Kubernetes, used to manage Kubernetes applications. | Helm Installation Guide |
1.2 Tạo IAM Role cho EKS
Truy cập IAM > Roles > Create role
Chọn "AWS service" và chọn "EKS" làm dịch vụ
Chọn "EKS Cluster" làm trường hợp sử dụng
Gắn chính sách "AmazonEKSClusterPolicy"
Đặt tên cho role của bạn (ví dụ: "EKSClusterRole") và tạo nó
1.3 Tạo cụm EKS
Để tạo cụm K8S trên AWS chúng ta có nhiều cách
Cách 1: dùng giao diện UI trên AWS
Cách 2: dùng ekscli
Cách 3: dùng terraform
Mở bảng điều khiển Amazon EKS
Nhấp vào "Add cluster" > "Create"
Chọn "Custom configuration" và tắt "Use EKS Auto Mode"
Cấu hình chi tiết cụm:
Name: Chọn một tên duy nhất cho cụm của bạn
Cluster IAM role: Chọn vai trò đã tạo ở bước trước
Kubernetes version: Chọn phiên bản được khuyến nghị mới nhất
Để các cài đặt khác ở giá trị mặc định
Cấu hình quyền truy cập cụm:
- Giữ cài đặt mặc định cho quyền truy cập quản trị viên bootstrap
Cấu hình mạng:
Chọn một VPC thích hợp với ít nhất hai subnet
Chọn "IPv4" cho địa chỉ IP
Chọn cách truy cập điểm cuối cụm phù hợp với nhu cầu (Public, Private hoặc kết hợp)
Xem lại và tạo cụm:
Kiểm tra lại tất cả các cài đặt
Nhấp vào "Create" để bắt đầu triển khai
Tạo tệp kubeconfig để kết nối với cụm:
aws eks update-kubeconfig --region <mã-vùng> --name <tên-cụm>
- Kiểm tra kết nối:
kubectl get svc
1.4 Tạo Node Group cho EKS
Trong bảng điều khiển EKS, chọn cụm của bạn
Chuyển đến phần "Compute" > "Node groups"
Nhấp vào "Add node group"
Cấu hình Node Group:
Đặt tên cho Node Group
Tạo và chọn IAM role được đề xuất
Cấu hình khả năng mở rộng:
Desired size: Số lượng node mong muốn
Minimum size: Số lượng node tối thiểu
Maximum size: Số lượng node tối đa
Xem lại và tạo Node Group
Phần 2: Cài đặt các công cụ cần thiết trên cụm EKS
2.1 Cài đặt Ingress Nginx Controller
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
2.2 Cài đặt ArgoCD
Tạo namespace cho ArgoCD
kubectl create ns argocd
# Cài đặt ArgoCD
kubectl -n argocd apply -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# Lấy mật khẩu ban đầu (tên người dùng là admin)
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 --decode
# Áp dụng cấu hình Ingress cho ArgoCD
kubectl -n argocd apply -f https://raw.githubusercontent.com/200lab-Education/kubernetes/refs/heads/master/simple-template/argocd-ingress.yaml
Phần 3: Cấu hình GitHub Repositories và Actions
3.1 Tạo hai kho lưu trữ GitHub
Tạo kho lưu trữ "application" để lưu trữ mã nguồn ứng dụng
Tạo kho lưu trữ "manifest" để lưu trữ tệp cấu hình Kubernetes
3.2 Cấu hình kho lưu trữ ứng dụng
Bạn có thể sử dụng mã nguồn mẫu từ https://github.com/200lab-Education/doa-cicd hoặc bất kỳ mã nguồn nào có thể được xây dựng bằng Docker.
3.3 Cấu hình kho lưu trữ manifest
Bạn có thể sử dụng mã nguồn mẫu từ https://github.com/200lab-Education/kubernetes/
3.4 Tạo GitHub Personal Access Token (PAT)
Truy cập Settings > Developer Settings
Chọn Personal access tokens > Tokens (classic) > Generate new token
Cấu hình token:
Note: Đặt tên cho token (ví dụ: "update-manifest")
Expiration: Chọn thời gian hết hạn
Scopes: Chọn "repo" (Quyền kiểm soát đầy đủ đối với kho lưu trữ riêng tư)
Nhấp vào "Generate token"
Sao chép token được tạo (lưu ý: bạn sẽ không thể xem lại token sau khi rời khỏi trang)
3.5 Tạo GitHub Secrets
Truy cập vào kho lưu trữ ứng dụng
Chuyển đến Settings > Secrets and variables > Actions > New repository secret
Tạo các secret sau:
ACCESS_TOKEN: Giá trị là token bạn đã tạo
GITHUB_USERNAME: Tên người dùng GitHub của bạn
DOCKER_USERNAME: Tên người dùng Docker Hub của bạn
DOCKER_PASSWORD: Mật khẩu Docker Hub của bạn
3.6 Kết nối kho lưu trữ với ArgoCD
- Chuyển tiếp cổng ArgoCD:
kubectl -n argocd port-forward svc/argocd-server -n argocd 8080:443
Đăng nhập vào ArgoCD thông qua http://localhost:8080 với tên người dùng "admin" và mật khẩu đã lấy trước đó
Nhấp vào biểu tượng cài đặt (bánh răng) > Repositories > Connect Repo using HTTPS
Điền thông tin kho lưu trữ:
Type: Git
Repository URL: URL của kho lưu trữ manifest (ví dụ: https://github.com/your-username/manifest.git)
Username: Tên người dùng GitHub của bạn
Password/Token: Token GitHub PAT của bạn
Nhấp vào "Connect" để thêm kho lưu trữ
3.7 Tạo ứng dụng ArgoCD
Nhấp vào "New App" và điền các thông tin:
Application Name: Đặt tên cho ứng dụng
Project: Chọn "default"
Sync Policy: Chọn "Automatic" để tự động đồng bộ khi phát hiện thay đổi
Cấu hình nguồn:
Repository URL: URL của kho lưu trữ manifest
Revision: Branch muốn theo dõi (ví dụ: master)
Path: Đường dẫn đến thư mục chứa tệp manifest (ví dụ: argocd)
Cấu hình đích:
Cluster: Chọn cụm Kubernetes đã được kết nối
Namespace: Không gian tên trong Kubernetes nơi ứng dụng sẽ được triển khai (ví dụ: default)
Nhấp vào "Create" để tạo ứng dụng
Kết luận
Sau khi hoàn thành các bước trên, bạn đã thiết lập thành công một quy trình CI/CD hoàn chỉnh. Khi bạn đẩy các thay đổi lên kho lưu trữ ứng dụng, GitHub Actions sẽ tự động xây dựng Docker image và cập nhật kho lưu trữ manifest. Sau đó, ArgoCD sẽ phát hiện những thay đổi này và tự động triển khai ứng dụng đã cập nhật vào cụm Kubernetes của bạn.
Quy trình này giúp đảm bảo rằng việc triển khai luôn đồng bộ với mã nguồn mới nhất, giảm thiểu lỗi thủ công và tăng tốc độ phát triển phần mềm.