Cài đặt Helm và Thêm Repository Istio
Bước đầu tiên là đảm bảo Kubernetes cluster đã sẵn sàng và cài đặt quản lý package Helm để triển khai các ứng dụng phức tạp như Istio.
Cài đặt Helm v3.x là chuẩn mực hiện tại để deploy các manifest YAML qua chart.
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash -s --
Command này sẽ tải script cài đặt từ GitHub, thực thi và cài đặt binary `helm` vào `/usr/local/bin/helm`.
Thêm repository chính thức của Istio để Helm có thể truy cập các chart cấu hình.
helm repo add istio https://istio.io/latest helm repo update
Kết quả mong đợi: Output hiển thị "istio has been added to your repositories" và các version chart được cập nhật.
Verify việc cài đặt bằng cách kiểm tra version của Helm.
helm version --short
Kết quả mong đợi: Hiển thị version number (ví dụ: v3.13.x).
Triển khai Istio Base và Istiod (Control Plane)
Phần này cài đặt các namespace cơ bản và control plane (Istiod) để quản lý toàn bộ mesh.
Tạo namespace `istio-system` để chứa tất cả các component của Istio.
kubectl create namespace istio-system
Kết quả mong đợi: Namespace được tạo thành công (namespace/istio-system created).
Deploy base components bao gồm CRDs (Custom Resource Definitions) cần thiết cho Envoy và Istio.
helm install istio-base istio/base -n istio-system
Kết quả mong đợi: Helm báo "Release 'istio-base' has been installed". Các CRD như VirtualService, DestinationRule sẽ xuất hiện trong cluster.
Deploy Istiod (Istio Daemon) với profile `default` để cân bằng giữa tính năng và hiệu năng.
helm install istiod istio/istiod -n istio-system --set profile=default
Kết quả mong đợi: Istiod pod được tạo trong namespace `istio-system` và chuyển sang trạng thái `Running`.
Verify việc cài đặt bằng cách kiểm tra trạng thái của các pod trong namespace istio-system.
kubectl get pods -n istio-system
Kết quả mong đợi: Bạn sẽ thấy ít nhất một pod có tên chứa `istiod` ở trạng thái `Running`.
Cấu hình Profile: Default vs Demo
Hiểu rõ sự khác biệt giữa hai profile phổ biến để chọn cấu hình phù hợp cho môi trường sản xuất hoặc phát triển.
Profile `default` được thiết kế cho môi trường production, bật mTLS bằng Default PeerAuthentication nhưng không tự động inject sidecar cho tất cả namespace.
helm show values istio/istiod | grep -A 10 "profile: default"
Kết quả mong đợi: Hiển thị các giá trị cấu hình mặc định, bao gồm việc bật mTLS và cấu hình logging.
Profile `demo` được thiết kế cho môi trường phát triển/testing, tự động inject sidecar cho mọi namespace và bật mTLS ở mức độ cao hơn.
helm install istiod-demo istio/istiod -n istio-system --set profile=demo --wait
Lưu ý: Command này là ví dụ. Trong thực tế, chỉ nên chọn một profile duy nhất cho cluster. Nếu đã cài `default`, hãy uninstall trước khi cài `demo`.
Để chuyển đổi hoặc cấu hình tùy chỉnh, sử dụng file YAML config riêng thay vì profile có sẵn.
Tạo file cấu hình tùy chỉnh tại đường dẫn `/tmp/istio-custom.yaml` với nội dung sau để cân bằng an toàn và hiệu năng cho Database Mesh.
cat > /tmp/istio-custom.yaml
Kết quả mong đợi: File YAML được tạo thành công với cấu hình giới hạn tài nguyên cho sidecar proxy và chế độ mTLS PERMISSIVE (chấp nhận cả traffic không mã hóa để debug).
Áp dụng cấu hình tùy chỉnh này khi cài đặt lại Istiod.
helm upgrade istiod istio/istiod -n istio-system -f /tmp/istio-custom.yaml --wait
Kết quả mong đợi: Istiod sẽ restart và áp dụng các cấu hình mới. Kiểm tra lại pod để đảm bảo không có lỗi.
Cài đặt Ingress Gateway và Egress Gateway
Deploy các Gateway để kiểm soát luồng traffic đi vào và đi ra khỏi Service Mesh.
Tạo file cấu hình cho Ingress Gateway tại `/tmp/istio-ingress.yaml` để expose traffic từ bên ngoài vào cluster.
cat > /tmp/istio-ingress.yaml
Kết quả mong đợi: File YAML chứa định nghĩa Namespace, Gateway và VirtualService được tạo.
Deploy Ingress Gateway vào namespace riêng biệt `istio-ingress` để tách biệt logic gateway với control plane.
helm install istio-ingress istio/gateway -n istio-ingress --set gatewayClassName=istio --set service.type=LoadBalancer --wait
Kết quả mong đợi: Pod `istio-ingressgateway` được tạo và trạng thái `Running`. Service type LoadBalancer sẽ cấp một External IP.
Deploy Egress Gateway để kiểm soát traffic đi từ trong mesh ra internet hoặc các service bên ngoài không nằm trong mesh.
helm install istio-egress istio/gateway -n istio-egress --set gatewayClassName=istio --set service.type=ClusterIP --set egressListener=true --wait
Kết quả mong đợi: Pod `istio-egressgateway` được tạo trong namespace `istio-egress`.
Verify toàn bộ thành phần Gateway bằng cách liệt kê tất cả các pod liên quan đến Istio.
kubectl get pods -A | grep istio
Kết quả mong đợi: Danh sách hiển thị các pod: `istiod` (control plane), `istio-ingressgateway` (inbound), `istio-egressgateway` (outbound) đều ở trạng thái `Running`.
Verify External IP của Ingress Gateway để chuẩn bị cho phần cấu hình traffic sau.
kubectl get svc -n istio-ingress istio-ingressgateway
Kết quả mong đợi: Hiển thị IP address ở cột `EXTERNAL-IP` (ví dụ: 192.168.x.x hoặc public IP tùy cloud provider).
Điều hướng series:
Mục lục: Series: Triển khai Database Mesh với Envoy và Istio trên Ubuntu 24.04
« Phần 2: Triển khai Kubernetes Cluster và cấu hình mạng cơ bản
Phần 4: Triển khai Database Mesh với PostgreSQL và Envoy Proxy »