Bỏ qua

09.kube proxy

1. Bài toán: Giao tiếp giữa các Pod và sự "kỳ diệu" của Service

Trong một cụm Kubernetes, các Pod có thể giao tiếp với nhau. Tuy nhiên, địa chỉ IP của Pod không ổn định, chúng có thể thay đổi khi Pod được tạo lại. Vì vậy, chúng ta không nên để một Pod gọi trực tiếp đến IP của Pod khác.

👉 Giải pháp là dùng Service. Service cung cấp một "địa chỉ" ổn định (dưới dạng tên hoặc một địa chỉ IP ảo gọi là ClusterIP) để các Pod khác có thể tìm đến.

Câu hỏi đặt ra: Service chỉ là một đối tượng "ảo" trong bộ nhớ của Kubernetes, nó không phải là một Pod hay container thực sự. Vậy làm thế nào mà traffic có thể được gửi đến một địa chỉ IP "ảo" và đến được đúng Pod thật?


2. kube-proxy - "Ảo thuật gia" Mạng của Kubernetes 🎩✨

kube-proxy chính là câu trả lời! Nó là "nhà ảo thuật" biến các Service "ảo" trở nên "thật".

  • kube-proxy là gì? Nó là một tiến trình (process) chạy trên MỖI NODE trong cụm Kubernetes (cả master và worker).
  • Nhiệm vụ của nó là gì?
  • Nó liên tục theo dõi kube-api-server để xem có Service nào mới được tạo, sửa, hay xóa không.
  • Mỗi khi có một Service mới, kube-proxy sẽ tạo ra các quy tắc mạng (network rules) trên chính cái Node mà nó đang chạy.

3. "Màn ảo thuật" hoạt động như thế nào?

  • Một trong những cách kube-proxy thực hiện điều này là sử dụng iptables (một công cụ tường lửa/định tuyến rất phổ biến trên Linux).
  • Ví dụ:
  • Bạn tạo một Service tên db-service với IP ảo là 10.96.0.12.
  • Service này trỏ đến một Pod database có IP thật là 10.32.0.15.
  • kube-proxy trên mỗi node sẽ tạo một rule iptables có nội dung đại loại như: "Này hệ điều hành, nếu có bất kỳ gói tin nào gửi đến địa chỉ 10.96.0.12, hãy chuyển hướng (redirect) nó đến địa chỉ 10.32.0.15 nhé!"
  • Nhờ vậy, từ bất kỳ node nào trong cụm, khi một Pod khác gửi request đến IP của db-service, request đó sẽ được chuyển hướng một cách kỳ diệu đến đúng Pod database thật sự.

4. Cách kube-proxy được triển khai

  • "Thủ công" (From Scratch): Bạn tải file binary của kube-proxy và chạy nó như một service.
  • Dùng kubeadm: kubeadm sẽ triển khai kube-proxy dưới dạng các Pod trên mỗi node.
  • Cụ thể hơn, nó được triển khai bằng một đối tượng Kubernetes gọi là DaemonSet.
  • DaemonSet đảm bảo rằng một bản sao của Pod (trong trường hợp này là Pod kube-proxy) sẽ luôn chạy trên mỗi node của cụm. Đây là cách hoàn hảo để triển khai các agent cần có mặt ở khắp mọi nơi như kube-proxy.

5. "Chốt hạ" cho Kỳ thi CKA 📝

  • kube-proxy chạy trên mỗi node trong cụm.
  • Nhiệm vụ chính của nó là hiện thực hóa cơ chế của Kubernetes Service.
  • Nó làm điều này bằng cách theo dõi API Server và tạo ra các quy tắc mạng (ví dụ: iptables) trên node để định tuyến traffic từ IP ảo của Service đến IP thật của các Pod.
  • Trong một cụm kubeadm, kube-proxy được triển khai như một DaemonSet.

Bình luận