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:
- Thiết lập cụm EKS (mạng, control plane, worker node group)
- 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
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
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
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
kubectl apply -f test-classic-lb.yaml
Kiểm tra thông tin của service:
bash
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
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