ĐƯA ARGOCD PUBLIC RA NGOÀI THÔNG QUA ALB INGRESS
Để triển khai AWS Load Balancer Controller và Ingress cho ArgoCD. Chúng ta sẽ đi theo quy trình “Cài đặt – Kích hoạt”.
Mục tiêu: Truy cập ArgoCD qua đường dẫn Load Balancer (ALB) chuẩn Production.
Cụm Cluster: tony-lab-cluster
Region: ap-southeast-1
GIAI ĐOẠN 1: CHUẨN BỊ MÔI TRƯỜNG (PREREQUISITES)
Bước 0: Đảm bảo rằng bạn đã setup xong wildcard ssl trong Cert Manager

Bạn xem thêm bài hướng dẫn về Cert Manager trong EKS tại đây.
Tại Cert Manager bạn sẽ lấy ARN để chuẩn bị cho phần lab bên dưới.

Bước 1: Kích hoạt OIDC (Cầu nối bảo mật)
eksctl utils associate-iam-oidc-provider --cluster tony-lab-cluster --region ap-southeast-1 --approve
Bước 2: Gắn Tag cho Subnet Public (BẮT BUỘC)
⚠️ Lưu ý: Nếu thiếu bước này, Controller chạy nhưng không tạo được LB.
- Vào AWS Console -> VPC -> Subnets.
- Tìm 3 Subnet Public của Cluster. Ở đây 3 subnet của mình lần lượt là
- eksctl-beobeo-lab-cluster-cluster/SubnetPublicAPSOUTHEAST1A
- eksctl-beobeo-lab-cluster-cluster/SubnetPublicAPSOUTHEAST1B
- eksctl-beobeo-lab-cluster-cluster/SubnetPublicAPSOUTHEAST1C

3. Vào tab Tags, đảm bảo CẢ 3 Subnet đều có tag sau:
- Key:
kubernetes.io/role/elb - Value:
1
Bạn Click chọn Subnet ID của subnet đó > Bấm Action > Manage tags

– Sau đó bạn kiểm tra xem đã có tag kubernetes.io/role/elb với Value: 1 chưa. Nếu chưa có thì bấm và Add New tag và add tag đó vào. Như ở bên dưới mình đã add tag rồi.

Bước 4: Đảm bảo rằng Security group trong EC2 đã được set cho phép port 8080 truy cập từ 0.0.0.0


GIAI ĐOẠN 2: THIẾT LẬP QUYỀN HẠN (IAM & SERVICE ACCOUNT)
Bước 1: Tải Policy Chuẩn Mới Nhất
Bạn mở CMD, chạy lệnh:
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
Bước 2: Tạo IAM Policy:
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy_Final --policy-document file://iam_policy.json

👉 QUAN TRỌNG: Copy dòng
Arntrong kết quả trả về.
(Ví dụ:arn:aws:iam::241688915712:policy/AWSLoadBalancerControllerIAMPolicy_Final)
Bước 3: Tạo Service Account (Kết nối vào K8s)
Thay ARN_POLICY_CUA_BAN bằng chuỗi ARN vừa copy ở trên.
eksctl create iamserviceaccount ^
--cluster=beobeo-lab-cluster ^
--namespace=kube-system ^
--name=aws-load-balancer-controller ^
--role-name AmazonEKSLoadBalancerControllerRole_Final ^
--attach-policy-arn=arn:aws:iam::474891441152:policy/AWSLoadBalancerControllerIAMPolicy_Final ^
--region=ap-southeast-1 ^
--override-existing-serviceaccounts ^
--approve
(Lưu ý: Thay số 474891441152 trong ARN bằng số Account ID của bạn mà bạn vừa lấy ở lệnh trên). Với tài khoản của tôi ID là 474891441152.

GIAI ĐOẠN 3: CÀI ĐẶT CONTROLLER (HELM)
Bước 1: Để chuẩn bị cho bước này ta phải cài helm cho windows trước:
– Download helm tại link này sau đó giải nén và đưa helm vào c:tool

Bước 2: Thêm kho chứa (Repo) và cài đặt Controller bằng HELM:
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller ^
-n kube-system ^
--set clusterName=beobeo-lab-cluster ^
--set serviceAccount.create=false ^
--set serviceAccount.name=aws-load-balancer-controller

Bước 3. Kiểm tra xem nó sống chưa:
kubectl get deployment -n kube-system aws-load-balancer-controller
(Nếu thấy READY 2/2 là ngon). Nếu 0/2 thì dừng lại kiểm tra log.

