Workshop: Deploy Node.js App ด้วย GitOps Pipeline (GitHub Actions + Argo CD) บน Cloud VPS

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

ผู้ให้บริการโฮสติ้ง Knowledge Base: บทความนี้เป็นส่วนหนึ่งของฐานความรู้ของ ผู้ให้บริการโฮสติ้ง ซึ่งมีจุดมุ่งหมายเพื่อให้ความรู้และทักษะเกี่ยวกับบริการ Cloud ที่ทันสมัย สำหรับคำถามและข้อเสนอแนะ โปรดติดต่อเรา