ตั้งค่า Ingress สำหรับ Argo CD Web UI พร้อม SSL บน Cloud VPS

การเพิ่มประสิทธิภาพการจัดการ Kubernetes บนแพลตฟอร์ม Cloud VPS นั้นต้องมีวิธีการเข้าถึง Argo CD Web UI ที่ปลอดภัยและมีเสถียรภาพ ในบทความนี้เราจะสอนวิธีตั้งค่า Ingress สำหรับ Argo CD Web UI พร้อมใบรับรอง SSL บน Cloud VPS ของคุณ ซึ่งจะช่วยให้คุณสามารถเข้าถึงระบบ GitOps อันทรงพลังได้อย่างปลอดภัยและเชื่อถือได้

ทำไมต้องเปิดเข้า Argo CD ผ่าน Ingress

Argo CD เป็นเครื่องมือ Continuous Deployment ที่ใช้หลักการ GitOps ในการจัดการแอปพลิเคชัน Kubernetes โดยค่าเริ่มต้น Argo CD Server จะฟังอยู่บน localhost เท่านั้น ซึ่งเป็นปัญหาเมื่อคุณต้องการให้ทีมของคุณเข้าถึง UI จากเครื่องอื่นๆ หรือจากเครือข่ายภายนอก

การใช้ Ingress Controller ร่วมกับ Load Balancer และ SSL Certificate นั้นเป็นแนวทางที่ดีที่สุด โดยเฉพาะอย่างยิ่งเมื่อคุณติดตั้ง Kubernetes บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง เพราะจะได้รับอำนาจในการควบคุมการไหลเข้าของข้อมูลและความปลอดภัยอย่างสมบูรณ์

ประโยชน์ของการใช้ Ingress มีดังนี้:

  • การเข้าถึงอย่างปลอดภัย: ใช้ HTTPS/SSL ในการเข้ารหัสการสื่อสาร
  • การจัดการที่เป็นมาตรฐาน: ใช้ Kubernetes native objects เพื่อสร้าง routing rules
  • ความนำเสนอแบบสาธารณะ: เปิดให้ทีมจากที่ต่างๆ เข้าถึง UI ได้ง่าย
  • ดำเนินการแบบปกติ: สามารถ scale และจัดการกับ traffic ได้ดี

ข้อกำหนดเบื้องต้น