GIAI ĐOẠN 4: KÍCH HOẠT INGRESS (DEPLOY)
Bước 1: Tạo file argocd-ingress.yaml
Nội dung chuẩn (Layer 7, HTTP 80 -> Backend HTTPS 443):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-ingress
namespace: argocd
annotations:
# 1. Controller Designation
# Specifies that this Ingress is managed by the AWS Load Balancer Controller.
kubernetes.io/ingress.class: alb
# 2. Network Scheme
# 'internet-facing': Creates a public Load Balancer accessible from the internet.
# 'internal': Creates a private Load Balancer (internal VPC only).
alb.ingress.kubernetes.io/scheme: internet-facing
# 3. Target Type
# 'ip': Routes traffic directly to the Pod IP (High Performance & Faster).
# 'instance': Routes traffic to NodePort (Legacy mode).
alb.ingress.kubernetes.io/target-type: ip
# --- SSL/HTTPS CONFIGURATION ---
# 4. ACM Certificate
# ACTION REQUIRED: Replace the ARN below with your actual Certificate ARN from AWS ACM.
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:474891441152:certificate/6aac9ac0-cea3-452d-a467-6ce6809969d3
# 5. Listen Ports
# Configures the Load Balancer to listen on both HTTP (80) and HTTPS (443).
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
# 6. SSL Redirection
# Automatically redirects all HTTP traffic to HTTPS for security.
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
# --- BACKEND PROTOCOL (CRITICAL FOR ARGOCD) ---
# 7. Backend Protocol
# We use 'HTTP' here because we have disabled internal HTTPS on the ArgoCD Pod
# (using the --insecure flag) to avoid "Login Loop" issues and simplify SSL termination.
alb.ingress.kubernetes.io/backend-protocol: HTTPS
# 8. Health Check Settings
# Since the backend speaks HTTP, the health check must also use HTTP.
alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
# ArgoCD exposes a specific health check endpoint at /healthz.
alb.ingress.kubernetes.io/healthcheck-path: /healthz
# Codes considered "Healthy" by the Load Balancer.
alb.ingress.kubernetes.io/success-codes: '200'
spec:
# Standard Ingress Class definition
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
# This must match the HTTP port exposed by the argocd-server Service.
number: 80
1. Tại sao dùng target-type: ip?
- Cũ (Instance mode): Load Balancer gửi gói tin đến cửa máy chủ (NodePort) -> tìm Pod ->
kube-proxychuyển tiếp. (Tốn thêm 1 bước nhảy, tăng độ trễ). - Mới (IP mode): Load Balancer gửi gói tin thẳng vào Pod. (Nhanh hơn, hiệu năng cao hơn).
2. Tại sao backend-protocol là HTTP?
Đây là mô hình SSL Termination (Mã hóa đầu ngoài, giải mã đầu trong):
- Client -> ALB (HTTPS): An toàn trên Internet.
- ALB -> Pod (HTTP): Đi trong mạng nội bộ VPC. Giảm tải CPU cho Pod, tránh lỗi Login Loop của ArgoCD.
3. Điều kiện tiên quyết (Prerequisites)
Để file này chạy được, học viên phải đảm bảo:
- Đã có AWS Load Balancer Controller chạy trong cụm.
- Đã có Certificate trong AWS ACM và copy đúng ARN.
- Đã chuyển ArgoCD sang chế độ Insecure (thêm cờ
--insecurevào deployment).
Sau khi lưu xong ta nhìn vào c:tool sẽ thấy file argocd-ingress.yaml

Bước 2: Apply – tại CMD đứng trên C:tool Chạy lệnh triển khai:
kubectl apply -f argocd-ingress.yaml

Bước 3: Restart Controller (Mẹo nhỏ để ăn ngay)
💡 Đôi khi Controller cần “vỗ nhẹ” để nhận diện Ingress mới.
kubectl delete pod -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller
GIAI ĐOẠN 5: NGHIỆM THU (VERIFICATION)
Chờ khoảng 2-3 phút, chạy lệnh:
kubectl get ingress -n argocd

Cấu hình Cloudflare (Final Step)
Để public App bằng domain, ta add CNAME trong Cloudflare như sau:
- Name: subdomain của bạn.
- Target: Chính là ADDRESS bạn lấy được từ câu lệnh
kubectl get ingress. - Sau đó nhấn Save và test lại.

Truy cập vào link: argocd-aws.diendo.pro.vn
