Argo CD Image Updater: อัปเดต Container Image อัตโนมัติเมื่อมีเวอร์ชันใหม่
ในยุคของ DevOps และการพัฒนาแอปพลิเคชันแบบ Continuous Deployment (CD) การจัดการเวอร์ชันของ Container Image เป็นหนึ่งในความท้าทายหลัก องค์กรต่างๆ ต้องการให้แอปพลิเคชันของพวกเขาได้รับอัปเดตล่าสุด แต่ก็ต้องรักษาความมั่นคงและเสถียรภาพของระบบ Argo CD Image Updater คือเครื่องมือที่ช่วยแก้ปัญหานี้โดยอนุญาตให้คุณอัปเดต Container Image อัตโนมัติโดยไม่ต้องแทรกแซงแบบแมนนวล
1. Argo CD Image Updater คืออะไร
Argo CD Image Updater เป็น complement component ของ Argo CD ที่ช่วยให้คุณสามารถอัปเดต Container Image ในไฟล์ manifest ของคุณโดยอัตโนมัติ เมื่อมีเวอร์ชันใหม่ของ image นั้นๆ ปล่อยออกมา ซึ่งทำให้ workflow ของ GitOps มีความสมบูรณ์มากขึ้น
แทนที่จะเขียนโค้ด version อัพเดตเองด้วยตนเอง หรือใช้ CI/CD pipelines ที่ซับซ้อนในการอัปเดต image tags ใน Git repository คุณสามารถให้ Argo CD Image Updater ทำงานนี้โดยอัตโนมัติตามกฎที่คุณกำหนด
1.1 ทำไมจึงจำเป็นต้องใช้ Argo CD Image Updater
- ลดเวลา deployment: ไม่จำเป็นต้องรอการ pull request และ merge ด้วยตนเอง
- ความสอดคล้องของ GitOps: ทุกการเปลี่ยนแปลง image tag ยังคงบันทึกในไฟล์ Git
- ความอิสระในการเลือก strategy: สามารถเลือกว่าจะอัปเดต image เมื่อมีเวอร์ชันใด (semver, latest, digest)
- ความปลอดภัย: ตัวอักษร image digest ยังคงถูกตรวจสอบอย่างเหมาะสม
- การลดข้อผิดพลาด: ขจัดความต้องการในการแก้ไขไฟล์ manifest ด้วยตนเอง
2. วิธีการทำงานของ Argo CD Image Updater
2.1 Architecture ของ Image Updater
Argo CD Image Updater ทำงานโดยการทำการเฝ้าดูว่ามีการ push image version ใหม่ขึ้น registry (เช่น Docker Hub, GitHub Container Registry, Amazon ECR, เป็นต้น) เมื่อพบเวอร์ชันใหม่ที่ตรงกับเกณฑ์ที่คุณกำหนด Image Updater จะอัปเดต image tag ในไฟล์ manifest ของคุณและสามารถ push ไฟล์ที่อัปเดตนั้นกลับไปยัง Git repository
สถาปัตยกรรมพื้นฐานประกอบด้วย:
- Image Updater Controller: ทำการเฝ้าดูและจัดการการอัปเดต
- Registry Monitor: ตรวจสอบการ push image ใหม่ใน registry
- Git Repository Manager: เขียน updated manifests ไปยัง Git
- Argo CD Application: ตรวจสอบและ sync ตามไฟล์ที่อัปเดตใหม่
2.2 Flow การอัปเดต Image
1. Image Updater ตรวจสอบ registry ทุกๆ ช่วงเวลาที่กำหนด
2. หากพบ image tag ใหม่ที่ตรงกับเกณฑ์
3. Image Updater อัปเดต manifest file ใน Git repository
4. Argo CD ตรวจสอบการเปลี่ยนแปลงใน Git
5. Argo CD sync application ไปยัง Kubernetes cluster
6. Container image ใหม่ถูก deploy ไปยัง pods
3. การติดตั้ง Argo CD Image Updater
3.1 ข้อกำหนดเบื้องต้น
- Argo CD (เวอร์ชัน 2.0 ขึ้นไป) ที่ติดตั้งแล้วบน Kubernetes cluster
- Git repository ที่มี deployment manifests
- Access token สำหรับ Git repository (สำหรับการ write-back)
- Docker registry credentials (หากจำเป็น)
3.2 ติดตั้ง Image Updater ผ่าน Helm
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd-image-updater argo/argocd-image-updater \
--namespace argocd \
--set argocd.serverAddress=http://argocd-server \
--set argocd.token='<your-token>' \
--set git.user=image-updater \
--set [email protected]
3.3 ติดตั้ง Image Updater ผ่าน kubectl
หากคุณต้องการติดตั้งจากไฟล์ manifest โดยตรง:
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
4. การกำหนดค่า Image Updater
4.1 ConfigMap สำหรับการกำหนดค่า
Argo CD Image Updater ใช้ ConfigMap ชื่อ argocd-image-updater-config สำหรับการกำหนดค่าทั่วไป:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-image-updater-config
namespace: argocd
data:
log.level: info
log.format: json
git.user: image-updater
git.email: [email protected]
registries.conf: |
registries:
- name: dockerhub
prefix: docker.io
credentials: secret:argocd/docker-credentials
- name: ghcr
prefix: ghcr.io
credentials: secret:argocd/github-credentials
- name: ecr
prefix: 123456789.dkr.ecr.us-east-1.amazonaws.com
credentials: secret:argocd/ecr-credentials
insecure: false
tagsortingstrategy: semver
4.2 Secret สำหรับ Git Repository Access
ต้องสร้าง Secret ที่เก็บ Git credentials:
kubectl create secret generic git-credentials \
--from-literal=username=your-git-username \
--from-literal=password=your-git-token \
-n argocd
หรือสำหรับ SSH access:
kubectl create secret generic git-ssh-credentials \
--from-file=ssh-privatekey=/path/to/private/key \
-n argocd
4.3 Annotations บน Argo CD Application
เพื่อบอกให้ Image Updater ทำการอัปเดต image บน Application คุณต้องเพิ่ม annotations:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
annotations:
argocd-image-updater.argoproj.io/image-list: ghcr.io/my-org/my-app
argocd-image-updater.argoproj.io/ghcr.io.my-org.my-app.update-strategy: semver:~1.0
argocd-image-updater.argoproj.io/write-back-method: git
argocd-image-updater.argoproj.io/git-branch: main
spec:
project: default
source:
repoURL: https://github.com/my-org/my-app-config
path: config/
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
5. Image Update Strategies (กลยุทธ์การอัปเดต)
5.1 Semantic Versioning (Semver) Strategy
นี่คือวิธีที่นิยมที่สุดสำหรับการอัปเดต image ตามเวอร์ชันที่เข้มงวด:
annotations:
argocd-image-updater.argoproj.io/image-list: myregistry.azurecr.io/my-app
argocd-image-updater.argoproj.io/myregistry.azurecr.io.my-app.update-strategy: semver:~1.4.0
ตัวอย่างกฎ semver:
semver:~1.4.0– อัปเดตไปเวอร์ชัน 1.4.x ที่ใหม่ที่สุด (ไม่รวม 1.5.0)semver:^1.4.0– อัปเดตไปเวอร์ชัน 1.x.x ที่ใหม่ที่สุด (ไม่รวม 2.0.0)semver:>=1.0.0 <2.0.0– ระบุช่วงเวอร์ชันอย่างชัดเจน
5.2 Latest Tag Strategy
ใช้ image tag ที่ latest เสมอ (ไม่แนะนำสำหรับ production):
annotations:
argocd-image-updater.argoproj.io/image-list: docker.io/myrepo/myapp
argocd-image-updater.argoproj.io/docker.io.myrepo.myapp.update-strategy: latest
5.3 Digest Strategy
ใช้ image digest เพื่อความแม่นยำสูงสุด:
annotations:
argocd-image-updater.argoproj.io/image-list: ghcr.io/my-org/my-service
argocd-image-updater.argoproj.io/ghcr.io.my-org.my-service.update-strategy: digest
5.4 Alphabetical Order Strategy
อัปเดตตามลำดับตัวอักษร (สำหรับ custom tagging schemes):
annotations:
argocd-image-updater.argoproj.io/image-list: registry.example.com/app
argocd-image-updater.argoproj.io/registry.example.com.app.update-strategy: alphabetical
6. Write-Back Methods (วิธีการเขียนกลับข้อมูล)
6.1 Git Write-Back Method
นี่คือวิธีที่นิยมที่สุด โดยจะเขียน updated manifest กลับไปยัง Git repository:
annotations:
argocd-image-updater.argoproj.io/write-back-method: git
argocd-image-updater.argoproj.io/write-back-target: kustomization
argocd-image-updater.argoproj.io/git-branch: main
6.2 ArgoCD API Write-Back Method
บางครั้งคุณอาจต้องการเขียนกลับโดยตรงผ่าน Argo CD API แทนการ push ไป Git:
annotations:
argocd-image-updater.argoproj.io/write-back-method: argocd
argocd-image-updater.argoproj.io/write-back-target: application
6.3 Kustomization Write-Back
สำหรับการใช้ Kustomize ใน deployment:
annotations:
argocd-image-updater.argoproj.io/write-back-method: git:kustomization
argocd-image-updater.argoproj.io/write-back-target: kustomization
7. การติดตั้ง Image Updater บน ผู้ให้บริการโฮสติ้ง Cloud VPS
หากคุณใช้บริการ Cloud VPS จาก ผู้ให้บริการโฮสติ้ง (https://de.co.th/cloud-vps) คุณมี flexibility อย่างเต็มที่ในการติดตั้ง Argo CD Image Updater บน Kubernetes cluster ของคุณ บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง มอบการให้บริการเซิร์ฟเวอร์แบบ dedicated และมีการควบคุมเต็มความสามารถ ซึ่งเหมาะสำหรับการรัน production-grade DevOps tools เช่น Argo CD
7.1 ขั้นตอนการติดตั้งบน Cloud VPS
# 1. SSH เข้าไปยัง Cloud VPS instance
ssh user@your-cloud-vps-ip
# 2. ติดตั้ง kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s \
https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
# 3. ติดตั้ง Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 4. เพิ่ม Argo Helm repository
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
# 5. ติดตั้ง Image Updater
helm install argocd-image-updater argo/argocd-image-updater \
--namespace argocd \
--create-namespace \
--set argocd.serverAddress=http://argocd-server.argocd.svc \
--set git.user=image-updater-bot \
--set [email protected]
8. ตัวอย่าง Configuration ที่สมบูรณ์
8.1 ตัวอย่างสำหรับ Docker Hub
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: web-app
namespace: argocd
annotations:
argocd-image-updater.argoproj.io/image-list: docker.io/mycompany/web-app
argocd-image-updater.argoproj.io/docker.io.mycompany.web-app.update-strategy: semver:~1.0
argocd-image-updater.argoproj.io/docker.io.mycompany.web-app.force-update: 'false'
argocd-image-updater.argoproj.io/write-back-method: git
argocd-image-updater.argoproj.io/git-branch: main
spec:
project: default
source:
repoURL: https://github.com/mycompany/web-app-config.git
path: k8s/
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
8.2 ตัวอย่างสำหรับ GitHub Container Registry
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api-service
namespace: argocd
annotations:
argocd-image-updater.argoproj.io/image-list: ghcr.io/myorg/api-service,ghcr.io/myorg/api-worker
argocd-image-updater.argoproj.io/ghcr.io.myorg.api-service.update-strategy: semver:^2.0
argocd-image-updater.argoproj.io/ghcr.io.myorg.api-worker.update-strategy: semver:~1.5
argocd-image-updater.argoproj.io/ghcr.io.myorg.api-service.allow-tags: '^v.*'
argocd-image-updater.argoproj.io/ghcr.io.myorg.api-worker.ignore-tags: '.*-debug,.*-test'
argocd-image-updater.argoproj.io/write-back-method: git
spec:
project: default
source:
repoURL: https://github.com/myorg/api-config.git
path: manifests/
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: default
8.3 ตัวอย่างสำหรับ Amazon ECR
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: data-processor
namespace: argocd
annotations:
argocd-image-updater.argoproj.io/image-list: 123456789.dkr.ecr.us-east-1.amazonaws.com/data-processor
argocd-image-updater.argoproj.io/123456789.dkr.ecr.us-east-1.amazonaws.com.data-processor.update-strategy: semver:~1.0
argocd-image-updater.argoproj.io/write-back-method: git
argocd-image-updater.argoproj.io/git-branch: production
spec:
project: default
source:
repoURL: https://github.com/mycompany/data-processor-config.git
path: deployment/
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: data-processing
9. Tag Filtering และ Exclusion Rules
9.1 Allow Tags
annotations:
argocd-image-updater.argoproj.io/image-list: myregistry.example.com/myapp
argocd-image-updater.argoproj.io/myregistry.example.com.myapp.allow-tags: '^v.*'
9.2 Ignore Tags
annotations:
argocd-image-updater.argoproj.io/image-list: ghcr.io/mycompany/service
argocd-image-updater.argoproj.io/ghcr.io.mycompany.service.ignore-tags: '.*-(alpha|beta|rc|dev)'
10. Best Practices สำหรับการใช้ Argo CD Image Updater
10.1 ใช้ Semantic Versioning อย่างสม่ำเสมอ
ตรวจสอบให้แน่ใจว่า container images ของคุณทั้งหมดใช้ semantic versioning (MAJOR.MINOR.PATCH)
10.2 ทดสอบใน Staging ก่อน Production
ใช้ Image Updater บน staging environment ก่อนจะใช้บน production
10.3 ตั้งค่า Resource Limits อย่างเหมาะสม
เนื่องจาก Image Updater ต้องเฝ้าดู registries อยู่เสมอ ตรวจสอบให้แน่ใจว่าตั้งค่า resource requests และ limits
11. Troubleshooting และ Debugging
11.1 ตรวจสอบ Logs ของ Image Updater
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-image-updater -f
11.2 ปัญหาทั่วไป
ปัญหา: Image Updater ไม่สามารถเข้าถึง Registry
- ตรวจสอบ registry credentials ใน Secret
- ตรวจสอบ network connectivity จาก Kubernetes cluster ไปยัง registry
- ตรวจสอบ firewall rules และ security groups
ปัญหา: Update ไม่เกิดขึ้นแม้ว่ามี version ใหม่
- ตรวจสอบ annotation syntax บน Application
- ตรวจสอบ update strategy ตรงกับ image tags จริงหรือไม่
- ตรวจสอบ allow-tags และ ignore-tags rules
12. สรุปและข้อสรุป
Argo CD Image Updater เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการอัปเดต Container Image อัตโนมัติในสภาพแวดล้อม Kubernetes ด้วยการใช้งานอย่างถูกต้อง คุณสามารถลดความพยายามด้วยตนเองและเพิ่มประสิทธิภาพของกระบวนการ deployment ของคุณได้อย่างมาก
สำหรับผู้ที่ใช้บริการ Cloud VPS จาก ผู้ให้บริการโฮสติ้ง (https://de.co.th/cloud-vps) คุณมีความยืดหยุ่นที่เพียงพอในการติดตั้งและกำหนดค่า Argo CD Image Updater เพื่อให้เหมาะสมกับความต้องการเฉพาะของคุณ

