การเพิ่มประสิทธิภาพการจัดการ 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-prodnginx.ingress.kubernetes.io/ssl-redirect: บังคับให้ redirect HTTP ไปเป็น HTTPSnginx.ingress.kubernetes.io/backend-protocol: ระบุว่า backend (Argo CD) ใช้ HTTPSnginx.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

