การอัปเกรด Argo CD ไปยังเวอร์ชันใหม่นั้นเป็นกระบวนการที่สำคัญสำหรับระบบ DevOps สมัยใหม่ เพราะเวอร์ชันใหม่มักจะมีฟีเจอร์ที่ดีขึ้น การแก้ไขจุดบกพร่อง (bug fixes) และการปรับปรุงด้านความปลอดภัย ในบทความนี้ เราจะแนะนำวิธีการอัปเกรด Argo CD อย่างปลอดภัยบน Cloud VPS โดยไม่ทำให้ระบบหยุดทำงาน พร้อมเทคนิคการสำรองข้อมูลและแผนสำรองในกรณีเกิดปัญหา
ทำไมต้องอัปเกรด Argo CD อย่างสม่ำเสมอ
การเก็บรักษา (maintenance) ของ Argo CD อย่างสม่ำเสมอเป็นสิ่งจำเป็นสำหรับการดำเนินงาน (operations) ที่ดี เวอร์ชันใหม่ของ Argo CD มักมาพร้อมกับ:
- ปรับปรุงความปลอดภัย: การแพทช์ (patch) ช่องโหว่ด้านความปลอดภัยที่พบในเวอร์ชันเก่า
- ฟีเจอร์ใหม่: เครื่องมือและความสามารถที่ช่วยให้การจัดการ GitOps ดีขึ้น
- การปรับปรุงประสิทธิภาพ: การลดจำนวน API calls หรือการใช้ทรัพยากรที่น้อยลง
- การแก้ไขจุดบกพร่อง: การแก้ปัญหาที่ส่งผลกระทบต่อเสถียรภาพของระบบ
- ความเข้ากันได้: การสนับสนุน Kubernetes เวอร์ชันใหม่ และ ecosystems อื่นๆ
ที่บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง เราเข้าใจความสำคัญของการอัปเกรดระบบอย่างปลอดภัย โดยให้ความสำคัญต่อการลดเวลาหยุดทำงาน (downtime) และการรักษาเสถียรภาพของบริการ
ตรวจสอบเวอร์ชัน Argo CD ปัจจุบัน
ก่อนที่จะเริ่มกระบวนการอัปเกรด สิ่งแรกที่ต้องทำคือการตรวจสอบเวอร์ชันปัจจุบันของ Argo CD ที่ติดตั้งในระบบของคุณ
วิธีตรวจสอบเวอร์ชัน Argo CD
คุณสามารถตรวจสอบเวอร์ชันของ Argo CD ได้โดยใช้คำสั่งต่อไปนี้:
argocd version
หากต้องการดูข้อมูลเพิ่มเติมในรูปแบบ JSON ให้ใช้:
argocd version --short
หากต้องการตรวจสอบเวอร์ชันของ Argo CD Server ในขณะที่ argocd CLI ยังไม่พร้อม ให้ใช้ kubectl:
kubectl get deployment -n argocd -o jsonpath='{.items[0].spec.template.spec.containers[0].image}'
หรือตรวจสอบจาก Argo CD UI โดยไปที่ Help Menu ในหน้า dashboard
ศึกษา Release Notes และตรวจสอบการเปลี่ยนแปลงที่เป็นอันตราย
การศึกษา release notes อย่างละเอียดเป็นขั้นตอนที่สำคัญที่สุดในการอัปเกรด ต้องตรวจสอบว่าเวอร์ชันใหม่มี breaking changes หรือไม่
ที่ไหนหา Release Notes
- GitHub Releases:
https://github.com/argoproj/argo-cd/releases - Argo CD Documentation:
https://argo-cd.readthedocs.io - Changelog: ดูไฟล์ CHANGELOG.md ใน GitHub repository
ประเด็นที่ต้องให้ความสำคัญ
เมื่อศึกษา release notes ให้มองหาประเด็นต่อไปนี้:
- **Breaking changes:** การเปลี่ยนแปลงที่อาจทำให้ configuration เดิมใช้ไม่ได้
- **API deprecation:** API endpoint ที่ไม่ถูกใช้งานอีกต่อไป (deprecated)
- **Database migration:** การเปลี่ยนแปลงในโครงสร้างฐานข้อมูล
- **Kubernetes version requirements:** เวอร์ชัน Kubernetes ต่ำสุดที่ต้องใช้
- **Configuration changes:** การปรับปรุง CRD (Custom Resource Definition) หรือ configuration
สำรองข้อมูล Argo CD ก่อนอัปเกรด
ขั้นตอนการสำรองข้อมูลนั้นสำคัญและไม่สามารถข้ามได้ เนื่องจากหากเกิดปัญหาระหว่างอัปเกรด คุณสามารถกู้คืนระบบได้จากข้อมูลสำรอง
สำรองการตั้งค่า Applications
ส่วนแรก คือการส่งออก (export) ข้อมูลของ applications ทั้งหมดที่จัดการโดย Argo CD:
argocd app list -o json > /backup/argocd-apps-backup.json
หรือใช้ kubectl สำหรับการส่งออกเป็น YAML:
kubectl get applications -n argocd -o yaml > /backup/argocd-applications-backup.yaml
การส่งออกข้อมูล projects:
kubectl get appprojects -n argocd -o yaml > /backup/argocd-projects-backup.yaml
สำรองเก็บ Repository Credentials
การสำรองข้อมูล secrets ที่เก็บ credentials ของ Git repositories:
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=repository -o yaml > /backup/argocd-repositories-backup.yaml
การสำรองข้อมูล Secrets อื่นๆ:
kubectl get secrets -n argocd -o yaml > /backup/argocd-all-secrets-backup.yaml
สำรองฐานข้อมูล Redis และ etcd
Redis ใช้สำหรับการเก็บแคช (cache) ของ Argo CD:
kubectl exec -it -n argocd deployment/argocd-redis -- redis-cli BGSAVE
การส่งออกข้อมูล Redis:
kubectl exec -it -n argocd deployment/argocd-redis -- redis-cli --rdb /data/dump.rdb
สำหรับ etcd (ถ้าใช้ embedded etcd):
kubectl exec -it -n argocd deployment/argocd-repo-server -- bash
สร้างสแนปชิป (Snapshot) ของ Persistent Volumes
หากใช้ Persistent Volumes ให้สร้างสแนปชิป:
kubectl get pvc -n argocd
จากนั้นสร้าง VolumeSnapshot สำหรับการสำรองข้อมูล
วิธีการอัปเกรด Argo CD
มีวิธีการอัปเกรดหลักสองวิธี คือการใช้ kubectl apply manifests และการใช้ Helm
วิธีที่ 1: ใช้ kubectl apply Manifests
ดาวน์โหลด manifest ของเวอร์ชันใหม่จาก GitHub official repository:
cd /tmp
wget https://raw.githubusercontent.com/argoproj/argo-cd/v2.X.X/manifests/install.yaml
# เปลี่ยน v2.X.X เป็นเวอร์ชันที่ต้องการ เช่น v2.9.0
ก่อนที่จะใช้ kubectl apply ให้ตรวจสอบสิ่งที่จะเปลี่ยนแปลง:
kubectl diff -f install.yaml -n argocd
หลังจากตรวจสอบแล้วให้ทำการ apply:
kubectl apply -f install.yaml -n argocd
ตรวจสอบสถานะของ pods:
kubectl rollout status deployment/argocd-server -n argocd
kubectl rollout status deployment/argocd-application-controller -n argocd
kubectl rollout status deployment/argocd-repo-server -n argocd
วิธีที่ 2: ใช้ Helm Chart
ถ้าใช้ Helm ในการติดตั้ง Argo CD เดิมที่ Helm repository:
helm repo update
ตรวจสอบ release ปัจจุบัน:
helm list -n argocd
ดูว่า Helm chart เวอร์ชันใดพร้อม:
helm search repo argocd/argo-cd --versions
ทำการ upgrade โดยยังคง values ที่ใช้อยู่:
helm upgrade argocd argo/argo-cd --namespace argocd --version 5.X.X
หรือ upgrade พร้อมกับ values file:
helm upgrade argocd argo/argo-cd -n argocd -f values.yaml --version 5.X.X
ตรวจสอบสถานะหลังจากอัปเกรด:
kubectl rollout status deployment/argocd-server -n argocd
ขั้นตอนการอัปเกรด Argo CD แบบขั้นตอน
การอัปเกรดแบบขั้นตอน (step-by-step upgrade) ช่วยลดความเสี่ยงของการเกิดปัญหา
ขั้นตอนที่ 1: เตรียมความพร้อม
# ตรวจสอบเวอร์ชันปัจจุบัน
argocd version
# ตรวจสอบ Kubernetes cluster
kubectl cluster-info
kubectl get nodes
# ตรวจสอบ namespaces
kubectl get ns | grep argocd
ขั้นตอนที่ 2: สำรองข้อมูลทั้งหมด
# สำรองข้อมูล applications
kubectl get applications -n argocd -o yaml > /backup/apps-$(date +%Y%m%d).yaml
# สำรองข้อมูล secrets
kubectl get secrets -n argocd -o yaml > /backup/secrets-$(date +%Y%m%d).yaml
# สำรองข้อมูล configmaps
kubectl get configmaps -n argocd -o yaml > /backup/configmaps-$(date +%Y%m%d).yaml
ขั้นตอนที่ 3: ดาวน์โหลด Manifest ใหม่
VERSION="v2.9.0" # เปลี่ยนเป็นเวอร์ชันที่ต้องการ
wget https://raw.githubusercontent.com/argoproj/argo-cd/${VERSION}/manifests/install.yaml -O /tmp/install-${VERSION}.yaml
ขั้นตอนที่ 4: ตรวจสอบสิ่งที่จะเปลี่ยนแปลง
kubectl diff -f /tmp/install-${VERSION}.yaml -n argocd
ขั้นตอนที่ 5: ทำการ Drain เพื่อลดการรบกวน
หากมี multiple replicas ของ Argo CD components:
kubectl scale deployment argocd-server -n argocd --replicas=2
kubectl scale deployment argocd-application-controller -n argocd --replicas=2
ขั้นตอนที่ 6: ทำการอัปเกรด
kubectl apply -f /tmp/install-${VERSION}.yaml -n argocd
ขั้นตอนที่ 7: ตรวจสอบสถานะ
# ตรวจสอบ rollout status
kubectl rollout status deployment/argocd-server -n argocd --timeout=5m
kubectl rollout status deployment/argocd-application-controller -n argocd --timeout=5m
kubectl rollout status deployment/argocd-repo-server -n argocd --timeout=5m
# ดูสถานะของ pods
kubectl get pods -n argocd
# ตรวจสอบ logs
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-server --tail=50
การตรวจสอบหลังจากอัปเกรด
การตรวจสอบให้ดี (verification) หลังการอัปเกรดเป็นสิ่งจำเป็นเพื่อให้มั่นใจว่าระบบทำงานปกติ
การทดสอบเบื้องต้น
# ตรวจสอบเวอร์ชันใหม่
argocd version
# ตรวจสอบสถานะของ Argo CD
argocd admin dashboard
# ตรวจสอบ health status
kubectl get svc -n argocd
kubectl port-forward svc/argocd-server -n argocd 8080:443
การตรวจสอบการทำงานของ Applications
# ดูรายการ applications
argocd app list
# ตรวจสอบสถานะของ application
argocd app get <app-name>
# ตรวจสอบ sync status
argocd app info <app-name>
การตรวจสอบ Logs และ Events
# ดู logs ของ application controller
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=100
# ดู events
kubectl get events -n argocd --sort-by='.lastTimestamp'
# ตรวจสอบ metrics (ถ้ามี Prometheus)
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-metrics
กระบวนการ Rollback ในกรณีเกิดปัญหา
หากเกิดปัญหาหลังการอัปเกรด Argo CD จะต้องสามารถย้อนกลับไปยังเวอร์ชันเก่าได้อย่างรวดเร็ว
Rollback โดยใช้ kubectl
Kubernetes เก็บประวัติการ rollout (rollout history) ไว้โดยอัตโนมัติ:
# ดูประวัติการ rollout
kubectl rollout history deployment/argocd-server -n argocd
# ดูรายละเอียดของ rollout ที่กำหนด
kubectl rollout history deployment/argocd-server -n argocd --revision=2
# Rollback ไปยังเวอร์ชันก่อนหน้า
kubectl rollout undo deployment/argocd-server -n argocd
kubectl rollout undo deployment/argocd-application-controller -n argocd
kubectl rollout undo deployment/argocd-repo-server -n argocd
# Rollback ไปยังเวอร์ชันที่กำหนด
kubectl rollout undo deployment/argocd-server -n argocd --to-revision=2
Rollback โดยใช้ Helm
หากใช้ Helm ในการติดตั้ง:
# ดูประวัติการ release
helm history argocd -n argocd
# Rollback ไปยังเวอร์ชันก่อนหน้า
helm rollback argocd -n argocd
# Rollback ไปยัง revision ที่กำหนด
helm rollback argocd 1 -n argocd
Rollback โดยใช้ Manifest เดิม
# ใช้ manifest เวอร์ชันเก่า
kubectl apply -f /backup/install-old-version.yaml -n argocd
# ตรวจสอบสถานะ
kubectl rollout status deployment/argocd-server -n argocd
กู้คืนข้อมูลจากสำรอง
หากต้องกู้คืนข้อมูล applications หลังการ rollback:
# กู้คืน applications
kubectl apply -f /backup/applications-backup.yaml -n argocd
# กู้คืน secrets
kubectl apply -f /backup/secrets-backup.yaml -n argocd
# ตรวจสอบว่า applications กลับมาปกติหรือไม่
argocd app list
แนวทางปฏิบัติที่ดีสำหรับการอัปเกรดแบบ Zero-Downtime
เพื่อให้การอัปเกรด Argo CD ไม่ส่งผลกระทบต่อการให้บริการ (zero-downtime upgrade) ต้องปฏิบัติตามแนวทางต่อไปนี้:
1. วางแผนอัปเกรดล่วงหน้า
- ตัดสินใจเลือกช่วงเวลาที่มีการใช้งานน้อย (off-peak hours)
- แจ้งให้ทีมงานทั้งหมดทราบล่วงหน้า
- เตรียมแผนสำรองในกรณีเกิดปัญหา
2. ใช้ High Availability (HA) Configuration
สำหรับสภาพแวดล้อมการผลิต (production) ต้องมี replicas หลายตัว:
# ตั้งค่า replicas
kubectl scale deployment argocd-server -n argocd --replicas=3
kubectl scale deployment argocd-application-controller -n argocd --replicas=3
kubectl scale deployment argocd-repo-server -n argocd --replicas=2
3. ใช้ PodDisruptionBudget
สร้าง PodDisruptionBudget เพื่อให้มั่นใจว่าจำนวน pods พร้อมใช้งานนั้นพอเพียง:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: argocd-server-pdb
namespace: argocd
spec:
minAvailable: 2
selector:
matchLabels:
app.kubernetes.io/name: argocd-server
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: argocd-controller-pdb
namespace: argocd
spec:
minAvailable: 2
selector:
matchLabels:
app.kubernetes.io/name: argocd-application-controller
4. ตั้งค่า Rolling Update Strategy
ตรวจสอบว่า deployment มี strategy ที่เหมาะสม:
kubectl get deployment -n argocd -o jsonpath='{.items[*].spec.strategy}'
ควรจะมีการตั้งค่า maxUnavailable ให้ต่ำ:
kubectl patch deployment argocd-server -n argocd -p '{"spec":{"strategy":{"type":"RollingUpdate","rollingUpdate":{"maxUnavailable":1,"maxSurge":1}}}}'
5. ติดตามสถานะระหว่างการอัปเกรด
ใช้ kubectl ในการติดตามการอัปเกรด:
# ดูสถานะในรีเอลไทม์
kubectl rollout status deployment/argocd-server -n argocd -w
# ดูเปอร์เซ็นต์ของการสำเร็จ
kubectl get deployment -n argocd -w
6. ทดสอบฟังก์ชันหลักหลังจากอัปเกรด
ตรวจสอบให้แน่ใจว่า Argo CD สามารถ sync applications ได้:
# Sync application เพื่อทดสอบ
argocd app sync <test-app-name>
# ตรวจสอบว่า sync สำเร็จหรือไม่
argocd app get <test-app-name>
7. ใช้ Canary Deployment (ตัวเลือก)
สำหรับสภาพแวดล้อมที่มีความสำคัญสูง ให้พิจารณาการใช้ canary deployment โดยอัปเกรด pod ทีละตัว
เคล็ดลับและวิธีแก้ปัญหาทั่วไป
ปัญหา: ImagePullBackOff หลังการอัปเกรด
ทำให้แน่ใจว่า Docker images สำหรับเวอร์ชันใหม่นั้นพร้อม:
kubectl describe pod -n argocd <pod-name>
kubectl logs -n argocd <pod-name>
ปัญหา: CRD Conflicts
ถ้าเกิดปัญหา CRD (Custom Resource Definition):
kubectl get crd | grep argoproj
kubectl describe crd applications.argoproj.io
ปัญหา: Redis Connection Error
ตรวจสอบสถานะของ Redis:
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-redis
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-redis
สรุป
การอัปเกรด Argo CD อย่างปลอดภัยบน Cloud VPS ต้องการการวางแผนที่ดี การสำรองข้อมูลที่ครอบคลุม และการตรวจสอบทีละขั้นตอน ด้วยการปฏิบัติตามแนวทางที่นำเสนอในบทความนี้ คุณจะสามารถอัปเกรด Argo CD ได้อย่างมั่นใจและปลอดภัยโดยไม่ทำให้ระบบหยุดทำงาน
สำหรับผู้ที่ใช้บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง เราแนะนำให้ติดต่อทีมงานด้านเทคนิคของเรา หากต้องการความช่วยเหลือในการอัปเกรด Argo CD บน Cloud VPS ของคุณ ทีมงานของเราพร้อมให้ความสนับสนุนและแนวทางปฏิบัติที่ดีที่สุด
ข้อควรจำ: ไม่ว่าจะใช้วิธีการใด ควรจะเตรียมสำรองข้อมูล (backup) ไว้ตลอดเวลา ติดตามสถานะระหว่างการอัปเกรด และมีแผน rollback ที่พร้อมในกรณีที่เกิดปัญหา

