Linkerd trên Kubernetes: mTLS không cần cấu hình và khả năng quan sát thực sự hiệu quả

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Sự phức tạp tiềm ẩn của hạ tầng mạng Microservices

Quản lý microservices trên Kubernetes thường mang lại cảm giác như đang trong kỳ trăng mật—cho đến khi bạn đưa hệ thống vào môi trường production. Mọi thứ diễn ra suôn sẻ cho đến khi một dịch vụ ngẫu nhiên bắt đầu trả về lỗi 503, hoặc một chuyên gia kiểm định bảo mật yêu cầu xem cách bạn mã hóa lưu lượng truy cập giữa các pod nội bộ. Đột nhiên, bạn nhận ra rằng hạ tầng mạng tiêu chuẩn của Kubernetes hoàn toàn là một “hộp đen”.

Tôi đã thấy hàng chục đội ngũ phải vật lộn để trả lời những câu hỏi cơ bản: Tại sao Service A gặp lỗi? Tại sao độ trễ giữa các dịch vụ đột ngột tăng thêm 200ms? Chúng ta có thực sự đang dùng TLS cho giao tiếp nội bộ không? Theo cách truyền thống, các nhà phát triển cố gắng giải quyết vấn đề này bằng cách đưa logic ghi log và thử lại (retry) vào mã nguồn. Điều này tạo ra một cơn ác mộng về bảo trì. Mỗi ngôn ngữ lập trình lại cần một cách triển khai riêng, dẫn đến hành vi không nhất quán trên toàn bộ cluster.

Kubernetes xử lý việc điều phối container rất tuyệt vời, nhưng nó để lại phần hạ tầng mạng lớp L7 (tầng ứng dụng) và bảo mật hoàn toàn cho bạn tự giải quyết. Mặc dù Istio là lựa chọn phổ biến nhất, nhưng sự phức tạp của nó thường là quá mức cần thiết. Hầu hết các đội ngũ không cần một kỹ sư chuyên trách chỉ để quản lý service mesh. Họ chỉ muốn bảo mật và khả năng hiển thị hoạt động tốt ngay lập tức.

Đây là lúc Linkerd tỏa sáng. Nó là một service mesh “siêu nhẹ” được thiết kế để tối ưu tốc độ và sự đơn giản. Theo kinh nghiệm của tôi, Linkerd mang lại giá trị tức thì mà không cần quá trình học hỏi khó khăn, giúp cluster của bạn ổn định trong khi cung cấp thông tin chi tiết sâu sắc về lưu lượng truy cập.

Tại sao nên chọn Linkerd? Giải pháp thay thế chỉ với 10MB

Linkerd không cố gắng trở thành một con dao đa năng. Thay vào đó, nó tập trung vào ba thứ: sự đơn giản, hiệu năng và bảo mật. Hầu hết các service mesh sử dụng proxy Envoy, vốn mạnh mẽ nhưng tiêu tốn nhiều tài nguyên. Linkerd sử dụng một micro-proxy chuyên dụng được viết bằng Rust. Điều này đảm bảo an toàn bộ nhớ và giữ cho kích thước cực kỳ nhỏ—thường chỉ khoảng 10MB RSS cho mỗi proxy, so với mức 50MB+ thường thấy ở các mesh dựa trên Envoy.

Điểm kỳ diệu thực sự là mTLS (mutual TLS) tự động. Linkerd cung cấp mTLS cho tất cả lưu lượng TCP giữa các pod trong mesh theo mặc định. Bạn không cần phải chạm vào bất kỳ chứng chỉ nào hay quản lý secret. Linkerd xử lý toàn bộ quá trình cấp phát và xoay vòng định danh ở chế độ nền, chỉ thêm chưa đầy 1ms độ trễ p99 vào các yêu cầu của bạn.

Bước 1: Chuẩn bị môi trường

Đầu tiên, bạn cần cài đặt Linkerd CLI trên máy cục bộ. Công cụ này xử lý việc xác thực cluster, cài đặt control plane và tương tác với mesh.

# Cài đặt trên macOS/Linux
curl -sL https://run.linkerd.io/install | sh

# Thêm vào biến PATH của bạn
export PATH=$PATH:$HOME/.linkerd2/bin

# Xác nhận cài đặt thành công
linkerd version

Trước khi cài đặt bất cứ thứ gì lên cluster, hãy chạy lệnh kiểm tra trước (pre-check). Nó sẽ xác minh quyền hạn và khả năng của cluster, giúp bạn tránh được việc phải xử lý lỗi khi cài đặt thất bại sau này.

linkerd check --pre

Bước 2: Cài đặt Control Plane

Linkerd chia quá trình cài đặt thành hai giai đoạn: Custom Resource Definitions (CRDs) và Control Plane cốt lõi. Sự phân tách này giúp quản lý vòng đời của các tài nguyên Kubernetes dễ dàng hơn nhiều.

