Hệ sinh thái Docker: Mạng kết nối và giao tiếp

1822
27-07-2018
Hệ sinh thái Docker: Mạng kết nối và giao tiếp

Hệ sinh thái Docker là gì? Còn khá nhiều người vẫn chưa biết đến khái niệm này như nào. Để hiểu hơn về Docker là gì có thể cùng Bizfly Cloud tìm hiểu những thông tin ở bài viết này nhé. 

Giới thiệu 

Khi xây dựng các hệ thống phân tán để phục vụ các Docker containers, trao đổi và kết nối trở nên vô cùng quan trọng. Kiến trúc hướng dịch vụ (Service-oriented architecture) -SOA, nói một cách rõ ràng, nó chủ yếu dựa vào giao tiếp giữa các thành phần để hoạt động chính xác.

Trong bài ngày hôm nay, chúng ta sẽ thảo luận về các chiến lược và công cụ kết nối khác nhau dùng để hình thành nên các network mà các container sử dụng cho trạng thái mong muốn. Một số tình huống có thể tận dụng các giải pháp Docker-native, trong khi một số khác sẽ phải cần đến các chương trình thay thế.

Triển khai Native Docker

Bản thân Docker cung cấp nhiều nguyên tắc network cơ bản, cần thiết cho các giao tiếp container-to-container và container-to-host.

Khi quá trình Docker được khởi động, nó cấu hình một giao diện bridge ảo mới gọi là docker0 trên hệ thống máy chủ. Giao diện này cho phép Docker cấp phát một subnet ảo để sử dụng giữa các container sẽ sử dụng để chạy. Bridge sẽ đóng vai trò là điểm giao tiếp chính giữa các mạng trong một container và network trên máy chủ.

Hệ sinh thái Docker: Mạng kết nối và giao tiếp - Ảnh 1.

Hệ sinh thái Docker

Khi một container được Docker khởi động, một giao diện ảo mới được tạo ra và cho ra một địa chỉ trong phạm vi subnet của bridge. 

Địa chỉ IP được nối với mạng nội bộ của container, cung cấp cho mạng của container một đường dẫn đến docker bridge trên hệ thống máy chủ. Docker sẽ tự động cấu hình các quy tắc iptables cho phép chuyển tiếp và cấu hình NAT giả lập cho traffic bắt nguồn từ    docker dành riêng cho môi trường bên ngoài.

Làm thế nào để container cung cấp dịch vụ cho người tiêu dùng?

Các container khác trên cùng một host có thể giao tiếp trực tiếp với nhau mà không cần bất kỳ cấu hình bổ sung nào. Hệ thống máy chủ sẽ chỉ định tuyến các yêu cầu khởi tạo và định sẵn cho giao diện docker tới vị trí thích hợp.

Các container có thể kết nối trực tiếp tới các port của máy chủ, nơi chúng sẽ nhận traffic được chuyển tiếp từ bên ngoài. Các cổng tiếp xúc có thể được map tới hệ thống máy chủ, bằng cách chọn một cổng cụ thể hoặc cho phép Docker chọn một cổng ngẫu nhiên, không sử dụng đến. Docker sẽ xử lý bất kỳ quy tắc chuyển tiếp và cấu hình iptables nào để định tuyến chính xác các packet trong những tình huống như thế này.

Hệ sinh thái Docker: Mạng kết nối và giao tiếp - Ảnh 2.

Kiến trúc Docker

Sự khác biệt giữa hiển thị và xuất bản một cổng là gì?

Khi tạo các container image hoặc chạy một container, bạn có thể tùy chọn một cổng nhất định hoặc public ra một cổng ngẫu nhiên của máy chủ. Sự khác biệt giữa hai khái niệm này là quan trọng, nhưng không phải lúc nào cũng có thể nhận ra ngay được.

Việc hiển thị một cổng đơn giản có nghĩa là, Docker sẽ lưu ý rằng cổng đang được hỏi là cổng được container sử dụng. Vấn đề này, sau đó có thể được sử dụng cho mục đích tìm hiểu và liên kết. Ví dụ, kiểm tra một container sẽ cung cấp cho bạn thông tin về các cổng hiển thị. Khi các container được liên kết, các biến môi trường sẽ được đặt trong container mới và chỉ ra các cổng được hiển thị trên container ban đầu.

Theo mặc định, các container sẽ có khả năng truy cập vào hệ thống máy chủ và bất kỳ container nào khác trên máy chủ lưu trữ cho dù cổng có được hiển thị hay không. Việc hiển thị cổng chỉ đơn giản là ghi lại việc sử dụng cổng để thông tin đó khả dụng cho tự động map và liên kết.

Ngược lại, việc xuất bản một cổng sẽ map cổng đó tới giao diện máy chủ, và cho phép cổng đó khả dụng với môi trường bên ngoài. Các cổng container có thể được map tới một cổng cụ thể trên máy chủ hoặc Docker có thể tự động chọn một cổng lớn, chưa sử dụng đến một cách ngẫu nhiên.

Liên kết Docker là gì?

Docker cung cấp một cơ chế gọi là "liên kết Docker" để cấu hình giao tiếp giữa các container. Nếu một container mới được liên kết với một container hiện có, container mới sẽ được cung cấp thông tin kết nối tới container hiện có thông qua các biến môi trường. Điều này giúp cho việc thiết lập giao tiếp giữa hai container được dễ dàng bằng cách cung cấp cho container mới thông tin rõ ràng về cách truy cập container bắt cặp với nó. Các biến môi trường được thiết lập dựa theo các cổng được các container khác hiển thị. Địa chỉ IP và thông tin khác sẽ được chính Docker tự nhập.

Các chương trình để mở rộng khả năng kết nối của Docker

