ตั้งค่า Argo CD กับ Private Git Repository ผ่าน SSH Key และ HTTPS

ในยุคของ 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:

  1. เข้าไป Settings → Deploy keys
  2. คลิก “Add deploy key”
  3. วาง Public Key ที่สร้างไว้
  4. ตั้งชื่อให้กับ Key (เช่น “Argo CD Deploy Key”)
  5. เลือก “Allow write access” ถ้าหากต้องการให้ Argo CD เขียนข้อมูลกลับไปที่ Repository
  6. คลิก “Add key”

สำหรับ GitLab:

  1. ไปที่ Project → Settings → Repository
  2. ค้นหา “Deploy Keys” section
  3. คลิก “Add deploy key”
  4. วาง Public Key
  5. ตั้งค่าสิทธิ์ตามความต้องการ

สำหรับ Gitea หรือ Self-hosted Git Server:

  1. ไปที่ Settings → SSH and GPG keys
  2. เพิ่ม 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:

  1. ไปที่ Settings → Developer settings → Personal access tokens
  2. คลิก “Generate new token”
  3. ตั้งชื่อให้กับ Token (เช่น “Argo CD Token”)
  4. เลือก Scope: repo (เพื่อให้สามารถเข้าถึง Private Repository)
  5. คลิก “Generate token”
  6. คัดลอก Token ที่สร้างขึ้น (จะแสดงเพียงครั้งเดียว)

สำหรับ GitLab:

  1. ไปที่ User Settings → Access Tokens
  2. คลิก “Add new token”
  3. ตั้งชื่อและเลือก Scopes: read_repository, write_repository
  4. สร้าง 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 สิ่งสำคัญคือ:

  1. เลือกวิธีการที่เหมาะสมกับสถาปัตยกรรมของคุณ
  2. ปฏิบัติตามแนวปฏิบัติด้านความปลอดภัยที่เหมาะสม
  3. ทดสอบการเชื่อมต่อทั้งหมดอย่างทั่วถึง
  4. มีแผนในการหมุนเวียน Credentials เป็นระยะ
  5. ติดตามและตรวจสอบข้อผิดพลาดอย่างต่อเนื่อง

หากคุณต้องการสภาพแวดล้อม Kubernetes ที่ปลอดภัย เสถียร และมี GitOps Integration ที่ดี ลองใช้บริการ DE Cloud VPS ซึ่งสามารถรองรับการตั้งค่า Argo CD ของคุณได้อย่างเต็มที่