0
0
Lập trình
Admin Team
Admin Teamtechmely

Khắc Phục Vấn Đề Khi Sử Dụng Load Balancer Trong Cụm EKS

Đăng vào 1 tháng trước

• 4 phút đọc

Giới thiệu

Trong bài viết trước, mình đã chia sẻ cách xây dựng cụm Amazon EKS cơ bản, với worker node được expose ra internet công khai. Tuy nhiên, lần này, mình sẽ giới thiệu cách triển khai worker node ở chế độ riêng tư (private), nhằm bảo mật hơn, và chỉ expose những dịch vụ cần thiết ra ngoài.

Kubernetes sử dụng Service để expose workloads trong cluster, bao gồm cho các tài nguyên khác hoặc ra internet công khai bằng serviceType: LoadBalancer. Bài viết này tập trung vào việc tìm hiểu về load balancer và những vấn đề có thể gặp phải khi sử dụng nó trong cụm EKS.

Ý tưởng ban đầu

Mình sẽ áp dụng ý tưởng thiết lập cụm từ bài viết trước liên quan đến việc triển khai worker riêng tư. Cụ thể, sẽ có một public subnet cho load balancer và NAT gateway, trong khi worker node sẽ nằm ở private subnet. Điều này giúp chúng ta dễ dàng truy cập từ bên ngoài một cách an toàn.

Các bước triển khai sẽ bao gồm:

  1. Thiết lập cụm EKS (mạng, control plane, worker node group)
  2. Kiểm tra load balancer

Thiết lập cụm EKS

Bạn có thể tìm thấy mã nguồn tại link code aws-eks-example/one. Nếu bạn đã có sẵn mã từ bài trước, chỉ cần chạy lệnh terraform apply là xong.

Các bước cụ thể như sau:

bash Copy
git clone https://github.com/tuana9a/aws-eks-example.git
cd one
terraform init
terraform apply

Sau khi quá trình thiết lập hoàn tất, bạn có thể kiểm tra trên giao diện AWS Console và sử dụng lệnh sau để lấy kubeconfig:

bash Copy
aws eks update-kubeconfig --name one

Kiểm Tra Load Balancer

Theo tài liệu network-load-balancing.html, sẽ có một controller legacy mặc định tạo ra Classic Load Balancers cho bạn. Bạn có thể sử dụng serviceType: LoadBalancer cho dịch vụ của mình. Hãy thử triển khai một nginx deployment và tạo serviceType: LoadBalancer cho nó:

Tạo file test-classic-lb.yaml với nội dung:

yaml Copy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-classic
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-classic
  template:
    metadata:
      labels:
        app: nginx-classic
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-classic
  namespace: default
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: nginx

Sau đó, áp dụng cấu hình:

bash Copy
kubectl apply -f test-classic-lb.yaml

Kiểm tra thông tin của service:

bash Copy
kubectl -n default get svc nginx-classic

Nếu bạn thấy EXTERNAL-IP, có thể sử dụng DNS từ đó để truy cập thông qua trình duyệt hoặc terminal bằng lệnh curl:

bash Copy
curl http://<DNS>

Nếu không thành công, chúng ta cần phải kiểm tra nguyên nhân.

Tìm Nguyên Nhân

Truy cập vào AWS Console, tìm kiếm load balancer trong EC2. Nếu thấy trạng thái 0 of 1 instance in service, có thể do worker instance không nằm trong availability zone mà load balancer đang cấu hình. Theo kiểm tra, load balancer của chúng ta nằm ở ap-southeast-1a, trong khi worker ở ap-southeast-1b. Điều này dẫn đến việc không thể forward traffic.

Để giải quyết vấn đề này, bạn có thể bật tính năng Cross-zone load balancing, tuy nhiên nếu vẫn bị lỗi, cần kiểm tra lại subnet và route table có đúng cấu hình không.

Thử Các Giải Pháp Khác

Kiểm tra tính năng forward traffic giữa các private và public subnets. Hãy đảm bảo rằng route tables được thiết lập đúng cho các subnet và load balancer có thể truy cập vào worker instances.

Nếu vẫn không thành công, cần xem xét lại thiết lập mạng ban đầu và có thể thử tạo lại load balancer hoặc kiểm tra lại cấu hình mạng.

Vấn Đề Khác

Nếu worker node không đủ quyền truy cập đến control plane, tình trạng node sẽ hiển thị như NotReady. Điều này có thể xảy ra nếu không có NAT gateway cho phép traffic từ private subnet ra internet.

Nếu bạn thấy các instance của load balancer không tải được cho các worker nodes, cần kiểm tra lại các subnet có được cấu hình đúng để cho phép public IP cho worker instances.

Kết Luận

Mặc dù chúng ta đã có thể thiết lập và thử nghiệm load balancer, nhưng việc cấu hình mạng đang có vấn đề nghiêm trọng. Trong tương lai, mình sẽ tìm hiểu và đưa ra cách setup hiệu quả hơn cho việc sử dụng dịch vụ này. Hy vọng qua bài viết này, bạn có thể tìm kiếm giải pháp cho vấn đề của mình một cách đơn giản hơn.

source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào