Tổng quan về Docker Container Network Model

Các Docker container giúp chúng ta gói một phần mềm vào một filesystem hoàn chỉnh chứa tất cả những gì cần thiết để phần mềm có thể hoạt động: compile, runtime, system tool và system library — tất cả những gì được cài đặt lên một server. Điều này đảm bảo phần mềm sẽ luôn thực thi theo cùng một cách mà không phụ thuộc vào môi trường. Mặc định, các container cô lập một ứng dụng với những ứng dụng khác, và với cơ sở hạ tầng bên dưới nó.

Điều này dẫn tới câu hỏi: “điều gì xảy ra nếu ứng dụng có nhu cầu giao tiếp với ứng dụng khác, với máy host, và với mạng bên ngoài?”. Làm thế nào để thiết kế được một network có khả năng kết nối cao trong khi vẫn duy trì được application portability, service discovery, load balancing, security, performance, và scalability?

Bài viết này mô tả tổng quan các kiến trúc và concept để xây dựng và mở rộng mạng Docker container.

Thách thức của Mạng các Container và Vi dịch vụ

Sự phổ cập của hành dụng Vi dịch vụ (microservice) đã tăng quy mô của tập hợp các ứng dụng, điều đó khiến phương pháp giao tiếp và cô lập các ứng dụng càng trở nên quan trọng.

Thiết kế mạng là một nghệ thuật cân bằng. Có nhiều giải pháp để tạo ra phương thức kết nối, mỗi giải pháp có sự cân bằng khác nhau giữa ứng dụng và môi trường. Mỗi giải pháp là một lựa chọn đánh đổi. Triết lý của mạng Docker là hướng ứng dụng. Nó nhắm đến cung cấp nhiều tùy chọn uyển chuyển để vận hành mạng cũng như cung cấp mức trừu tượng vừa tầm cho các nhà phát triển ứng dụng.

Docker đã tạo ra một cách thức mới để chuyển giao các ứng dụng, và theo đó, các container đã thay đổi giải pháp được tạo ra để vận hành mạng. Có những nhu cầu chỉ xuất hiện kèm theo ngữ cảnh “kết nối container”, và những nhu cầu đó ảnh hưởng đến thiết kế mạng:

Tính luân chuyển

Làm thế nào đảm bảo được khả năng luân chuyển tối đa giữa vô vàn các thể loại mạng khác nhau cho một container, trong khi vẫn tận dụng được sức mạnh đặc trưng riêng biệt của mỗi mạng?

Nhận biết dịch vụ

Làm thế nào có thể nhận biết một dịch vụ đang “sống” cũng như nó đang được tăng hay giảm quy mô?

Cân bằng tải

Làm thể nào trải đều chịu tải cho các dịch vụ khi chúng được tăng quy mô?

Bảo mật

Làm thế nào ngăn chặn việc rò rỉ thông tin giữa các container?

Cụ thể hơn, làm thế nào để ngăn chặn một container truy cập đến các container khác, hay làm thế nào đảm bảo rằng đường truyền giữa các container là bảo mật?

Hiệu năng

Làm thế nào để cung cấp một dịch vụ mạng tối tân trong khi vẫn giảm thiểu độ trễ và tối đa băng thông?

Khả năng mở rộng quy mô

Làm thế nào đảm bảo không có bất kỳ đặc trưng nào ở trên bị ảnh hưởng xấu khi mở rộng quy mô?

Container Networking Model

Kiến trúc của mạng Docker được xây dựng dựa trên một tập interface được gọi là Container Networking Model (CNM). Triết lý của CNM là cung cấp khả năng luân chuyển ứng dụng trên nhiều nền tảng. Mô hình này cân bằng được tính luân chuyển cho ứng dụng và cũng tận dụng được khả năng đặc trưng của các nền tảng.

https://success.docker.com/article/networking

CNM – các thành phần

Trong CNM có một vài thành phần cấp cao (về mức trừu tượng). Chúng giấu đi các chi tiết của hệ điều hành và cơ sở hạ tầng và nhờ đó các ứng dụng có thể hoạt động đồng nhất mà không phụ thuộc nền tảng.

Sandbox

Sandbox chứa cấu hình mạng của container. Bao gồm cấu hình quản trị các interface mạng, bảng routing, các cấu hình DNS…

Chữ sandbox vừa mang ý nghĩa “cô lập” vừa có ý nghĩa “giả lập”. Sandbox có thể giả lập hạ tầng mạng Windows HNS, Linux Network Namespace, FreeBSD Jail, hay các concept tương tự.

Một sandbox có thể chứa nhiều endpoint kết nối đến nhiều network.