Bắt đầu bằng cách cài đặt các CRD:

linkerd install --crds | kubectl apply -f -

Tiếp theo, triển khai các thành phần cốt lõi:

linkerd install | kubectl apply -f -

Sau khi các lệnh hoàn tất, hãy đợi các thành phần ổn định. Tôi thích sử dụng CLI hơn Helm cho các thiết lập ban đầu vì phản hồi sẽ chi tiết hơn nhiều nếu có lỗi xảy ra trong môi trường cụ thể của bạn.

linkerd check

Bước 3: Quan sát tức thì với Linkerd-Viz

Việc thiết lập Prometheus và Grafana chỉ để xem tỷ lệ yêu cầu cơ bản là một công việc tốn sức. Linkerd giải quyết vấn đề này bằng extension viz. Nó đi kèm với một instance Prometheus được cấu hình sẵn và một dashboard theo dõi các “Golden Metrics”: Tỷ lệ thành công (Success Rate), Tỷ lệ yêu cầu (Request Rate) và Độ trễ (Latency).

# Cài đặt extension Viz
linkerd viz install | kubectl apply -f -

# Xác minh cài đặt
linkerd viz check

Giờ đây, bạn có thể mở dashboard theo dõi sức khỏe theo thời gian thực cho toàn bộ cluster chỉ với một lệnh:

linkerd viz dashboard &

Bước 4: Đưa ứng dụng vào Mesh và tự động hóa mTLS

Linkerd sử dụng mô hình “sidecar”, chạy một proxy siêu nhỏ song song với ứng dụng của bạn. Nó không tự động can thiệp vào các pod. Để thêm một dịch vụ vào mesh, bạn chỉ cần thêm annotation vào namespace hoặc một deployment cụ thể. Đây là một cách tiếp cận ít rủi ro.

Để inject Linkerd vào một ứng dụng hiện có, hãy sử dụng lệnh sau:

kubectl get -n your-namespace deploy -o yaml | \
  linkerd inject - | \
  kubectl apply -f -

Lệnh linkerd inject thêm một annotation đơn giản: linkerd.io/inject: enabled. Khi Kubernetes tạo pod, admission controller của Linkerd sẽ nhận diện điều này và tự động gắn proxy vào. Từ thời điểm đó, mọi lưu lượng truy cập đến dịch vụ đó đều được mã hóa qua mTLS mà không cần thay đổi mã nguồn.

Bước 5: Xác minh bảo mật và lưu lượng truy cập

Làm thế nào để biết mTLS thực sự hoạt động? Linkerd bao gồm tính năng tap cho phép bạn kiểm tra các header của lưu lượng truy cập trực tiếp. Nó giống như việc sử dụng tcpdump cho các microservices mà không gặp khó khăn.

# Theo dõi lưu lượng thực tế của một deployment
linkerd viz tap deployment/my-service

Để xác nhận các kết nối của bạn đã an toàn, hãy sử dụng lệnh edges. Lệnh này hiển thị trạng thái bảo mật giữa mọi dịch vụ trong namespace của bạn.

linkerd viz -n your-namespace edges deployment

Hãy nhìn vào cột SERVER_ID. Nếu bạn thấy định danh của dịch vụ đích, lưu lượng của bạn đã được mã hóa. Nếu nó trống, lưu lượng vẫn ở dạng văn bản thuần túy (plain text), thường là do đích đến chưa được đưa vào mesh.

Mẹo bảo trì thực tế

Chạy Linkerd trong môi trường production khá đơn giản, nhưng hãy lưu ý ba điều sau:

  • Thiết lập giới hạn tài nguyên (Resource Limits): Proxy này rất nhẹ, nhưng vẫn cần các giới hạn. Tôi thường cấp 0.1 CPU và 64MB RAM làm mức cơ sở. Nó có thể sử dụng nhiều bộ nhớ hơn nếu bạn xử lý hàng nghìn kết nối đồng thời.
  • Tự động hóa việc xoay vòng chứng chỉ: Trust anchor mặc định của Linkerd sẽ hết hạn sau một năm. Đừng để cluster của bạn bị gián đoạn. Hãy sử dụng cert-manager để tự động xoay vòng các chứng chỉ này trước khi chúng hết hạn.
  • Bắt đầu từ quy mô nhỏ: Hãy đưa một namespace staging vào mesh trước. Theo dõi độ trễ—thường sẽ ở mức dưới một mili giây—trước khi triển khai rộng rãi cho môi trường production.

Linkerd chứng minh rằng một service mesh không nhất thiết phải là một gánh nặng. Bằng cách tập trung vào những điều thiết yếu—bảo mật, khả năng hiển thị và độ tin cậy—nó giải quyết các vấn đề mạng phức tạp chỉ với vài lệnh đơn giản. Điều này giúp bạn quay lại tập trung vào việc xây dựng tính năng thay vì phải sửa chữa các vấn đề hạ tầng.

Share: