Trong bài viết này ta sẽ tìm hiểu khái niệm cơ bản về Ingress, Ingress resource object và các khái niệm liên quan đến Ingress Controller.
Kubernetes Ingress là một resrouce dùng để thêm các rule để route traffic từ bên ngoài vào ứng dụng chạy trong cụm Kubernetes.
Ingress là gì?
The literal meaning: Ingress refers to the act of entering. Ingress nghĩa đen có nghĩa là truy cập vào đâu đó.
Trong ngữ cảnh của Kubernetes, Ingress cũng có nghĩa là traffic truy cập vào cụm và egress là traffic đi ra khỏi cụm.
Ingress là một native resource giống như pod, deployment, ... Sử dụng Ingress ta có thể lưu cấu hình DNS routing. Ingress controller chịu trách nhiệm routing bằng cách đọc các routing rule từ ingress object được lưu trong etcd.
Nếu không có Ingress, để expose một ứng dụng ra bên ngoài, bạn cần thêm một service loại LoadBalancer cho deployment.
Trong khi đó với Ingress, sẽ có một reverse proxy layer giữa load balancer và Kubernetes service endpoint.
Trong phần sau ta sẽ nói rõ hơn về kiến trúc chi tiết của Ingress.
Trước khi có Ingress?
Trước khi Ingress ổn định như hiện nay, môt Nginx deployment tùy chỉnh hoặc một HAproxy deployment sẽ expose như một LoadBalancer để routing các traffic bên ngoài vào các service nội bộ trong cụm.
Các routing rule được thêm vào như một ConfigMap trong HAproxy/Nginx pod. Khi nào có thay đổi về DNS hoặc một route mới được thêm vào, ta sẽ cập nhật ConfigMap và pod sẽ được load lại hoặc deploy lại.
Kubernetes Ingress cũng hoạt động tương tự như vậy, nó có các routing rule được lưu như một native ingress object thay vì là một ConfigMap.
Ingress Controller có thể xem như một phiên bản tùy chỉnh của Nginx/HAproxy, ... có nhiệm vụ fetch các routing rule một cách linh hoạt.
Ingress hoạt động như thế nào?
Nếu bạn mới tìm hiểu và đang cố gắng hiểu về Ingress, việc hiểu cách nó hoạt động có thể sẽ khá vất vả.
Ví dụ bạn có thể tạo một Ingress rule nhưng việc làm sao để map nó tới môt domain name hoặc route traffic bên ngoài tới deployment nội bộ như thế nào thì lại chưa biết làm thế nào.
Bạn cần phải hiểu rõ hai khái niệm sau:
Kubernetes Ingress Resource: Kubernetes Ingress resource chịu trách nhiệm lưu DNS routing rule trong cụm.
Kubernetes Ingress Controller: Kubernetes Ingress controller chịu trách nhiệm routing bằng cách truy cập DNS rule được triển khai thông qua Ingress resource.
Giờ ta sẽ tìm hiểu về Ingress Resource và Ingress Controller chi tiết hơn nhé.
Kubernetes Ingress Resource
Kubernetes Ingress resource là một native resource nơi bạn chỉ định các DNS routing rule.
Nó yêu cầu một Ingress Controller để routing các rule đã định nghĩa trong Ingress object.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.com
http:
paths:
- backend:
serviceName: hello-service
servicePort: 80
Manifest trên chỉ định rằng các traffic tới test.apps.example.com
sẽ cần route về service hello-service
trong dev
namespace.
Như bạn có thể thấy, Ingress resource chỉ chứa các routing rule. Bạn có thể thêm các endpoint cho path-based routing, cấu hình TLS, ...
Ingress object yêu cầu một Ingress Controller để route traffic.
Quan trọng nhất, traffic bên ngoài không được route tới Ingress API mà thay vào đó nó được route tới Ingress Controller endpoint đã được cấu hình trực tiếp với một load balancer.
Giờ hãy nói về Ingress Controller.
Kubernetes Ingress Controller
Ingress Controller không phải một native Kubernetes object. Điều này có nghĩa là nó sẽ không tồn tại mặc định trong cụm Kubernetes.
Để các Ingress rule có thể hoạt động ta cần tạo một Ingress Controller. Có rất nhiều ingress controller mã nguồn mở và enterprise khả dụng cho bạn lựa chọn.
Ingress controller là một reverse web proxy server trong cụm. Trong ngữ cảnh của Kubernetes, nó là một reverse proxy server được triển khai như một deployment expose tới một Load Balancer.
Bạn có thể có nhiều Ingress Controller trong môt cụm map tới nhiều Load Balancer khác nhau. Mỗi Ingress Controller cần có một ingress-class trong annotation.
Ingress Controller hoạt động như thế nào?
Nginx là một Ingress Controller được sử dụng phổ biến. Ta sẽ nói về ví dụ Nginx Ingress Controller nhé:
nginx.conf
trong Nginx controller pod là môt lua template có thể giao tiếp với Kubernetes Ingress API và lấy các giá trị để route traffic thời gian thực.Nginx controller giao tiếp với Ingress API để kiểm tra các rule được tạo để route traffic.
Nếu nó tìm thấy các rule, Nginx controller tạo môt cấu hình trong
/etc/nginx/conf.d
trong các pod nginx.Với mỗi Ingress resource, Nginx tạo một cấu hình trong
/etc/nginx/conf.d
/etc/nginx/nginx.conf
lưu toàn bộ cấu hình từ/etc/nginx/conf.d
Nếu bạn cập nhật Ingress Object với cấu hình mới, Nginx sẽ cập nhật và reload cấu hình.
Nếu bạn kết nối tới Nginx Ingress Controller qua exec
và kiểm tra /etc/nginx/nginx.conf
bạn có thể thấy mọi rule được định nghĩa trong Ingress Object đã được triển khai tới file conf.
Kiến trúc của Ingress & Ingress Controller
Đây là sơ đồ kiến trúc của Ingress và Ingress controller trên một cụm Kubernetes.
Ingress rule route traffic tới ứng dụng payment
và auth
.
Giờ nếu bạn nhìn vào kiến trúc, bạn có thể thấy dễ hiểu hơn về cách hoạt động của Ingress.
Danh sách các Kubernetes Ingress Controller
Đây là danh sách các ingress controller thường dùng khả dụng trong Kubernetes:
Nginx Ingress Controller (Community & From Nginx Inc)
Kết luận
Trong bài viết này ta đã học về cách Ingress họat động trong Kubernetes và các thành phần liên quan của nó. Việc chọn lựa Ingress controller cho production tùy thuộc vào rất nhiều các yêu cầu khác nhau.