Endpoint

Endpoint kết nối sandbox với một Network. Endpoint tồn tại là để trừu tượng hóa kết nối thật sự của mạng. Điều này giúp ứng dụng có thể sử dụng được nhiều kiểu hình driver mạng khác nhau mà không cần quan tâm đến chi tiết về kết nối, và theo đó ứng dụng giữ được khả năng luân chuyển.

Network

CNM Network không tương đồng với tầng Network trong mô hình OSI. Network ở đây ám chỉ kết nối giữa các endpoint. Network là một tập hợp các endpoint mà có kết nối giữa chúng.

Trong bài viết này, thuật ngữ mạng được dùng để chỉ mạng kết nối nói chung và network được dùng để chỉ CNM network.

CNM – Các Driver Interface

CNM mở hai interface dạng cắm/rút là Network Driver và IPAM Driver. Qua đó người dùng, cộng đồng, và các nhà cung cấp có thể tận dụng và bổ sung chức năng, quan sát, cũng như điều khiển network.

Network Driver

Các Network Driver cung cấp những triển khai thật để network có thể hoạt động. Chúng là các trình điều khiển dạng cắm/rút và có thể được thay thế lâm thời một cách dễ dàng, nhằm phục phụ các trường hợp sử dụng khác nhau. Nhiều trình điều khiển có thể có thể được sử dụng đồng thời trong cùng một Docker Engine hay Cluster, nhưng mỗi network chỉ có thể cắm một trình điều khiển duy nhất. Có hai dạng chính của CNM Network Driver:

  • Native Network Driver: những trình điều khiển cơ bản, có sẵn của Docker Engine, được cung cấp bởi Docker. Có nhiều driver native và chúng đảm nhiệm những khả năng khác nhau như overlay network hay local bridge.
  • Remote Network Driver: những trình điều khiển được phát triển bởi cộng đồng và các nhà cung cấp khác. Chúng được sử dụng để cung cấp sự tích hợp tốt hơn cho phần mềm và phần cứng đương nhiệm. Người dùng cũng có thể tạo ra driver của họ khi cần các chức năng đặc biệt mà các network driver hiện tại không cung cấp.
IPAM Driver

Là các IP Address Management (trình quản lý địa chỉ IP). Docker có một trình IPMA native để cung cấp các địa chỉ hay subnet mặc định cho các network và endpoint trong trường hợp chúng không được chỉ định. Địa chỉ IP cũng có thể được gán thủ công khi tạo network, container, hay service. Các Remote IPAM Driver cũng có thể được sử dụng nếu cần sự tích hợp đặc thù.

Các Docker Native Network Driver

Các Docker native network driver là một phần của Docker Engine và không yêu cầu bất kỳ module nào khác. Chúng được gọi là sử dụng thông qua câu lệnh docker network tiêu chuẩn. Dưới đây là danh sách tổng quan các native network driver hiện hữu.

Host

Với driver host, container sử dụng chung network stack (ngăn xếp mạng) với máy host. Không có phân chia không gian tên, và container có thể sử dụng trực tiếp tất cả các interface mạng của máy host.

Bridge

Driver bridge tạo một Linux bridge (cầu) trên máy host. Cầu này được điều khiển bởi Docker. Mặc định, các container kết nối vào cầu có thể giao tiếp với nhau. Cấu hình cho truy cập container từ ngoại vi có thể được thực hiện thông qua bridge driver.

Overlay

Driver overlay tạo một mạng overlay nhằm mục đích hỗ trợ mạng kết nối chéo giữa nhiều host. Nó kết hợp cầu Linux nội bộ với mạng LAN ảo mở rộng (VXLAN) để “phủ” mạng lên kết nối container-container giữa nhiều hạ tầng mạng vật lý.

MACVLAN

Driver macvlan sử dụng cầu Linux MACVLAN để bắc cầu một interface của container với một interface của máy host. Nó có thể được ứng dụng, chẳng hạn, để cung cấp địa chỉ IP cho những container mà được điều hướng bởi một bảng routing trên mạng vật lý.

None

Driver none cho container một ngăn xếp mạng và không gian tên của riêng nó nhưng không cấu hình interface mạng trong container. Nếu không có thêm cấu hình nào, container sẽ hoàng toàn cô lập với ngăn xếp mạng của máy host.

Phạm vi hoạt động của Network

