Workshop: Deploy Node.js App ด้วย GitOps Pipeline (GitHub Actions + Argo CD) บน Cloud VPS
บทนำ
GitOps Pipeline เป็นแนวทางสมัยใหม่ในการบริหารจัดการ Infrastructure และ Deployment อย่างอัตโนมัติ บทความนี้จะสอนวิธีการสร้าง CI/CD Pipeline สำหรับแอปพลิเคชัน Node.js โดยใช้ GitHub Actions ร่วมกับ Argo CD บนเซิร์ฟเวอร์ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง
ความต้องการเบื้องต้น
- Cloud VPS จาก ผู้ให้บริการโฮสติ้ง พร้อมติดตั้ง Kubernetes
- Git และ Docker Desktop
- GitHub Account และ Repository
- kubectl CLI เวอร์ชัน 1.24 ขึ้นไป
- ความรู้พื้นฐาน Node.js และ Docker
ขั้นตอนที่ 1: สร้างแอปพลิเคชัน Node.js
สร้าง package.json ที่มีโครงสร้างพื้นฐานสำหรับแอปพลิเคชัน Express:
{
"name": "nodejs-gitops-app",
"version": "1.0.0",
"main": "app.js",
"dependencies": {
"express": "^4.18.2"
}
}
จากนั้นสร้างไฟล์ app.js:
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.json({ message: 'Node.js App Running on Cloud VPS' });
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
ขั้นตอนที่ 2: สร้าง Dockerfile
สร้างไฟล์ Dockerfile เพื่อ Containerize แอปพลิเคชัน:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
สร้าง .dockerignore เพื่อลดขนาด Docker Image:
node_modules
npm-debug.log
.git
.gitignore
ขั้นตอนที่ 3: ตั้งค่า GitHub Actions CI Pipeline
สร้างไฟล์ .github/workflows/ci.yml เพื่อสร้าง Automated CI Pipeline:
name: CI Pipeline
on:
push:
branches: [ main ]
paths:
- 'src/**'
- 'Dockerfile'
- '.github/workflows/ci.yml'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker Image
run: |
docker build -t myapp:${{ github.sha }} .
docker tag myapp:${{ github.sha }} myapp:latest
- name: Push to Registry
run: |
docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASS }}
docker push myapp:latest
ขั้นตอนที่ 4: สร้าง Kubernetes Manifests
สร้างไฟล์ k8s/deployment.yaml สำหรับ Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-app
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nodejs-app
template:
metadata:
labels:
app: nodejs-app
spec:
containers:
- name: nodejs-app
image: myapp:latest
ports:
- containerPort: 3000
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
สร้างไฟล์ k8s/service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nodejs-app-service
spec:
selector:
app: nodejs-app
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
ขั้นตอนที่ 5: ตั้งค่า Argo CD สำหรับ GitOps
ติดตั้ง Argo CD บน Cloud VPS Kubernetes cluster:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl port-forward svc/argocd-server -n argocd 8080:443
สร้างไฟล์ argocd-app.yaml เพื่อสร้าง Argo CD Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nodejs-gitops-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourusername/nodejs-app
targetRevision: main
path: k8s/
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
นำไปใช้งาน:
kubectl apply -f argocd-app.yaml
ขั้นตอนที่ 6: ทำให้ Pipeline สมบูรณ์
สร้าง .github/workflows/deploy.yml สำหรับ Automated Deployment:
name: Deploy
on:
workflow_run:
workflows: ["CI Pipeline"]
types: [completed]
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- uses: actions/checkout@v3
- name: Update Kubernetes Manifests
run: |
sed -i "s|myapp:latest|myapp:${{ github.sha }}|g" k8s/deployment.yaml
- name: Commit Changes
run: |
git config user.name "GitHub Actions"
git config user.email "[email protected]"
git add k8s/deployment.yaml
git commit -m "Update image tag to ${{ github.sha }}"
git push
ขั้นตอนที่ 7: ทดสอบ Pipeline
ทำการ Push code เพื่อเริ่ม Workflow:
git add .
git commit -m "Initial Node.js GitOps Setup"
git push origin main
ตรวจสอบสถานะใน GitHub Actions tab และ Argo CD UI บน Cloud VPS ของคุณ
ยืนยันการทำงาน:
kubectl get pods -n default
kubectl logs -l app=nodejs-app -n default
แนวทางปฏิบัติที่ดี
- ใช้ Private GitHub Repository เพื่อความปลอดภัย
- จัดเก็บ Docker Registry Credentials ใน GitHub Secrets
- ตั้งค่า Network Policy เพื่อ Restrict Traffic บน Cloud VPS
- ใช้ Resource Limits เพื่อป้องกัน Node Overload
- ตั้งค่า Health Checks และ Liveness Probes
- ใช้ Blue-Green Deployment Strategy กับ Argo CD
แก้ไขปัญหา
Pod ไม่ Start: ตรวจสอบ Image ใน Deployment และตรวจสอบ Docker Registry Credentials
Argo CD ไม่ Sync: ยืนยันว่า Repository URL และ GitHub Token ถูกต้อง
Service ไม่ได้รับ Traffic: ตรวจสอบ Service Port Mapping และ Firewall Rules บน Cloud VPS
สรุป
ด้วยการใช้ GitHub Actions และ Argo CD บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณสามารถสร้าง Automated CI/CD Pipeline ที่มีประสิทธิภาพสำหรับแอปพลิเคชัน Node.js ได้อย่างง่ายดาย GitOps Pipeline ช่วยลดข้อผิดพลาดจากการ Deploy ด้วยมือและเพิ่มความเร็วในการนำส่ง (Time-to-Market)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Cloud VPS และบริการ Cloud Hosting อื่นๆ โปรดเยี่ยมชม ผู้ให้บริการโฮสติ้ง Cloud Hosting

