Ingress là gì, Ingress resource khác gì với Service type là LoadBalancer?
Trong kubernetes, Ingress là một loại resource cho phép client truy cập vào Service resource từ bên ngoài cụm. Nghe qua thì tương đối giống với Service có type là LoadBalacner (đã tìm hiểu rõ ở phần Service Network), rõ hơn chúng ta sẽ có ví dụ sau: triển khai 02 ứng dụng worker
và api
như diagram dưới đây:
Nếu expose 02 ứng dụng worker application
và api application
ra ngoài cho client có thể truy cập được, thì cần phải triển khai 02 Service type LoadBalancer cho mỗi ứng dụng đó.
Cách này có thể chấp nhận được, tuy nhiên trên môi trường Cloud thì cần phải ít nhất 02 public IP cho mỗi LoadBalancer Service ở trên. Chưa kể đến việc chúng ta chỉ cần duy nhất một public IP cấu hình DNS server cho cả hệ thống, thì việc cần 02 public IP sẽ tốn thêm tiền cho dịch vụ Cloud.
Vì vậy Ingress resource đã được tạo ra để giải quyết vấn đề này
Thay vì phải cần đến 02 Service type LoadBalancer (tốn đến 02 public IP) thì chúng ta chỉ có 01 resource duy nhất là Ingress (có duy nhất 01 public IP).
Ingress sẽ làm nhiệm vụ routing kết hợp với cân bằng tải giúp cho các request từ client đến các Service bên trong cụm, ngoài ra đối với Ingress còn có rất nhiều các tính năng khác như cấu hình domain, cấu hình TLS, authentication,…
Ingress resource sẽ cần phải kết hợp với Service resource có type là NodePort
, flow của Ingress sẽ như ví dụ dưới đây:
# Deployment
...
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
...# Service
...
kind: Service
metadata:
name: my-service
labels:
app: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 9376
...#Ingress
...
spec:
rules:
- host: a.domain.com
http:
paths:
- backend:
serviceName: my-service
servicePort: 80
...
Nguyên lý hoạt động của Ingress
Thực chất Ingress resource mà chúng ta khai báo trong kubernetes chỉ là một tệp config được khai báo, tệp config này sau đó sẽ được apply vào Ingress Controller mà chúng ta sử dụng!
Kubernetes hỗ trợ Ingress Controller dưới dạng một interface mà chúng ta có thể dynamic thay đổi nó với Ingress Controller Provider phù hợp, ví dụ như:
- Kubernetes Ingress — mặc định của Kubernetes, lõi của con này sử dụng Nginx.
- NGINX Ingress — được phát triển bởi Nginx, dựa trên NGINX Plus.
- Kong Ingress — được phát triển bởi Kong, nổi tiếng với Kong API Gateway.
- Istio Ingress — được biết đến nhiều hơn với giải pháp Service Mesh, dựa trên Envoy.
- Ambassador — tương tự như Istio, cũng dựa trên Envoy.
- HAProxy Ingress — HAProxy thì được biết đến nhiều hơn là một proxy server và load balancer, tuy nhiên cũng có một dự án làm Ingress Controller cho Kubernetes.
- Traefik Ingress — là giải pháp Ingress Controller được phát triển bởi Traefik.
- …
Đối với mỗi một Ingress Controller Provider khác nhau thì có những tính năng, hỗ trợ khác nhau tuỳ theo nhu cầu sử dụng. Để cân nhắc hơn các lựa chọn sử dụng Ingress Controller cho một dự án, xem so sánh của chúng tại đây: https://blog.flant.com/comparing-ingress-controllers-for-kubernetes.
Ingress Tutorial
- Xem hướng dẫn cấu hình NGINX Ingress với Cert Manager (sử dụng Let’s Encrypt) trong Kubernetes ở đây.
- Demonstration triển khai Kubernetes Ingress với Nginx ở đây.