ในยุคของ DevOps และ GitOps ที่เกิดขึ้นในปัจจุบัน Argo CD ได้กลายเป็นเครื่องมือหลักสำหรับการจัดการและติดตั้งแอปพลิเคชันใน Kubernetes คลัสเตอร์อย่างอัตโนมัติ อย่างไรก็ตาม เมื่อทำการทำงานกับ Git Repository ที่มีการควบคุมการเข้าถึง (Private Repository) คุณต้องตั้งค่าการตรวจสอบสิทธิ์ (Authentication) ให้ถูกต้อง ปัญหาเรื่องการเชื่อมต่อและตรวจสอบสิทธิ์นี้มักจะเป็นความท้าทายที่สำคัญสำหรับทีม DevOps ที่ใช้ Argo CD
เหตุใดจึงต้องใช้ Private Git Repository กับ Argo CD
การใช้ Private Git Repository มีความสำคัญหลายประการในสภาพแวดล้อม Production:
- ความปลอดภัย (Security): ไม่ต้องเปิดเผยรหัสแอปพลิเคชันและข้อมูลสำคัญต่อสาธารณะ
- การควบคุมการเข้าถึง (Access Control): สามารถกำหนดสิทธิ์เข้าถึงได้อย่างละเอียด สำหรับแต่ละทีมหรือผู้ใช้งาน
- การจัดการการปล่อยรหัส (Release Management): ควบคุมได้ว่าใครสามารถอนุมัติการเปลี่ยนแปลงได้
- การปฏิบัติตามกฎเกณฑ์ (Compliance): ปฏิบัติตามข้อกำหนด GDPR, PCI-DSS หรือมาตรฐานด้านความปลอดภัยอื่น ๆ
- ความเป็นส่วนตัวขององค์กร: รักษาความเป็นส่วนตัวของกลยุทธ์และสถาปัตยกรรมของบริษัท
เมื่อใช้งาน Argo CD กับ Private Repository บน Kubernetes โดยเฉพาะบน DE Cloud VPS ที่มีประสิทธิภาพสูง คุณต้องตั้งค่าช่องทางการสื่อสารที่ปลอดภัยระหว่าง Argo CD กับ Git Server
วิธีที่ 1: ตั้งค่า Argo CD กับ SSH Key
ขั้นตอนที่ 1: สร้าง SSH Key Pair
ขั้นแรก เราต้องสร้าง SSH Key สำหรับการเชื่อมต่อไปยัง Git Repository หลีกเลี่ยงการใช้รหัสผ่าน (Password-based Authentication):
ssh-keygen -t rsa -b 4096 -f ~/.ssh/argocd_key -N ""
คำสั่งนี้จะสร้างไฟล์ SSH Key ดังนี้:
argocd_key– Private Key (ใช้โดย Argo CD)argocd_key.pub– Public Key (เพิ่มไปยัง Git Repository)
เราสามารถดูเนื้อหา Public Key ได้:
cat ~/.ssh/argocd_key.pub
ขั้นตอนที่ 2: เพิ่ม Public Key ไปยัง Git Repository
ขึ้นอยู่กับประเภท Git Platform ที่คุณใช้ (GitHub, GitLab, Gitea, ฯลฯ) ขั้นตอนการเพิ่ม Public Key จะแตกต่างกันเล็กน้อย:
สำหรับ GitHub:
- เข้าไป Settings → Deploy keys
- คลิก “Add deploy key”
- วาง Public Key ที่สร้างไว้
- ตั้งชื่อให้กับ Key (เช่น “Argo CD Deploy Key”)
- เลือก “Allow write access” ถ้าหากต้องการให้ Argo CD เขียนข้อมูลกลับไปที่ Repository
- คลิก “Add key”
สำหรับ GitLab:
- ไปที่ Project → Settings → Repository
- ค้นหา “Deploy Keys” section
- คลิก “Add deploy key”
- วาง Public Key
- ตั้งค่าสิทธิ์ตามความต้องการ
สำหรับ Gitea หรือ Self-hosted Git Server:
- ไปที่ Settings → SSH and GPG keys
- เพิ่ม Public Key ลงในระบบ
ขั้นตอนที่ 3: สร้าง Kubernetes Secret สำหรับ SSH Key
หลังจากเพิ่ม Public Key เสร็จแล้ว ต้องสร้าง Kubernetes Secret เพื่อเก็บ Private Key ใน Kubernetes Cluster:
kubectl create secret generic argocd-ssh-creds \
--from-file=ssh-privatekey=~/.ssh/argocd_key \
-n argocd
ตรวจสอบว่า Secret ถูกสร้างสำเร็จ:
kubectl get secret argocd-ssh-creds -n argocd
ขั้นตอนที่ 4: ลงทะเบียน Repository ใน Argo CD
เมื่อสร้าง Secret แล้ว ต้องลงทะเบียน Git Repository ใน Argo CD ด้วย SSH URL และตั้งค่าให้ใช้ SSH Key:
ผ่าน ArgoCD CLI:
argocd repo add [email protected]:username/private-repo.git \
--ssh-private-key-path ~/.ssh/argocd_key \
--insecure-ignore-host-key
หรือผ่าน YAML Manifest:
apiVersion: v1
kind: Secret
metadata:
name: private-repo-credentials
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
type: Opaque
stringData:
type: git
url: [email protected]:username/private-repo.git
sshPrivateKey: |
-----BEGIN RSA PRIVATE KEY-----
[ใส่ content ของ private key ที่นี่]
-----END RSA PRIVATE KEY-----
insecureIgnoreHostKey: "true"
นำไปใช้ใน Kubernetes:
kubectl apply -f private-repo-secret.yaml
ขั้นตอนที่ 5: สร้าง ArgoCD Application
เมื่อ Repository ถูกลงทะเบียนแล้ว สามารถสร้าง Application ได้:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: [email protected]:username/private-repo.git
targetRevision: main
path: k8s/
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
วิธีที่ 2: ตั้งค่า Argo CD กับ HTTPS และ Personal Access Token
ขั้นตอนที่ 1: สร้าง Personal Access Token
สำหรับ GitHub:
- ไปที่ Settings → Developer settings → Personal access tokens
- คลิก “Generate new token”
- ตั้งชื่อให้กับ Token (เช่น “Argo CD Token”)
- เลือก Scope:
repo(เพื่อให้สามารถเข้าถึง Private Repository) - คลิก “Generate token”
- คัดลอก Token ที่สร้างขึ้น (จะแสดงเพียงครั้งเดียว)
สำหรับ GitLab:
- ไปที่ User Settings → Access Tokens
- คลิก “Add new token”
- ตั้งชื่อและเลือก Scopes:
read_repository,write_repository - สร้าง Token
ขั้นตอนที่ 2: สร้าง Kubernetes Secret สำหรับ HTTPS
สร้าง Secret ที่เก็บ Username และ Personal Access Token:
kubectl create secret generic argocd-https-creds \
--from-literal=username=github-username \
--from-literal=password=ghp_your_personal_access_token \
-n argocd
หรือใช้ YAML Manifest:
apiVersion: v1
kind: Secret
metadata:
name: private-repo-https
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
type: Opaque
stringData:
type: git
url: https://github.com/username/private-repo.git
username: github-username
password: ghp_your_personal_access_token
ขั้นตอนที่ 3: ลงทะเบียน Repository ใน Argo CD
ลงทะเบียน Repository ด้วย HTTPS URL:
argocd repo add https://github.com/username/private-repo.git \
--username github-username \
--password ghp_your_personal_access_token
หรือใช้ kubectl apply กับ YAML Manifest ข้างต้น
เปรียบเทียบ SSH Key กับ HTTPS และ Personal Access Token
| ลักษณะ | SSH Key | HTTPS + Personal Access Token |
|---|---|---|
| ความปลอดภัย | สูง – ใช้ Public Key Cryptography | สูง – Token สามารถจำกัดขอบเขตได้ |
| การตั้งค่า | ซ้อนดังปกติ – ต้องสร้าง Key และ Deploy Key | ง่ายกว่า – เพียงสร้าง Token |
| การหมุนเวียน Credentials | ยุ่งสักเล่น – ต้องสร้าง Key ใหม่ และอัปเดต | ง่าย – สามารถหมดอายุและสร้างใหม่ได้ |
| Firewall/Proxy | อาจถูกบล็อก Port 22 | ใช้ Port 443 มาตรฐาน – ไม่ค่อยถูกบล็อก |
| ความเหมาะสม | เหมาะสำหรับ CI/CD ระดับองค์กร | เหมาะสำหรับการพัฒนาระดับเล็ก |
แนวปฏิบัติด้านความปลอดภัย (Security Best Practices)
1. ใช้ Credentials ที่มีสิทธิ์อย่างจำกัด (Least Privilege)
ไม่ควรใช้ Personal Access Token ของบัญชีคนที่มีสิทธิ์สูง ควรสร้างบัญชีสำหรับ Argo CD เท่านั้น:
# สร้าง GitHub Bot User สำหรับ Argo CD
# ตั้งค่าให้มีเพียงสิทธิ์ read repository เท่านั้น
2. เข้ารหัส Secrets ใน etcd
ตั้งค่า Kubernetes เพื่อเข้ารหัส Secrets ที่เก็บในฐานข้อมูล etcd:
# ตรวจสอบว่า etcd encryption ถูกเปิดใช้งาน
kubectl get secrets -A -o json | grep "k8s.io/config/hash"
3. ควบคุมการเข้าถึง RBAC
จำกัดสิทธิ์ผู้ใช้ที่สามารถดูและจัดการ Secrets ใน Argo CD Namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: argocd-repo-secrets-viewer
namespace: argocd
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
resourceNames: ["private-repo-ssh", "private-repo-https"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: argocd-repo-secrets-viewer-binding
namespace: argocd
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: argocd-repo-secrets-viewer
subjects:
- kind: User
name: argocd-admin
4. เปิดใช้งาน SSH Host Key Verification
หลีกเลี่ยงการใช้ insecureIgnoreHostKey: true ในสภาพแวดล้อม Production ให้สาย SSH Host Key แทน:
# ได้ SSH Host Key ของ GitHub
ssh-keyscan github.com >> ~/.ssh/known_hosts
จากนั้นเพิ่มลงใน ConfigMap ของ Argo CD:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-ssh-known-hosts-cm
namespace: argocd
data:
known_hosts: |
github.com ssh-rsa AAAAB3NzaC1yc2EAAAAB...
5. หมุนเวียน Credentials เป็นระยะ
ตั้งกำหนดเวลาสำหรับการสร้าง Personal Access Token ใหม่และลบ Token เก่า:
# สร้าง Token ใหม่ทุก 90 วัน
# ลบ Token เก่า
การแก้ไขปัญหา Authentication Errors
ปัญหา: “Permission denied (publickey)”
ปัญหานี้เกิดขึ้นเมื่อ SSH Key ไม่ถูกต้อง:
# ตรวจสอบ SSH Key ใน Secret
kubectl get secret private-repo-ssh -n argocd -o yaml
# ทดสอบการเชื่อมต่อ SSH โดยตรง
kubectl run -it --rm debug --image=alpine/fluxcd:latest --restart=Never -- \
sh -c "ssh -i /etc/secret/ssh-privatekey -o StrictHostKeyChecking=no \
[email protected] echo Connection successful"
ปัญหา: “Failed to authenticate”
สำหรับ HTTPS authentication ให้ตรวจสอบ Personal Access Token:
# ทดสอบการเชื่อมต่อด้วย curl
curl -u username:ghp_token https://github.com/api/v3/user
# ตรวจสอบ Secret
kubectl get secret private-repo-https -n argocd -o yaml | grep password
ปัญหา: “Host key verification failed”
เมื่อเปิดใช้งาน Host Key Verification ให้ตรวจสอบ known_hosts ConfigMap:
# ตรวจสอบ known_hosts ใน Argo CD Pod
kubectl exec -it deployment/argocd-repo-server -n argocd -- \
cat ~/.ssh/known_hosts
# เพิ่ม Host Key ใหม่
ssh-keyscan github.com | tee -a known_hosts_cm.txt
ตัวอย่างการตั้งค่าแบบสมบูรณ์
นี่คือตัวอย่างการตั้งค่าที่สมบูรณ์ด้วย SSH Key ใน Kubernetes:
---
# สร้าง SSH Secret
apiVersion: v1
kind: Secret
metadata:
name: my-private-repo-ssh
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
type: Opaque
stringData:
type: git
url: [email protected]:my-company/my-private-repo.git
sshPrivateKey: |
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUtbm9uZS1ub25lAAAAAwAAAA...
-----END OPENSSH PRIVATE KEY-----
insecureIgnoreHostKey: "false"
---
# สร้าง Argo CD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-secure-app
namespace: argocd
spec:
project: default
source:
repoURL: [email protected]:my-company/my-private-repo.git
targetRevision: main
path: deployment/
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
revisionHistoryLimit: 5
---
# สำหรับการควบคุมการเข้าถึง RBAC
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: argocd-app-viewer
namespace: argocd
rules:
- apiGroups: ["argoproj.io"]
resources: ["applications"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: argocd-app-viewer-binding
namespace: argocd
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: argocd-app-viewer
subjects:
- kind: User
name: dev-team
การผสมผสาน Argo CD กับ DE Cloud VPS
เมื่อคุณใช้ DE Cloud VPS เพื่อรันคลัสเตอร์ Kubernetes ของคุณ สามารถรวมกับ Argo CD ได้อย่างราบรื่น:
- ประสิทธิภาพสูง: DE Cloud VPS มีประสิทธิภาพและเสถียรภาพสูง เหมาะสำหรับรัน Kubernetes Production
- ความปลอดภัย: มี Network Isolation และ Security Features ที่ดี
- ความยืดหยุ่น: สามารถปรับขนาด (Scale) และปรับอย่าง (Configure) ได้ตามต้องการ
- การสนับสนุน: ทีม DE มีประสบการณ์มากมายกับการตั้งค่า Kubernetes และ GitOps
ด้วยการตั้งค่า Argo CD บน DE Cloud VPS คุณจะได้ระบบ Continuous Deployment ที่ปลอดภัย เสถียร และง่ายต่อการบำรุงรักษา
บทสรุป
การตั้งค่า Argo CD กับ Private Git Repository ต้องการความเอาใจใส่ต่อรายละเอียดด้านความปลอดภัยและการตรวจสอบสิทธิ์ ไม่ว่าคุณจะเลือก SSH Key หรือ HTTPS ด้วย Personal Access Token สิ่งสำคัญคือ:
- เลือกวิธีการที่เหมาะสมกับสถาปัตยกรรมของคุณ
- ปฏิบัติตามแนวปฏิบัติด้านความปลอดภัยที่เหมาะสม
- ทดสอบการเชื่อมต่อทั้งหมดอย่างทั่วถึง
- มีแผนในการหมุนเวียน Credentials เป็นระยะ
- ติดตามและตรวจสอบข้อผิดพลาดอย่างต่อเนื่อง
หากคุณต้องการสภาพแวดล้อม Kubernetes ที่ปลอดภัย เสถียร และมี GitOps Integration ที่ดี ลองใช้บริการ DE Cloud VPS ซึ่งสามารถรองรับการตั้งค่า Argo CD ของคุณได้อย่างเต็มที่