Mô hình mạng network được nói đến ở trên đem đến một khởi đầu tốt cho việc xây dựng network. Giao tiếp giữa các container trên cùng một máy chủ thường không phức tạp và giao tiếp giữa các máy chủ có thể được diễn ra trên các mạng công cộng thông thường, miễn là các cổng được map chính xác và thông tin kết nối được cung cấp cho bên còn lại.

Tuy nhiên, nhiều ứng dụng yêu cầu môi trường mạng xác định cho các mục tiêu về bảo mật hoặc đảm bảo chức năng. Chức năng mạng native của Docker có phần bị hạn chế trong các tình huống này. Vì lý do đó, có nhiều chương trình đã được tạo ra để mở rộng hệ sinh thái mạng Docker.

Tạo các overlay network để phân tách (abstract) cấu trúc liên kết cơ bản.

Một chức năng cải tiến mà một số chương trình tập trung vào là thiết lập các overlay network. Overlay network là mạng ảo được xây dựng trên các kết nối mạng hiện có. Thiết lập overlay network cho phép tạo một môi trường mạng dễ dự đoán và thống nhất hơn trên các máy chủ. Điều này giúp đơn giản hóa việc kết nối giữa các container, mà không cần quan tâm đến vị trí đang chạy các container. Một mạng đơn ảo có thể nối nhiều máy chủ hoặc các subnet xác định, có thể được chỉ định cho mỗi máy chủ trong một mạng hợp nhất.

Một ứng dụng khác của overlay network là xây dựng cấu trúc các cụm máy tính (computing cluster). Trong cấu trúc tính toán (fabric computing), nhiều máy chủ được tách ra và quản lý như một thực thể duy nhất và mạnh mẽ hơn. Việc triển khai một lớp cấu trúc tính toán cho phép người dùng cuối quản lý cluster như một tổng thể thay vì các máy chủ riêng lẻ. Kết nối đóng vai trò lớn trong mô hình cụm này.

Cấu hình mạng nâng cao

Các chương trình mở rộng khả năng kết nối của Docker bằng cách cung cấp tính linh hoạt nhiều hơn.

Cấu hình mạng mặc định của Docker đa chức năng nhưng khá đơn giản. Những hạn chế này bộc lộ đầy đủ nhất khi giao tiếp với mạng cross-host và cũng có thể cản trở các yêu cầu mạng tùy chỉnh (customized networking) khác trong cùng một máy chủ.

Chức năng bổ sung được cung cấp thông qua tính năng "plumbing". Các chương trình này không cung cấp tính năng không cần cấu hình (out-of-the-box), nhưng chúng cho phép bạn ghép các phần lại với nhau một cách thủ công và tạo ra các trường hợp network phức tạp. Một số tính năng bạn có thể đạt được bắt đầu từ đơn giản như thiết lập mạng riêng giữa các máy chủ nhất định, để cấu hình các bridge, vlans, subnet tùy chỉnh và các gateway.

Ngoài ra còn có một số công cụ và chương trình mà người ta thường không nghĩ đến việc phát triển với Docker, lại thường được sử dụng trong môi trường Docker để cung cấp những chức năng cần thiết. Đặc biệt, các công nghệ network và tunnel riêng hoàn thiện thường được sử dụng để cung cấp thông tin liên lạc an toàn giữa các máy chủ và giữa các container.

Một số chương trình phổ biến để cải thiện mạng Docker là gì?

Có một vài chương trình khác nhau tập trung vào việc cung cấp overlay network cho các máy chủ Docker.

Các chương trình thông thường:

flannel: Được phát triển bởi team CoreOS, chương trình này ban đầu được phát triển để cung cấp cho mỗi hệ thống máy chủ một subnet riêng của mạng chia sẻ (shared network). Đây là điều kiện cần để hệ thống kubernetes (một mã nguồn mở được dùng để tự động triển khai hệ thống, scaling, quản lý các container) của Google hoạt động, tuy nhiên, nó cũng hữu ích trong cả các tình huống khác.

weave: Weave tạo ra một mạng ảo kết nối từng máy chủ với nhau. Điều này giúp đơn giản hóa việc định tuyến ứng dụng vì nó hỗ trợ cho mỗi container hiện hữu được cắm vào một công tắc mạng đơn lẻ.

Trong trường hợp kết nối nâng cao, chương trình sau đây được sử dụng nhằm mục tiêu lấp đầy chỗ trống khi cung cấp hệ plumbing bổ sung:

pipework: Được xây dựng như một biện pháp tạm thời cho đến khi Docker native network được nâng cấp hơn, chương trình này cho phép cấu hình dễ dàng các mạng tùy chỉnh nâng cao.

Một ví dụ có liên quan đến phần mềm hiện hành được kết hợp để thêm chức năng vào Docker là:

tinc: Tinc là một phần mềm VPN dung lượng nhẹ được triển khai bằng cách sử dụng tunnel và mã hóa. Tinc là một giải pháp mạnh mẽ có thể làm cho mạng riêng trong suốt đối với bất kỳ ứng dụng nào.

Kết luận

Cung cấp các dịch vụ nội bộ và dịch vụ bên ngoài thông qua các thành phần chứa trong container là một mô hình rất mạnh mẽ, tuy nhiên các lưu ý về network sẽ trở thành ưu tiên. Trong khi Docker cung cấp một số chức năng nguyên bản thông qua cấu hình giao diện ảo, subnet, iptables và NAT, các chương trình khác đã được tạo ra để cung cấp các cấu hình nâng cao hơn.

Theo www.digitalocean.com

>> Có thể bạn quan tâm: Hệ sinh thái Docker: Lập kế hoạch và điều phối

TAGS: docker
SHARE