Cài đặt Linkerd Control Plane
Bước đầu tiên là cài đặt các thành phần điều khiển (Control Plane) của Linkerd vào cluster Kubernetes. Control Plane bao gồm các dịch vụ quản lý như identity, destination, và proxy-injector.
Chúng ta cần tải file cài đặt và chạy lệnh check để đảm bảo cluster đáp ứng yêu cầu trước khi install.
curl -s https://run.linkerd.io/install | sh -
Kết quả mong đợi: File binary `linkerd` được tải về và cài đặt vào thư mục hiện tại hoặc `$PATH`.
Trước khi cài đặt, chạy lệnh kiểm tra môi trường để đảm bảo không có xung đột hoặc thiếu sót về quyền hạn (RBAC) và tài nguyên.
linkerd check --pre
Kết quả mong đợi: Tất cả các dòng kiểm tra đều hiện màu xanh lá cây với thông báo `ok`. Nếu có dòng màu đỏ, cần khắc phục lỗi hiển thị trước khi tiếp tục.
Thực hiện cài đặt Control Plane vào namespace `linkerd`. Lệnh này sẽ tạo các Resource như Deployment, Service, ConfigMap, và CRD cần thiết.
linkerd install | kubectl apply -f -
Kết quả mong đợi: Xuất hiện danh sách các resource được tạo (e.g., `configmap/linkerd-identity-tls`, `deployment.apps/linkerd-destination`, `service/linkerd-identity`).
Sau khi cài đặt xong, kiểm tra lại trạng thái của Control Plane để đảm bảo mọi thành phần đều đang chạy ổn định.
linkerd check
Kết quả mong đợi: Thông báo `control plane components` và `control plane proxies` đều hiển thị `ok`. Đặc biệt, dòng `linkerd-identity` phải ở trạng thái ready.
Kiểm tra trạng thái thành phần trong namespace linkerd
Cần xác minh trực tiếp trên Kubernetes xem các Pod trong namespace `linkerd` đã ở trạng thái `Running` và `Ready` chưa.
kubectl get pods -n linkerd
Kết quả mong đợi: Danh sách các pod như `linkerd-destination`, `linkerd-identity`, `linkerd-proxy-injector`, `linkerd-grafana`, `linkerd-prometheus` đều có trạng thái `1/1` hoặc `2/2` ở cột READY.
Để xem chi tiết hơn về trạng thái của các Deployment, kiểm tra số lượng Replica đang sẵn sàng.
kubectl get deployments -n linkerd
Kết quả mong đợi: Cột `READY` hiển thị giá trị bằng với `DESIRED` (ví dụ: `1/1` hoặc `2/2`) cho tất cả các deployment quan trọng.
Verify thêm bằng cách xem logs của component Identity nếu gặp sự cố về chứng chỉ (thường là nguyên nhân chính khi proxy không inject được).
kubectl logs -n linkerd -l app=linkerd-identity --tail=50
Kết quả mong đợi: Logs hiển thị thông báo khởi động thành công, không có lỗi `panic` hay lỗi kết nối TLS.
Cấu hình Proxy Injector
Proxy Injector là thành phần quan trọng để tự động chèn sidecar container Linkerd vào Pod khi chúng được tạo. Mặc định, Linkerd đã bật tính năng này, nhưng chúng ta cần xác nhận nó đang hoạt động trong namespace `linkerd`.
kubectl get deployment -n linkerd linkerd-proxy-injector
Kết quả mong đợi: Deployment `linkerd-proxy-injector` tồn tại và có trạng thái `1/1` Ready.
Để kích hoạt tự động inject cho một namespace ứng dụng cụ thể, chúng ta cần thêm annotation `linkerd.io/inject: enabled` vào định nghĩa namespace đó.
Tạo file cấu hình namespace ứng dụng (ví dụ: `app-demo`)
cat
Kết quả mong đợi: File `/tmp/namespace-demo.yaml` được tạo thành công với nội dung đúng định dạng YAML.
Áp dụng file cấu hình vào cluster Kubernetes.
kubectl apply -f /tmp/namespace-demo.yaml
Kết quả mong đợi: Namespace `app-demo` được tạo và gắn nhãn (label) tự động inject.
Verify bằng cách kiểm tra label của namespace đã được gắn đúng chưa.
kubectl get namespace app-demo -o jsonpath='{.metadata.labels}'
Kết quả mong đợi: Đầu ra JSON hiển thị key `linkerd.io/inject` có giá trị `enabled`.
Triển khai ứng dụng mẫu và Inject Proxy
Bây giờ chúng ta sẽ triển khai một ứng dụng đơn giản (ví dụ: nginx) vào namespace `app-demo` đã cấu hình ở trên. Linkerd sẽ tự động inject sidecar proxy vào Pod này.
Tạo file định nghĩa Deployment cho ứng dụng mẫu.
cat
Kết quả mong đợi: File `/tmp/nginx-app.yaml` được tạo với cấu hình Deployment chuẩn, chưa có sidecar.
Triển khai ứng dụng vào cluster. Vì namespace đã có label `linkerd.io/inject: enabled`, Linkerd sẽ tự động thêm container proxy vào spec của Pod.
kubectl apply -f /tmp/nginx-app.yaml
Kết quả mong đợi: Deployment `nginx-app` được tạo trong namespace `app-demo`.
Để xác nhận proxy đã được inject thành công, kiểm tra số lượng container trong Pod. Pod phải có 2 container: 1 container ứng dụng (nginx) và 1 container proxy (linkerd-proxy).
kubectl get pods -n app-demo -l app=nginx -o wide
Kết quả mong đợi: Cột `NAME` của Pod có thể thấy tên pod, nhưng quan trọng hơn là khi dùng lệnh `describe` hoặc `get` chi tiết, ta thấy Pod có 2 container đang chạy.
Kiểm tra chi tiết danh sách container trong Pod để xác nhận sự hiện diện của linkerd-proxy.
kubectl get pod -n app-demo -l app=nginx -o jsonpath='{range .items[*].spec.containers[*].name}{"\n"}{.name}{end}'
Kết quả mong đợi: Đầu ra hiển thị 2 dòng, một dòng là `nginx` và một dòng là `linkerd-proxy`.
Verify cuối cùng bằng công cụ CLI của Linkerd để xem trạng thái mesh của ứng dụng này.
linkerd stat deploy -n app-demo
Kết quả mong đợi: Bảng thống kê hiển thị Deployment `nginx-app` với cột `MESHED` (ví dụ `2/2`), cho thấy tất cả các replica đều đã được bao phủ bởi proxy Linkerd.
Để chắc chắn proxy hoạt động và có thể chuyển tiếp lưu lượng, kiểm tra logs của container proxy trong Pod.
kubectl logs -n app-demo -l app=nginx -c linkerd-proxy --tail=20
Kết quả mong đợi: Logs hiển thị thông báo `Linkerd proxy started` và các log về việc thiết lập kết nối (connects), không có lỗi `panic` hay lỗi cấu hình.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Service Mesh trên Kubernetes với Linkerd và eBPF
« Phần 1: Chuẩn bị môi trường và kiến thức nền tảng cho Service Mesh
Phần 3: Cấu hình bảo mật và quản lý lưu lượng với Linkerd »