Như được thấy trong kết quả của câu lệnh docker network ls dưới đây, Docker network driver có phạm vi hoạt động của nó. Phạm vi hoạt động của network là miền hoạt động của driver, nó có thể là local hay swarm. Driver hoạt động tại local cung cấp kết nối và dịch vụ mạng (DNS hay IPAM chẳng hạn) trong phạm vi của máy host. Driver hoạt động tại swarm cung cấp kết nối và dịch vụ mạng trên phạm vi cụm swarm. Các network trên phạm vi swarm có cùng ID mạng với nhau trên toàn cụm trong khi các network tại local sẽ có ID mạng khác nhau cho mỗi máy host.

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1475f03fbecb        bridge              bridge              local
e2d8a4bd86cb        docker_gwbridge     bridge              local
407c477060e7        host                host                local
f4zr3zrswlyg        ingress             overlay             swarm
c97909a4b198        none                null                local

Căn bản về Linux Network

Kernel (nhân) Linux triển khai ngăn xếp mạng TCP/IP một cách vô cùng hoàn thiện và hiệu quả (chưa kể đến các tính năng khác như VXLAN và lọc gói). Docker network sử dụng ngăn xếp mạng của kernel làm yếu tố nguyên thủy để tạo ra các driver mạng cấp cao hơn. Nói một cách đơn giản, Docker network là Linux network.

Triển khai dựa trên kernel Linux đảm bảo được sự mạnh mẽ và hiệu quả. Quan trọng nhất, nó cung cấp khả năng luân chuyển giữa nhiều bản phân phối và nhiều phiên bản kernel, điều cho phép tăng khả năng luân chuyển của ứng dụng.

Có một số khối thành phần của Linux network được Docker sử dụng để triển khai CNM native network driver của nó. Chẳng hạn như Linux bridge, network namespace, veth path hay iptable. Sự kết hợp giữa các công cụ đó, được triển khai thành network driver, cung cấp forwarding rules, network segmentation, và các công cụ quản lý network policy động.

Linux Bridge

Linux bridge là một thiết bị mạng layer 2 (tầng Data Link, nói dễ hiểu thì tương đương switch mạng) được triển khai ảo bởi Linux kernel. Nó chuyển tiếp lưu thông mạng dựa theo địa chỉ MAC mà nó ghi nhớ động bằng cách kiểm tra dòng tin. Linux bridge được sử dụng rộng-rãi trong trong nhiều Docker network driver. Không nên nhầm lẫn Linux driver với driver bridge — thứ nằm ở một bậc triển khai cao hơn.

Network Namespace

Linux Network Namespace (không gian tên của mạng) là một ngăn xếp mạng được cô lập trong kernel với các interface, bảng route, và tường lửa — của riêng nó. Nó là một khía cạnh bảo mật của container và Linux, được sử dụng để cô lập các container. Network namespace đảm bảo rằng hai container trong cùng một host không thể giao tiếp với nhau hay với máy host trừ khi Docker network được cấu hình để cho phép chúng thực hiện việc đó. Thông thường, CNM network driver đặt namespace khác nhau cho mỗi container. Tuy vậy, các container có thể chia sẻ cùng namespace với nhau hoặc thậm chí cùng trở thành một phần trong namespace của máy host. Namespace của máy host chứa các interface mạng và bảng route của máy host.

Các Virtual Ethernet Device

Thiết bị mạng dây ảo (virtual ethernet device, hay veth) là một interface mạng của Linux mà hoạt động giống hệt như một kết nối mạng có dây giữa hay network namespace. Veth là một kết nối hai chiều đầy đủ với một interface duy nhất ở mỗi network namespace. Dòng tin trong mỗi interface được hướng ra ngoài tới interface còn lại. Các Docker network driver sử dụng veth để cung cấp kết nối tường minh giữa các namespace khi Docker network được tạo. Khi một container được đính vào một Docker network, một đầu của veth sẽ được đặt trong container (thường được nhận diện là interface ethX) trong khi đầu còn lại được đính vào Docker network.

iptables

iptables là hệ thống lọc gói tin, đây là một phần native của Linux kernel từ phiên bản 2.4. Nó đóng vai trò như một tường lửa đa chức năng, cung cấp các chuỗi luật để đánh dấu, giả mạo và hủy bỏ gói. Các native Docker network driver sử dụng rộng rãi iptables để phân nhóm dòng tin, port mapping và đánh dấu gói tin cho các quyết định cân bằng tải.

Tổng kết

Bài viết này đã cung cấp cái nhìn tổng quan về Docker Container Network Model cũng như sơ lược về một số concept chính. Các bạn có thể đón đọc các bài viết tiếp theo trong cùng category này để tìm hiểu kỹ hơn.

_

1 Comment

Leave a Comment

Your email address will not be published. Required fields are marked *