- vừa được xem lúc

Kubernetes Patterns - Behavioral Patterns: Service Discovery

0 0 23

Người đăng: Quân Huỳnh

Theo Viblo Asia

Giới thiệu

Chào các bạn tới với series về kubernetes patterns . Ở bài chúng ta sẽ tìm hiểu về một patterns rất quan trọng trong k8s là Service Discovery.

Service Discovery

Service Discovery pattern sẽ cung cấp cho ta một stable endpoint, và client có thể sử dụng endpoint đó để truy cập các ứng dụng của ta.

image.png

Image from nginx

Problem

Khi ta triển khai một ứng dụng lên trên k8s ta sẽ deploy nó lên trên Pod, và mỗi pod đều có một IP riêng của nó. Nếu các ứng dụng của ta muốn giao tiếp với nhau thông qua pod ip thì ta sẽ gặp một vấn đề rất lớn.

Vì ở trong k8s thì pod là một ephemeral resource, có nghĩa là trong quá trình ta triển khai ứng dụng pod có thể được tạo ra, xóa đi, hoặc thay thế bằng một thằng khác bất cứ lúc nào. Và mỗi lần pod được tạo mới ip của nó sẽ đổi, nên nếu các ứng dụng của ta giao tiếp với nhau thông qua pod ip thì nó sẽ bị lỗi.

Solution

Để giải quyết vấn đề trên k8s mới sinh ra thằng Service resource mà implment Service Discovery pattern.

Service resource sẽ tạo ra một fixed Virtual IP cho toàn bộ các pod phía sau nó. Service sẽ chọn các Pod mà nó quản lý connection thông qua thuộc tính spec.selector.

Và khi request của ta gọi tới virtual ip của service thì nó sẽ được gửi random tới một trong những pod ở đằng sau service đó.

image.png

Service Discovery in Kubernetes

Vậy làm thế nào các ứng dụng trong pod có thể phát hiện được Virtual IP của một Service? Ta sẽ có hai cách sau:

  • Discovery thông qua environment variables.
  • Discovery through DNS lookup.

Discovery through environment variables

Cách đầu tiên để các ứng dụng có thể phát hiện được Virtual IP của một Service là thông qua environment variables.

Khi một pod bắt đầu chạy thì nó sẽ được nhúng toàn bộ thông tin của các Service đang tồn tại lúc đó vào trong biến environment variables của nó, thông tin Virtual IP của Service cũng sẽ được nhúng vào các env này.

Hai biến env chứa thông tin về Virtual IP của Service là HOST và PORT, có định dạng như sau:

  • <SERVICE_NAME>_SERVICE_HOST
  • <SERVICE_NAME>_SERVICE_PORT

Ví dụ ở trên ta có Service tên là kubia, thì biến env của nó sẽ có định dạng là:

KUBIA_SERVICE_HOST=172.17.0.4
KUBIA_SERVICE_PORT=80

Cách discovery thông qua biến env này sẽ có một khuyết điểm. Đó là biến env của Service chỉ được nhúng vào khi pod bắt đầu chạy, còn với các pod đang chạy thì khi ta tạo Service mới thì các không tin của Service đó sẽ không được nhúng vô, để lấy được thông tin mới thì pod cần mới được restart. Do đó thông thường ta sẽ sử dùng cách thứ hai.

Discovery through DNS lookup

Với cách này thì các ứng dụng sẽ phát hiện Virtual IP của một Service thông qua DNS. Kubernetes có cung cấp cho ta một internal dns server, khi một Service mới được tạo ra thì bên cạnh Virtual IP được gán cho nó thì còn có thêm một DNS đi kèm.

Và ta có thể truy cập Service thông qua DNS đó, dns của Service với format FQDN (fully qualified domain name) <service-name>.<namespace>.svc.cluster.local. Với <service-name> là tên của service ở trường metadata.name, còn <namespace> là tên namespace mà Service được tạo, .svc định nghĩa cho nó là service resource, cluster.local là hậu tố cố định.

Ví dụ với Service ở trên thì dns của ta sẽ có tên là kubia.default.svc.cluster.local. Và khi ta sử dụng nó trong pod, ta chỉ cần chỉ định nó với <service-name>.<namespace> mà thôi. Ví dụ với kubia.default.svc.cluster.local thì khi ta dùng ta chỉ cần lấy kubia.default là đủ.

Kết luận

Vậy là ta đã tìm hiểu xong về Service Discovery, đây là phần lý thuyết rất quan trọng khi bạn làm việc với kubernetes. Nếu có thắc mắc hoặc cần giải thích rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment.

Mục tìm kiếm đồng đội

Hiện tại thì công ty bên mình, là Hoàng Phúc International, với hơn 30 năm kinh nghiệm trong lĩnh vực thời trang. Và sở hữu trang thương mại điện tử về thời trang lớn nhất Việt Nam. Team công nghệ của HPI đang tìm kiếm đồng đội cho các vị trí như:

Với mục tiêu trong vòng 5 năm tới về mảng công nghệ là:

  • Sẽ có trang web nằm trong top 10 trang web nhanh nhất VN với 20 triệu lượt truy cập mỗi tháng.
  • 5 triệu loyal customers và có hơn 10 triệu transactions mỗi năm.

Team đang xây dựng một hệ thống rất lớn với rất nhiều vấn để cần giải quyết, và sẽ có rất nhiều bài toàn thú vị cho các bạn. Nếu các bạn có hứng thú trong việc xây dựng một hệ thống lớn, linh hoạt, dễ dàng mở rộng, và performance cao với kiến trúc microservices thì hãy tham gia với tụi mình.

Nếu các bạn quan tâm hãy gửi CV ở trong trang tuyển dụng của Hoàng Phúc International hoặc qua email của mình nha _@.com. Cảm ơn các bạn đã đọc.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 65

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 51

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 30

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 22

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 66

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 96