Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa

950
18-08-2021
Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa

Bạn muốn tìm hiểu cách sử dụng các vùng chứa như Ambassador, sidecar, adapter và init để mở rộng các ứng dụng trong Kubernetes với các nhóm nhiều vùng chứa một cách đơn giản mà không cần thay đổi mã của chúng. Hãy cùng Bizfly Cloud tìm hiểu qua bài viết dưới đây.

Chạy nhiều vùng chứa trong một nhóm

Kubernetes giúp cung cấp một lượng lớn tính linh hoạt và khả năng chạy nhiều loại ứng dụng khác nhau. Nếu những ứng dụng của bạn là cách dịch vụ nhỏ dựa trên đám mây hoặc các ứng dụng xây dựng theo twelve-factor (12-yếu tố) việc chạy chúng trong Kubernetes sẽ tương đối đơn giản.

- Tuy nhiên, những ứng dụng đang chạy không được thiết kế một cách rõ ràng để chạy trong containerized thì sao? 

Kubernetes cũng có thể xử lý những vấn đề này, mặc dù có thể phải thiết lập nhiều công việc hơn một chút. Và một trong những công cụ mạnh mẽ nhất mà Kubernetes cung cấp để trợ giúp là nhóm nhiều vùng chứa, mặc dù các nhóm nhiều vùng chứa hữu ích cho những ứng dụng gốc trên đám mây.

- Tại sao bạn muốn chạy nhiều vùng chứa trong một nhóm?

Có thể thấy các nhóm nhiều vùng chứa sẽ cho phép bạn thay đổi hành vi của ứng dụng một cách đơn giản hơn mà không cần thay đổi mã của ứng dụng đó. Điều này cho thấy rằng việc chạy trong các vùng chứa của ứng dụng ban đầu không được thiết kế sẽ thuận tiện hơn rất nhiều.

Làm thế nào để các nhóm nhiều vùng chứa hoạt động?

Trước khi đi phân tích làm thế nào để các nhóm nhiều vùng chứa có thể hoạt động, hãy phân biệt sự khác nhau giữa các nhóm và vùng chứa trên Kubernetes.

Một vùng chứa "truyền thống" (ví dụ: một vùng chứa bắt đầu bởi docker run) cung cấp một số hình thức cô lập cấu hình như:

- Cách ly tài nguyên như: giới hạn bộ nhớ,...

- Quy trình cách ly.

- Hệ thống tập tin và cô lập gắn kết.

- Cô lập mạng.

Trên Kubernetes, một vùng chứa sẽ cung cấp tất cả các dạng cô lập đó ngoại trừ cô lập mạng. Thay vào đó, sự cô lập mạng sẽ xảy ra ở cấp nhóm. Hiểu theo một cách khác thì mỗi vùng chứa trong một nhóm sẽ có hệ thống tệp, bảng quy trình,... nhưng tất cả chúng sẽ chia sẻ cùng một không gian tên mạng.

Hãy cùng tìm hiểu một vùng chứa nhiều nhóm đơn giản để hiểu rõ hơn về cách hoạt động của nó.

Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa  - Ảnh 1.

Cụ thể:

- Có 2 vùng chứa, cả 2 đều chỉ sleep trong một thời gian

- Có một emptyDir volume về cơ bản là một volume cục bộ tạm thời tồn tại trong suốt thời gian tồn tại của nhóm.

- Các emptyDir volume được lắp trong mỗi pod tại /shared thư mục.

Bạn có thể thấy rằng ổ đĩa được gắn trên vùng chứa đầu tiên bằng cách sử dụng kubectl exec:

Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa  - Ảnh 2.

Lệnh đã đính kèm một phiên đầu cuối vào vùng chứa c1 trong podtest nhóm.

Các --container lựa chọn cho kubectl exec là thường được viết tắt -c.

Bạn có thể kiểm tra các tập đính kèm c1 với:

Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa  - Ảnh 3.

Như bạn có thể thấy, một tập đã được gắn trên /shared- đó là shared tập mà chúng tôi đã tạo trước đó.

Bây giờ hãy tạo một số tệp:

Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa  - Ảnh 4.

Hãy kiểm tra các tệp tương tự từ vùng chứa thứ hai.

Đầu tiên hãy kết nối với nó bằng:

Hướng dẫn mở rộng ứng dụng trên Kubernetes với các nhóm nhiều vùng chứa  - Ảnh 5.

Bạn có thể thấy, tệp được tạo trong shared thư mục có sẵn trên cả hai vùng chứa, nhưng tệp trong /tmp thì không. Do ngoài khối lượng, hệ thống tệp của vùng chứa hoàn toàn bị cô lập với nhau. 

Vậy hãy cùng xem xét mạng và quá trình cô lập.

Cách tốt để xem thiết lập là sử dụng lệnh ip link, lệnh này hiển thị các thiết bị mạng của hệ thống Linux.

Hãy thực hiện lệnh trong vùng chứa đầu tiên:

$ 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000

   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

178: eth0@if179: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue

    link/ether 46:4c:58:6c:da:37 brd ff:ff:ff:ff:ff:ff

$

Tương tự lệnh trên:

$ 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000

   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

178: eth0@if179: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue

    link/ether 46:4c:58:6c:da:37 brd ff:ff:ff:ff:ff:ff

 $

Bạn có thể thấy rằng cả hai vùng chứa đều có:

- Các thiết bị giống nhau eth0.

- Các địa chỉ MAC giống nhau 46:4c:58:6c:da:37.

Tiếp theo hãy kết nối với vùng chứa đầu tiên với:

$ kubectl exec -it podtest -c c1 -- sh

Bắt đầu một trình rất đơn giản với nc:

$ nc -lk -p 5000 127.0.0.1 -e 'date'

Lệnh khởi động trên localhost trên cổng 5000 và in date lệnh tới bất kỳ máy khách TCP nào được kết nối.

Mở một thiết bị đầu cuối trong vùng chứa thứ hai với:

$ telnet localhost 5000

Connected to localhost

Sun Nov 29 00:57:37 UTC 2020

Connection closed by foreign host

ps aux

PID USER TIME COMMAND

1 root 0:00 sleep 5000

73 root 0:00 sh

81 root 0:00 ps aux

$

Bây giờ bạn có thể xác minh rằng vùng chứa thứ hai có thể kết nối với trình nghe mạng, nhưng không thể xem nc quá trình:

Kết nối qua telnet, bạn có thể thấy đầu ra date, điều này chứng tỏ rằng trình nc nghe đang hoạt động, nhưng ps aux hoàn toàn không hiển thị nc.

Điều này là do các vùng chứa trong một nhóm có cách ly quy trình nhưng không cách ly mạng.

Trong bài viết này, chúng tôi đã hướng dẫn bạn cách tích hợp CDN vào W3 Total Cache cho website Wordpress một cách nhanh nhất. Hãy tiếp tục theo dõi Bizfly Cloud để cập nhật những công nghệ mới nhất mỗi ngày.

SHARE