Thứ hai, 23/07/2018 | 00:00 GMT+7

Kubernetes Networking Under the Hood

Kubernetes là một hệ thống điều phối containers mạnh mẽ có thể quản lý việc triển khai và vận hành các ứng dụng được chứa trong các cụm server . Ngoài việc điều phối dung lượng công việc containers , Kubernetes cung cấp cơ sở hạ tầng và công cụ cần thiết để duy trì kết nối mạng tin cậy giữa các ứng dụng và dịch vụ của bạn.

Tài liệu về mạng cụm Kubernetes nói rằng các yêu cầu cơ bản của mạng Kubernetes là:

  • tất cả các containers có thể giao tiếp với tất cả các containers khác mà không cần NAT
  • tất cả các node có thể giao tiếp với tất cả các containers (và ngược lại) mà không cần NAT
  • IP mà một containers tự coi là IP mà những người khác coi đó là

Trong bài viết này, ta sẽ thảo luận về cách Kubernetes đáp ứng các yêu cầu mạng này trong một cụm: cách dữ liệu di chuyển bên trong một group , giữa các group và giữa các node .

Ta cũng sẽ chỉ ra cách Dịch vụ Kubernetes có thể cung cấp một địa chỉ IP tĩnh và mục nhập DNS cho một ứng dụng, giúp giảm bớt giao tiếp với các dịch vụ có thể được phân phối giữa nhiều group liên tục mở rộng và thay đổi.

Nếu bạn không quen với các thuật ngữ của vỏ các node Kubernetes hoặc cơ bản khác, bài viết của ta Giới thiệu về Kubernetes bao gồm các kiến trúc chung và các thành phần liên quan.

Đầu tiên ta hãy xem xét tình hình mạng trong một group duy nhất.

Mạng Pod

Trong Kubernetes, một group là đơn vị tổ chức cơ bản nhất: một group các container được kết hợp chặt chẽ với nhau, tất cả đều có liên quan chặt chẽ với nhau và thực hiện một chức năng hoặc dịch vụ duy nhất.

Về mạng thông minh, Kubernetes xử lý các group tương tự như một máy ảo truyền thống hoặc một server đơn giản: mỗi group nhận một địa chỉ IP duy nhất và tất cả các containers trong group chia sẻ địa chỉ đó và giao tiếp với nhau qua giao diện loopback lo bằng cách sử dụng tên server localhost . Điều này đạt được bằng cách gán tất cả các containers của group vào cùng một mạng .

Tình huống này có thể cảm thấy quen thuộc với bất kỳ ai đã triển khai nhiều dịch vụ trên một server duy nhất trước những ngày container hóa. Tất cả các dịch vụ cần sử dụng một cổng duy nhất để lắng nghe, nhưng nếu không thì giao tiếp không phức tạp và có chi phí thấp.

Pod to Pod Networking

Hầu hết các cụm Kubernetes cần triển khai nhiều group trên mỗi nút. Giao tiếp group với group có thể xảy ra giữa hai group trên cùng một nút hoặc giữa hai nút khác nhau.

Giao tiếp từ group đến group trên một nút

Trên một nút duy nhất, bạn có thể có nhiều group cần giao tiếp trực tiếp với nhau. Trước khi ta theo dõi lộ trình của một gói giữa các group , hãy kiểm tra cài đặt mạng của một nút. Sơ đồ sau cung cấp một cái nhìn tổng quan, mà ta sẽ đi qua chi tiết:

Tổng quan về mạng của một nút Kubernetes duy nhất

Mỗi nút có một network interface - trong ví dụ này là eth0 - được gắn với mạng cụm Kubernetes. Giao diện này nằm trong không gian tên mạng gốc của nút. Đây là không gian tên mặc định cho các thiết bị mạng trên Linux.

Cũng giống như không gian tên quy trình cho phép containers cách ly các ứng dụng đang chạy với nhau, không gian tên mạng cách ly các thiết bị mạng như giao diện và cầu nối. Mỗi group trên một nút được gán không gian tên mạng riêng biệt.

