Skip to main content

Day 4: Nginx Ingress + NLB + ACM

Day 4 sẽ tập trung vào việc cài Nginx Ingress Controller dùng NLB + ACM, mở đường cho ứng dụng của bạn ra internet, song song với ArgoCD.


Mục tiêu Day 4

  • Cài Nginx Ingress Controller trên EKS bằng Helm.
  • Dùng Network Load Balancer (NLB) + ACM certificate để terminate TLS.
  • Chuẩn bị DNS (Cloudflare) để app truy cập qua https://app.yourdomain.com.

Phần 1: Cài Nginx Ingress Controller với NLB

Bước 1: Thêm repo và update Helm

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

alt text

Bước 2: Cài Nginx với NLB + ACM

Tạo một file nginx-value.yaml với nội dung sau:

controller:
service:
type: LoadBalancer
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

# Thay `YOUR-CERT-ARN` bằng ARN wildcard từ Day 2:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:ap-southeast-1:ACCOUNT_ID:certificate/YOUR-CERT-ARN

service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
targetPorts:
https: http
helm install nginx-ingress ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
-f path/to/nginx-value.yaml

Ý nghĩa chính:

  • Service type LoadBalancer → EKS tạo NLB.
  • Annotation type NLB, scheme internet-facing → NLB public.
  • ssl-cert → gắn ACM certificate.
  • ssl-ports 443 + targetPorts.https=http → TLS terminate tại NLB, NLB gửi HTTP 80 vào Nginx.

alt text

Bước 3: Kiểm tra NLB đã tạo chưa

kubectl get svc -n ingress-nginx

Bạn sẽ thấy service ingress-nginx-controller với một EXTERNAL-IP là DNS của NLB (hoặc <pending> vài phút rồi mới có). alt text

Vào EC2 → Load Balancers → bạn cũng sẽ thấy một Network Load Balancer mới.


Phần 2: Cấu hình DNS cho NLB

Bước 1: Lấy DNS của NLB

Từ kubectl get svc:

kubectl get svc -n ingress-nginx

Copy giá trị EXTERNAL-IP (ví dụ: a1b2c3d4e5f6g7h8.elb.ap-southeast-1.amazonaws.com).

Bước 2: Thêm CNAME trên Cloudflare

Trong Cloudflare DNS:

  • Type: CNAME
  • Name: ví dụ app-aws
  • Target: DNS của NLB vừa copy
  • Proxy: DNS only (tắt cloud cam)
  • Lưu.

Sau này bạn sẽ dùng https://app-aws.yourdomain.com để truy cập app qua Nginx/NLB.


Phần 3: Test Nginx Ingress bằng một app demo

Bước 1: Tạo namespace & deploy app đơn giản

kubectl create namespace demo-app

kubectl create deployment demo --image=nginx -n demo-app
kubectl expose deployment demo --port=80 --target-port=80 -n demo-app

Bước 2: Tạo Ingress cho app qua Nginx

Tạo file demo-app-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-app-ingress
namespace: demo-app
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: app-aws.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo
port:
number: 80

Apply:

kubectl apply -f demo-app-ingress.yaml

Đợi 1–2 phút cho Nginx cập nhật, rồi mở trình duyệt:

https://app-aws.yourdomain.com

Bạn sẽ thấy trang mặc định của Nginx (“Welcome to nginx!”) qua HTTPS (cert ACM). alt text

Đây chính là đường đi của ứng dụng thực, trong bài tiếp theo bạn sẽ thay bằng app Helm + ArgoCD.