Triển khai OpenFaaS vào Kubernetes bằng Helm
Bước đầu tiên là thêm repository Helm chính thức của OpenFaaS để truy cập các chart mới nhất.
Thao tác này giúp client Helm của bạn biết nơi tải các file cấu hình deployment.
helm repo add openfaas https://openfaas.github.io/chart/
helm repo update
Kết quả: Output hiển thị "Hang tight..." và sau đó là "Updated repo 'openfaas'".
Tiếp theo, tạo namespace riêng để cô lập các component của OpenFaaS khỏi các workload khác trong cluster.
Việc này giúp quản lý tài nguyên và policy RBAC dễ dàng hơn, tránh xung đột với các service khác.
kubectl create namespace openfaas
Đợi vài giây, hệ thống trả về thông báo "namespace/openfaas created".
Triển khai OpenFaaS Gateway, Function Controller và các service phụ trợ vào cluster.
Chart này sẽ deploy tất cả các Pod cần thiết, bao gồm cả Nginx Ingress controller mặc định nếu không có sẵn.
helm install openfaas openfaas/openfaas --namespace openfaas --create-namespace --set basic_auth_enabled=false
Tham số basic_auth_enabled=false tạm thời tắt xác thực để bạn có thể test gateway ngay lập tức.
Quan sát trạng thái Pod sau khi deploy xong.
kubectl get pods -n openfaas
Kết quả mong đợi: Tất cả Pod (faas-netes, faas-gateway, gateway-nats) đều có trạng thái Running và READY là 1/1.
Cấu hình OpenFaaS Gateway và Ingress Controller
OpenFaaS Gateway cần một Ingress Controller để phân giải tên miền và xử lý traffic HTTP từ bên ngoài vào cluster.
Trong phần này, ta sẽ cấu hình Nginx Ingress Controller để map domain vào service gateway.
Đầu tiên, xác minh xem cluster đã có Ingress Controller chưa. Nếu chưa, ta cần deploy một cái mới.
kubectl get ingress -n openfaas
Nếu output trả về "No resources found", ta cần thêm repo và deploy Nginx Ingress.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx/
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace openfaas --create-namespace
Kiểm tra lại Pod của Ingress Controller.
kubectl get pods -n openfaas | grep ingress
Kết quả mong đợi: Có ít nhất 1 Pod của ingress-nginx-controller đang ở trạng thái Running.
Tạo file cấu hình Ingress để map tên miền openfaas.local vào service gateway.
File này sẽ được lưu tại đường dẫn /etc/openfaas/ingress.yaml trên máy chủ của bạn.
cat > /etc/openfaas/ingress.yaml
Áp dụng file cấu hình này vào Kubernetes cluster.
kubectl apply -f /etc/openfaas/ingress.yaml
Kiểm tra trạng thái của Ingress đã được tạo chưa.
kubectl get ingress -n openfaas
Kết quả mong đợi: Cột ADDRESS hiển thị IP của Node (hoặc LoadBalancer) và HOSTS hiển thị openfaas.local.
Cấu hình file /etc/hosts trên máy client để resolve tên openfaas.local về IP của Node.
Thay thế <NODE_IP> bằng IP thật của Node bạn vừa lấy được từ lệnh kubectl get nodes -o wide.
echo "<NODE_IP> openfaas.local" | sudo tee -a /etc/hosts
Test truy cập vào Gateway bằng curl.
curl -v http://openfaas.local:8080/function-status
Kết quả mong đợi: HTTP Status 200 và nội dung JSON trả về danh sách các function hiện có (dù là mảng rỗng).
Cấu hình Authentication và Quản lý Secrets
Bây giờ ta cần bật tính năng Basic Auth để bảo vệ API Gateway, ngăn chặn truy cập trái phép.
OpenFaaS sử dụng cơ chế xác thực dựa trên token, nhưng để đơn giản trong bước này ta dùng Basic Auth.
Tạo file cấu hình values.yaml để bật xác thực và chỉ định nơi chứa secret.
File này sẽ được lưu tại /etc/openfaas/values-auth.yaml.
cat > /etc/openfaas/values-auth.yaml
Đổi lại (upgrade) release Helm đã có sẵn với file cấu hình mới.
helm upgrade openfaas openfaas/openfaas --namespace openfaas -f /etc/openfaas/values-auth.yaml
Đợi khoảng 1-2 phút để Pod gateway và function-controller khởi động lại với cấu hình mới.
kubectl rollout status deployment/faas-gateway -n openfaas
Kiểm tra xem gateway có yêu cầu xác thực không.
curl -v http://openfaas.local:8080/function-status
Kết quả mong đợi: HTTP Status 401 Unauthorized và header WWW-Authenticate xuất hiện.
Thử truy cập lại với thông tin đăng nhập đúng.
curl -u admin:password123 http://openfaas.local:8080/function-status
Kết quả mong đợi: HTTP Status 200 OK và nội dung JSON trả về bình thường.
Để quản lý secret an toàn hơn trong production, ta nên tạo Secret object trực tiếp trong Kubernetes thay vì hardcode trong values.yaml.
Tạo Secret từ stdin để tránh lộ thông tin nhạy cảm trên lịch sử terminal.
kubectl create secret generic basic-auth-user --from-literal=username=admin -n openfaas
kubectl create secret generic basic-auth-password --from-literal=password=password123 -n openfaas
Update lại Helm release để mount các secret này vào container.
helm upgrade openfaas openfaas/openfaas --namespace openfaas --set basic_auth_enabled=true --set secret_mount_path=/var/openfaas/secrets --set secrets.basics.auth.user_secret=basic-auth-user --set secrets.basics.auth.pass_secret=basic-auth-password
Verify lại bằng cách curl không có user/pass (phải fail) và có user/pass (phải success).
curl -v http://openfaas.local:8080/function-status 2>&1 | grep "401"
curl -u admin:password123 http://openfaas.local:8080/function-status
Kết quả: Lệnh đầu tiên trả về 401, lệnh thứ hai trả về 200 và JSON function list.
Triển khai Function mẫu bằng Dockerfile
Bước cuối cùng là xây dựng và deploy một function đầu tiên để kiểm tra toàn bộ pipeline.
Chúng ta sẽ tạo một function đơn giản bằng Node.js trả về một chuỗi chào mừng.
Tạo thư mục dự án và file Dockerfile.
File Dockerfile sẽ được lưu tại /opt/functions/hello-world/Dockerfile.
mkdir -p /opt/functions/hello-world
cd /opt/functions/hello-world
cat > Dockerfile
Tạo file logic index.js cho function.
cat > index.js
Xây dựng Docker image và đẩy lên registry (hoặc lưu local nếu dùng minikube/kind).
Thay <REGISTRY_URL> bằng địa chỉ registry thực tế của bạn, hoặc dùng localhost:5000 nếu đang chạy local registry.
docker build -t <REGISTRY_URL>/hello-world:latest .
docker push <REGISTRY_URL>/hello-world:latest
Sử dụng CLI của OpenFaaS (faas-cli) để deploy function vào cluster.
Cần đảm bảo bạn đã cài đặt faas-cli và cấu hình ~/.faasrc trỏ về http://openfaas.local:8080.
faas-cli login -g http://openfaas.local:8080 -u admin -p password123
faas-cli deploy -f /opt/functions/hello-world/Dockerfile -n hello-world
Kiểm tra xem function đã được tạo trong cluster chưa.
kubectl get pods -n openfaas | grep hello-world
Kết quả mong đợi: Xuất hiện Pod mới có tên chứa hello-world đang ở trạng thái Running.
Test function bằng cách gọi trực tiếp qua gateway.
curl -u admin:password123 http://openfaas.local:8080/function/hello-world
Kết quả mong đợi: JSON trả về chứa message là "Hello from OpenFaaS on Kubernetes!" và timestamp hiện tại.
Verify danh sách function trong cluster.
curl -u admin:password123 http://openfaas.local:8080/function-status
Kết quả mong đợi: JSON trả về có mảng functions chứa ít nhất 1 entry với tên hello-world và trạng thái running.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Serverless và Edge Computing an toàn với OpenFaaS, Cloudflare Workers và Wasm trên hạ tầng Kubernetes
« Phần 2: Triển khai và cấu hình Kubernetes Cluster làm nền tảng
Phần 4: Xây dựng và triển khai Cloudflare Workers trên Edge »