Không gian tên group được kết nối trở lại không gian tên gốc bằng một cặp ethernet ảo , về cơ bản là một đường ống giữa hai không gian tên với một giao diện ở mỗi đầu (ở đây ta đang sử dụng veth1 trong không gian tên gốceth0 trong group ).

Cuối cùng, các group được kết nối với nhau và với giao diện eth0 của nút thông qua cầu nối, br0 (nút của bạn có thể sử dụng thông tin như cbr0 hoặc docker0 ). Cầu nối về cơ bản hoạt động giống như một bộ chuyển mạch ethernet vật lý, sử dụng ARP (giao thức phân giải địa chỉ) hoặc định tuyến dựa trên IP để tìm kiếm các giao diện local khác để hướng lưu lượng đến.

Hãy theo dõi một gói từ pod1 đến pod2 ngay bây giờ:

  • pod1 tạo một gói với IP của pod2 là đích của nó
  • Gói tin di chuyển qua cặp ethernet ảo đến không gian tên mạng root
  • Gói tin tiếp tục đến cầu br0
  • Bởi vì group đích nằm trên cùng một nút, cầu nối sẽ gửi gói tin đến cặp ethernet ảo của pod2
  • gói tin đi qua cặp ethernet ảo, vào không gian tên mạng của pod2 và network interface eth0 của pod

Bây giờ ta đã theo dõi một gói từ group này sang group khác trong một nút, hãy xem cách lưu lượng group di chuyển giữa các node .

Pod to Pod Giao tiếp giữa hai nút

Bởi vì mỗi group trong một cụm có một IP duy nhất và mỗi group có thể giao tiếp trực tiếp với tất cả các group khác, một gói di chuyển giữa các group trên hai nút khác nhau rất giống với kịch bản trước đó.

Hãy theo dõi một gói từ pod1 đến pod3 , nằm trên một nút khác:

Sơ đồ mạng giữa hai nút Kubernetes

  • pod1 tạo một gói với IP của pod3 là đích của nó
  • Gói tin di chuyển qua cặp ethernet ảo đến không gian tên mạng root
  • Gói tin tiếp tục đến cầu br0
  • Bridge không tìm thấy giao diện local nào để định tuyến đến, vì vậy gói tin được gửi đi theo tuyến đường mặc định về phía eth0
  • Tùy chọn: nếu cụm của bạn yêu cầu lớp phủ mạng để định tuyến đúng cách các gói đến các node , thì gói đó có thể được đóng gói trong gói VXLAN (hoặc kỹ thuật ảo hóa mạng khác) trước khi chuyển đến mạng. Mặt khác, bản thân mạng có thể được cài đặt với các tuyến tĩnh thích hợp, trong trường hợp đó gói tin đi đến eth0 và ra khỏi mạng không bị thay đổi.
  • Gói tin đi vào mạng cụm và được chuyển đến đúng nút.
  • Gói tin đi vào nút đích trên eth0
  • Tùy chọn: nếu gói của bạn đã được đóng gói, nó sẽ được hủy gói tại thời điểm này
  • Gói tin tiếp tục đến cầu br0
  • Cầu nối định tuyến gói tin đến cặp ethernet ảo của pod đích
  • Gói tin đi qua cặp ethernet ảo đến giao diện eth0 của pod

Bây giờ ta đã quen thuộc với cách các gói được định tuyến qua địa chỉ IP group , hãy cùng xem các dịch vụ Kubernetes và cách chúng xây dựng trên cơ sở hạ tầng này.

Pod to Service Networking

Sẽ rất khó để gửi lưu lượng truy cập đến một ứng dụng cụ thể chỉ bằng các IP group , vì bản chất động của một cụm Kubernetes nghĩa là các group có thể được di chuyển, khởi động lại, nâng cấp hoặc mở rộng quy mô trong và ngoài sự tồn tại. Ngoài ra, một số dịch vụ sẽ có nhiều bản sao, vì vậy ta cần một số cách để cân bằng tải giữa chúng.

