Giới thiệu
Structural Patterns bao gồm các Patterns: Init Container, Sidecar, Adapter, Ambassador. Trong bài này chúng ta sẽ tìm hiểu về Sidecar Containers. Nó là gì và tại sao ta lại cần nó?
Mỗi Container chỉ nên phục vụ một vấn đề
Container là một công nghệ cho phép gói gọn ứng dụng, thư viện và các thành phần cần thiết khác để chạy một ứng dụng trong một môi trường độc lập với hệ thống. Nhờ vào sự độc lập này, các ứng dụng được triển khai trong Container có thể chuyển đổi giữa các môi trường khác nhau một cách dễ dàng và đảm bảo tính nhất quán giữa các môi trường khác nhau. Container cũng giúp các nhà phát triển triển khai các ứng dụng nhanh chóng và dễ dàng hơn bằng cách hạn chế các rủi ro liên quan đến phát triển và triển khai.
Để đảm bảo khả năng mở rộng và bảo trì. Các Container thường được thiết kế để giải quyết một vấn đề cụ thể hoặc chạy một dịch vụ duy nhất. Nếu ta muốn mở rộng chức năng của Container thì ta chỉ cần kế thừa Container trước đó là được Ví dụ:
FROM fluent/fluentd:v1.12.0-debian-1.0
USER root
RUN gem install fluent-plugin-elasticsearch --version 5.0.3
USER fluent
Ở trên là ví dụ về cách xây dựng Container mới với Elasticsearch Plugin. Chức năng của Plugin này là để giúp Fluentd gửi logs đến Elasticsearch. Nhà phát triển Fluentd không cung cấp sẵn Container chứa Elasticsearch Plugin mà chỉ cung cấp Container với các tính năng cơ bản, vì không phải dự án nào cũng sử dụng Elasticsearch để lưu trữ logs. Điều này giúp Container fluent/fluentd
nhẹ hơn và nếu người dùng muốn thêm chức năng khác, họ chỉ cần xây dựng một Container mới với Plugin tương ứng.
Một Container nên chỉ giải quyết một vấn đề cụ thể. Cách tiếp cận này giúp cho việc sửa lỗi và bảo trì Container trở nên dễ dàng hơn.
Sidecar Containers
Quay lại với K8S, một Pod có thể chứa một hoặc nhiều Container, và theo quy tắc được đề cập ở trên, một Container trong Pod nên chỉ có một chức năng duy nhất.
Ví dụ, Container dùng để chạy ứng dụng nên chỉ phục vụ một mục đích đó là chạy ứng dụng, và các chức năng phụ như thu thập logs, giám sát Container nên được để cho một Container khác phụ trách, để tránh các chức năng phụ ảnh hưởng đến hiệu suất của Container chứa ứng dụng. Các Container đó được gọi là Sidecar Containers.
Sidecar Containers là các Container chạy song song với Container chứa ứng dụng trong một Pod, chúng có nhiệm vụ mở rộng và hỗ trợ chức năng cho Container chứa ứng dụng.
Các Container chạy trong cùng một Pod có thể hỗ trợ lẫn nhau nhờ Pod cho phép các Container chia sẻ Volume và giao tiếp với nhau thông qua mạng local hoặc host IPC. Điều này có nghĩa là các Container trong cùng một Pod có thể gắn kết với cùng một Volume và gọi nhau qua localhost
.
Ví dụ, giả sử bạn cần tạo một trang web đơn giản được đặt trên HTTP Server, trong đó mã nguồn của trang web được lấy từ Github và sẽ được đồng bộ hóa với HTTP Server mỗi 60 giây. Bạn sẽ giải quyết vấn đề này như thế nào? Trước khi đọc tiếp, hãy thử giải quyết vấn đề này trước đó, sau đó bạn sẽ thấy rằng mô hình sidecar sẽ giúp bạn giải quyết vấn đề này một cách dễ dàng hơn.
Bạn có thể thực hiện điều này như sau: tạo một Pod với hai Container, một Container cho HTTP Server và một Container cho Git Synchronizer. Container cho HTTP Server chỉ tập trung vào việc đăng tải tệp thông qua HTTP, vì nó không cần quan tâm đến việc tệp này được lấy từ đâu. Container cho Git Synchronizer sẽ đồng bộ hóa mã nguồn từ Github và không quan tâm đến việc tệp này sẽ được sử dụng cho mục đích gì. Tệp tin cấu hình ví dụ:
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: Pod
metadata:
name: web-app
labels:
project: k8spatterns
pattern: Sidecar
spec:
containers:
# Main container is a stock httpd serving from /var/www/html
- name: app
image: centos/httpd
ports:
- containerPort: 80
volumeMounts:
- mountPath: /var/www/html
name: git
# Sidecar poll every 10 minutes a given repository with git
- name: poll
image: axeclbr/git
volumeMounts:
- mountPath: /var/lib/data
name: git
env:
- name: GIT_REPO
value: https://github.com/rhuss/beginner-html-site-scripted
command:
- "sh"
- "-c"
- "git clone $(GIT_REPO) . && watch -n 60 git pull"
workingDir: /var/lib/data
volumes:
# The shared directory for holding the files
- emptyDir: {}
name: git
Trong tệp trên, đầu tiên ta tạo một EmptyDir Volume và sau đó mount
nó vào Container Git Synchronizer ở thư mục /var/lib/data
. Container Git Synchronizer sẽ được sử dụng để đồng bộ mã nguồn từ Github xuống thư mục mỗi 60 giây.
Sau đó, ta sẽ mount
EmptyDir Volume này vào Container HTTP Server ở thư mục /var/www/html
để Container HTTP Server có thể sử dụng những tệp tin này để hiển thị.
Kết luận
Vậy là ta đã tìm hiểu xong về Sidecar Patterns, nếu ta cần thực hiện các tính năng logs và monitor cho Container thì chúng ta nên sử dụng Sidecar Containers, để tránh chức năng phụ này gây ảnh tới hiệu suất của Container chứa ứng dụng.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?