ก่อนที่คุณจะเริ่มต้นตั้งค่า Ingress สำหรับ Argo CD บน Cloud VPS ของคุณ ต้องแน่ใจว่าคุณมีสิ่งต่อไปนี้:

  • Cloud VPS ที่มี Kubernetes Cluster ติดตั้งและทำงานอยู่ (ลองใช้บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง ที่ https://de.co.th/cloud-vps)
  • kubectl ติดตั้งและตั้งค่า kubeconfig ให้ชี้ไปที่ cluster ของคุณ
  • Argo CD ติดตั้งแล้วในคลัสเตอร์ของคุณ
  • Domain name ที่คุณควบคุมได้ และสามารถแก้ไข DNS records ได้
  • Helm ติดตั้ง (optional แต่แนะนำ)
  • ความเข้าใจพื้นฐานเกี่ยวกับ Kubernetes Ingress

ขั้นตอนที่ 1: ติดตั้ง NGINX Ingress Controller

Ingress Controller เป็นส่วนสำคัญที่ทำหน้าที่อ่าน Ingress resources และตั้งค่า load balancer ตามที่ระบุไว้ NGINX Ingress Controller เป็นตัวเลือกที่นิยมใช้งานมากที่สุดในสภาพแวดล้อม Kubernetes

ขั้นตอนที่ 1.1: เพิ่ม Helm Repository สำหรับ NGINX

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

ขั้นตอนที่ 1.2: ติดตั้ง NGINX Ingress Controller

ก่อนติดตั้ง ให้สร้าง namespace เพื่อวางองค์ประกอบของ Ingress:

kubectl create namespace ingress-nginx

จากนั้นติดตั้ง NGINX Ingress Controller โดยใช้ Helm:

helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=LoadBalancer \
  --set controller.metrics.enabled=true

หรือถ้าคุณใช้ Cloud VPS ที่ไม่มี external load balancer ให้ใช้ NodePort แทน:

helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=NodePort

ขั้นตอนที่ 1.3: ตรวจสอบการติดตั้ง

kubectl get svc -n ingress-nginx

คำสั่งนี้จะแสดง IP address หรือ hostname ของ Ingress Controller ที่คุณจะนำไปใช้ในการ pointing DNS

ขั้นตอนที่ 2: ติดตั้ง Cert-Manager สำหรับจัดการ SSL Certificate

Cert-manager ช่วยให้คุณจัดการและต่ออายุ SSL certificates โดยอัตโนมัติ โดยการใช้ Let’s Encrypt ซึ่งเป็นบริการให้ใบรับรอง SSL ฟรีอย่างน่าเชื่อถือ

ขั้นตอนที่ 2.1: เพิ่ม Helm Repository สำหรับ Cert-Manager

helm repo add jetstack https://charts.jetstack.io
helm repo update

ขั้นตอนที่ 2.2: สร้าง Namespace และติดตั้ง Cert-Manager

kubectl create namespace cert-manager
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --set installCRDs=true \
  --version v1.13.0

ขั้นตอนที่ 2.3: ตรวจสอบการติดตั้ง

kubectl get pods -n cert-manager

ต้องแน่ใจว่า pods ทั้งหมดอยู่ในสถานะ Running

ขั้นตอนที่ 3: สร้าง ClusterIssuer สำหรับ Let’s Encrypt

ClusterIssuer คือ Kubernetes resource ที่บอก cert-manager ว่าจะขอใบรับรองจากที่ใด โดยในที่นี้เราจะใช้ Let’s Encrypt

สร้างไฟล์ชื่อ letsencrypt-issuer.yaml ด้วยเนื้อหาต่อไปนี้:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-prod-key
    solvers:
    - http01:
        ingress:
          class: nginx
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-staging-key
    solvers:
    - http01:
        ingress:
          class: nginx

ใส่อีเมลของคุณแทน [email protected] จากนั้นใช้ kubectl apply:

kubectl apply -f letsencrypt-issuer.yaml

หมายเหตุ: ขอใช้ staging issuer สำหรับการทดสอบก่อน เพื่อหลีกเลี่ยงข้อจำกัดอัตราของ Let’s Encrypt

ขั้นตอนที่ 4: ตั้งค่า Argo CD Namespace และ Service

ตรวจสอบว่า Argo CD ติดตั้งและทำงาน:

kubectl get namespace | grep argocd

ถ้า Argo CD ยังไม่ติดตั้ง ติดตั้งโดยใช้ Helm:

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
kubectl create namespace argocd
helm install argocd argo/argo-cd \
  --namespace argocd \
  --set server.service.type=ClusterIP

ดูว่า Argo CD Service มีอะไร:

kubectl get svc -n argocd

ค่าเริ่มต้น service ชื่อ argocd-server จะเป็น ClusterIP และฟังบน port 443

ขั้นตอนที่ 5: สร้าง Ingress Resource สำหรับ Argo CD

เนื่องจาก Argo CD Web UI มีการใช้ WebSocket และ gRPC API ต้องตั้งค่า Ingress ด้วยความระมัดระวังเพื่อรองรับ protocol เหล่านี้

สร้างไฟล์ชื่อ argocd-ingress.yaml ด้วยเนื้อหาต่อไปนี้:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - argocd.example.com
    secretName: argocd-tls
  rules:
  - host: argocd.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 443

แทนที่ argocd.example.com ด้วย domain ของคุณจริงๆ จากนั้นใช้ kubectl apply:

kubectl apply -f argocd-ingress.yaml

ความหมายของ annotations:

  • cert-manager.io/cluster-issuer: บอก cert-manager ให้ใช้ ClusterIssuer ที่ชื่อ letsencrypt-prod
  • nginx.ingress.kubernetes.io/ssl-redirect: บังคับให้ redirect HTTP ไปเป็น HTTPS
  • nginx.ingress.kubernetes.io/backend-protocol: ระบุว่า backend (Argo CD) ใช้ HTTPS
  • nginx.ingress.kubernetes.io/force-ssl-redirect: บังคับให้ทุก request ใช้ SSL

ขั้นตอนที่ 6: ตั้งค่า DNS และตรวจสอบ Certificate

ขั้นตอนที่ 6.1: ได้ Ingress IP Address หรือ Hostname

kubectl get ingress -n argocd

คำสั่งนี้จะแสดง EXTERNAL-IP หรือ EXTERNAL HOSTNAME ของ Ingress

ขั้นตอนที่ 6.2: ชี้ DNS ไปยัง Ingress

เข้าไปที่ DNS provider ของคุณ (เช่น Cloudflare, Route53, หรือ provider อื่นๆ) สร้าง A record หรือ CNAME record ที่ชี้ไปยัง IP address หรือ hostname ของ Ingress

ตัวอย่างเช่น ถ้า Ingress IP คือ 203.0.113.10 ให้สร้าง A record:

argocd.example.com A 203.0.113.10

ขั้นตอนที่ 6.3: ตรวจสอบ Certificate

รอสักครู่เพื่อให้ cert-manager มีเวลาขอและสร้าง certificate

kubectl get certificate -n argocd
kubectl describe certificate argocd-tls -n argocd

ตรวจสอบเพื่อให้แน่ใจว่าสถานะ Certificate คือ True และ ready

kubectl get secret -n argocd | grep tls

ขั้นตอนที่ 7: เข้าถึง Argo CD Web UI

หลังจากตั้งค่า DNS และ certificate พร้อมแล้ว ให้เปิด browser และไปที่:

https://argocd.example.com

ตรวจสอบให้แน่ใจว่า certificate ถูกต้อง (ไม่มี warning) และสามารถเข้า Argo CD login page ได้

การได้รับ Admin Password:

Argo CD สร้าง admin password โดยอัตโนมัติไว้ใน secret:

kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d

ใช้ username admin และ password ที่ได้มา เข้าสู่ระบบ

ขั้นตอนที่ 8: ปรับแต่งการตั้งค่าเพิ่มเติม

เปลี่ยน Admin Password:

หลังจากเข้า UI สำเร็จแล้ว ต้องเปลี่ยน password ของ admin เพื่อความปลอดภัย ไปที่ User Info และ Change Password

สร้าง RBAC Users (ถ้าจำเป็น):

คุณสามารถสร้างผู้ใช้งานอื่นและกำหนดสิทธิ์การใช้งาน เพื่อให้ทีมสามารถเข้าถึง Argo CD ได้แต่มีข้อจำกัดเฉพาะด้านต่างๆ

ปรับแต่ง Argo CD ConfigMap:

kubectl edit configmap argocd-cmd-params-cm -n argocd

การแก้ไขปัญหาทั่วไป

ปัญหา: Certificate ไม่ได้ issued

kubectl logs -n cert-manager deployment/cert-manager

ปัญหามักเกิดจากการ propagation ของ DNS หรือผู้ให้บริการ DNS ของคุณใช้ authoritative nameservers ที่ไม่ถูกต้อง

ปัญหา: Ingress ไม่ได้ routing request

kubectl describe ingress argocd-ingress -n argocd

ปัญหา: WebSocket หรือ gRPC ไม่ทำงาน

เพิ่ม annotations เหล่านี้ลงใน Ingress:

nginx.ingress.kubernetes.io/websocket-services: "argocd-server"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

สรุป

การตั้งค่า Ingress สำหรับ Argo CD Web UI พร้อม SSL บน Cloud VPS นั้นเป็นกระบวนการที่ตรงไปตรงมา แต่ต้องให้ความสำคัญกับรายละเอียดหลายประการ

สำหรับผู้ที่ใช้บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง (https://de.co.th/cloud-vps) คุณจะได้รับประสิทธิภาพสูง เสถียรภาพ และความปลอดภัยของระบบ ทำให้สามารถจัดการ Kubernetes deployment ได้อย่างมีประสิทธิภาพผ่าน Argo CD

ด้วยการตั้งค่า Ingress และ SSL ที่ถูกต้อง คุณจะมี Argo CD Web UI ที่ปลอดภัย สามารถเข้าถึงได้จากที่ใดก็ได้ และพร้อมสำหรับการนำไปใช้จริงในสภาพแวดล้อม production