Kubernetes giải quyết vấn đề này bằng Dịch vụ . Dịch vụ là một đối tượng API ánh xạ một IP ảo (VIP) với một tập hợp các IP group . Ngoài ra, Kubernetes cung cấp một mục nhập DNS cho tên và IP ảo của từng dịch vụ, vì vậy các dịch vụ có thể dễ dàng được định địa chỉ bằng tên.

Việc ánh xạ các IP ảo sang các IP group trong cụm được điều phối bởi quy trình kube-proxy trên mỗi nút. Quá trình này cài đặt iptables hoặc IPVS để tự động dịch các VIP thành các IP group trước khi gửi gói tin ra mạng cụm. Các kết nối riêng lẻ được theo dõi để các gói có thể được dịch đúng cách khi chúng quay trở lại. IPVS và iptables đều có thể thực hiện cân bằng tải của một IP ảo dịch vụ thành nhiều IP group , mặc dù IPVS linh hoạt hơn nhiều trong các thuật toán cân bằng tải mà nó có thể sử dụng.

Lưu ý: quá trình dịch và theo dõi kết nối này diễn ra hoàn toàn trong nhân Linux. kube-proxy đọc từ API Kubernetes và cập nhật iptables ip IPVS, nhưng nó không nằm trong đường dẫn dữ liệu cho các gói riêng lẻ. Điều này hiệu quả hơn và hiệu suất cao hơn so với các version trước của kube-proxy, hoạt động như một proxy đất user .

Hãy làm theo lộ trình mà một gói tin đi từ một group , pod1 , đến một dịch vụ, service1 :

Sơ đồ mạng giữa hai nút Kubernetes, hiển thị bản dịch DNAT của các IP ảo

  • pod1 tạo một gói với IP của service1 là đích của nó
  • Gói tin di chuyển qua cặp ethernet ảo đến không gian tên mạng root
  • Gói tin tiếp tục đến cầu br0
  • Bridge không tìm thấy giao diện local nào để định tuyến gói tin đến, vì vậy gói tin được gửi đi theo tuyến đường mặc định về phía eth0
  • Iptables hoặc IPVS, được cài đặt bởi kube-proxy , trùng với IP đích của gói và dịch nó từ IP ảo sang một trong các IP group của dịch vụ, sử dụng bất kỳ thuật toán cân bằng tải nào có sẵn hoặc được chỉ định
  • Tùy chọn: gói của bạn có thể được đóng gói tại thời điểm này, như đã thảo luận trong phần trước
  • Gói tin đi vào mạng cụm và được chuyển đến đúng nút.
  • Gói tin đi vào nút đích trên eth0
  • Tùy chọn: nếu gói của bạn đã được đóng gói, nó sẽ được hủy gói tại thời điểm này
  • Gói tin tiếp tục đến cầu br0
  • Gói được gửi đến cặp ethernet ảo thông qua veth1
  • Gói tin đi qua cặp ethernet ảo và đi vào vùng tên mạng pod thông qua network interface eth0 của nó

Khi gói quay trở lại node1, quá trình dịch IP từ VIP sang group sẽ được đảo ngược và gói tin sẽ quay trở lại qua cầu nối và giao diện ảo đến đúng group .

Kết luận

Trong bài viết này, ta đã xem xét cơ sở hạ tầng mạng nội bộ của một cụm Kubernetes. Ta đã thảo luận về các khối xây dựng tạo nên mạng và trình bày chi tiết hành trình từng bước của các gói trong các tình huống khác nhau.

Để biết thêm thông tin về Kubernetes, hãy xem thẻ hướng dẫn Kubernetes của ta tài liệu Kubernetes chính thức .


Tags:

Các tin liên quan