1. Lựa chọn và triển khai Kubernetes Cluster
Triển khai Minikube cho môi trường phát triển (Local)
Để bắt đầu nhanh chóng trên máy cá nhân, chúng ta sử dụng Minikube để tạo một cụm Kubernetes đơn nút. Đây là bước chuẩn bị nền tảng trước khi cài đặt các thành phần phức tạp như Vault và Tekton.
Cài đặt Minikube và khởi tạo cụm với driver Docker để tối ưu hiệu năng trên Linux.
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start --driver=docker --cpus=2 --memory=4096 --kubernetes-version=v1.28.0
Kết quả mong đợi: Minikube khởi động thành công, cụm Kubernetes đang chạy với 1 node và API server sẵn sàng.
Cấu hình kubeconfig cho kubectl
Sau khi Minikube chạy, bạn cần cấu hình client kubectl để giao tiếp với API server của cụm vừa tạo. Minikube tự động tạo file config, nhưng cần đảm bảo nó trỏ đúng đến cụm đang hoạt động.
minikube kubeconfig --append
Kết quả mong đợi: File ~/.kube/config được cập nhật thêm profile của Minikube, kubectl có thể truy vấn cluster.
Verify Cluster
Kiểm tra trạng thái của cluster và các node đã sẵn sàng (Ready) hay chưa.
kubectl get nodes
Kết quả mong đợi: Output hiển thị 1 node với trạng thái "Ready".
2. Cấu hình quyền truy cập và công cụ CLI
Cài đặt Helm (Package Manager)
Helm là công cụ bắt buộc để cài đặt các ứng dụng phức tạp như Vault và Tekton dưới dạng Chart. Chúng ta cần cài đặt phiên bản mới nhất.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash
Kết quả mong đợi: Helm được cài đặt thành công, chạy lệnh `helm version` trả về phiên bản hiện tại.
Cài đặt Kustomize
Kustomize dùng để tùy chỉnh manifests Kubernetes mà không cần viết lại file YAML gốc. Đây là chuẩn mực trong GitOps với ArgoCD.
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | sudo bash
Kết quả mong đợi: Binary `kustomize` được đặt vào /usr/local/bin, lệnh `kustomize version` chạy được.
Cài đặt và cấu hình Kubectl với các plugin cần thiết
Đảm bảo kubectl đã cài đặt (thường có sẵn hoặc cài qua repo hệ thống). Nếu chưa có, hãy cài đặt.
sudo apt-get update && sudo apt-get install -y kubectl
kubectl version --client
Kết quả mong đợi: kubectl được cài đặt và hiển thị phiên bản client.
Verify các công cụ CLI
Chạy lệnh kiểm tra nhanh để đảm bảo cả 3 công cụ đều hoạt động trên shell hiện tại.
echo "Helm: $(helm version --short)"
echo "Kustomize: $(kustomize version | head -n1)"
echo "Kubectl: $(kubectl version --client --short)"
Kết quả mong đợi: Terminal hiển thị phiên bản của Helm, Kustomize và Kubectl.
3. Chuẩn bị máy chủ hoặc VM cho Tekton và Vault
Yêu cầu hệ thống và Network
Để chạy Tekton (Pipeline engine) và HashiCorp Vault (Secrets manager) ổn định trên Kubernetes, cụm cần đủ tài nguyên. Nếu dùng Minikube, cấu hình 4GB RAM và 2 vCPU là tối thiểu. Nếu dùng EKS/GKE, hãy chọn instance type m5.large hoặc tương đương.
Tiếp theo, cấu hình Ingress Controller để mở cổng HTTP/HTTPS cho Vault UI và Tekton Dashboard từ ngoài vào.
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
Kết quả mong đợi: Namespace `ingress-nginx` được tạo và pod controller của Nginx Ingress chuyển sang trạng thái "Running".
Enable Metrics Server (Tùy chọn nhưng cần thiết)
Tekton và Vault cần giám sát tài nguyên. Cài đặt Metrics Server để Kubernetes có thể đọc CPU/RAM usage.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Kết quả mong đợi: Pod `metrics-server` trong namespace `kube-system` đang chạy.
Verify Network & Ingress
Kiểm tra xem Ingress Controller đã sẵn sàng nhận request chưa.
kubectl get pods -n ingress-nginx -l app.kubernetes.io/component=controller
Kết quả mong đợi: Pod controller ở trạng thái "Running" với 1/1 containers ready.
4. Thiết lập repository Git chứa mã nguồn ứng dụng mẫu
Tạo cấu trúc thư mục dự án
Tạo thư mục làm việc để chứa code ứng dụng mẫu, file cấu hình Tekton Pipeline, và manifests Kubernetes. Đây sẽ là nơi ArgoCD đồng bộ sau này.
mkdir -p ~/gitops-demo/{src,pipelines,secrets,manifests}
cd ~/gitops-demo
Kết quả mong đợi: Các thư mục con được tạo thành công.
Viết mã nguồn ứng dụng mẫu (Hello World)
Tạo một ứng dụng NodeJS đơn giản để làm đối tượng triển khai cho pipeline.
File: `~/gitops-demo/src/app.js`
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello from CI/CD Pipeline via ArgoCD & Tekton!');
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
Kết quả mong đợi: File `app.js` được tạo với mã nguồn hợp lệ.
Tạo Dockerfile cho ứng dụng
Định nghĩa cách build image cho ứng dụng trên.
File: `~/gitops-demo/src/Dockerfile`
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Kết quả mong đợi: File `Dockerfile` được tạo.
Khởi tạo Repository Git
Khởi tạo git repo local, thêm file và commit lần đầu. Nếu có tài khoản GitHub/GitLab, hãy remote về đó. Nếu không, giữ local để test pipeline.
git init
git add .
git commit -m "Initial commit: App source code and Dockerfile"
Kết quả mong đợi: Repository được khởi tạo, commit thành công với message đã định.
Tạo file cấu hình Tekton Pipeline mẫu
Chuẩn bị trước file pipeline YAML để dùng ở phần sau.
File: `~/gitops-demo/pipelines/ci-pipeline.yaml`
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: app-ci-pipeline
spec:
tasks:
- name: build
taskRef:
name: buildah
workspaces:
- name: source
workspace: source-workspace
- name: test
taskRef:
name: nodejs-test
workspaces:
- name: source
workspace: source-workspace
runAfter:
- build
Kết quả mong đợi: File pipeline YAML được tạo với cấu trúc cơ bản.
Verify Repository
Kiểm tra lại lịch sử commit và danh sách file trong repo.
git log --oneline
git ls-files
Kết quả mong đợi: Hiển thị 1 commit và danh sách các file đã tạo (app.js, Dockerfile, pipeline yaml).
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống CI/CD an toàn và tự động hóa cho Kubernetes với ArgoCD, Tekton và HashiCorp Vault
Phần 2: Triển khai HashiCorp Vault trên Kubernetes »