Tìm hiểu Azure Container Instances

1024

Bài viết của tác giả Lion Phạm

Container, một công nghệ ảo hóa đang được rất nhiều lập trình viên quan tâm, sự xuất hiện của nó làm thay đổi rất nhiều đến cách mà chúng ta xây dựng & triển khai ứng dụng.

Tiếp tục là chủ đề về container và cũng là chủ đề về nền tảng điện toán đám mây Microsoft Azure, bài viết ngày hôm nay mình sẽ chia sẻ về một dịch vụ container hoàn toàn mới của Azure, với khả năng chạy các container trên Azure chỉ trong vài giây bằng một câu lệnh duy nhất cũng như cơ chế tính phí linh hoạt – tính tiền theo giây sử dụng. Dịch vụ mà chúng ta sẽ cùng nhau khám phá có tên gọi: Azure Container Instances.

Bài toán?

Đặt vấn đề bạn là một lập trình viên sử dụng công nghệ container vào trong quá trình phát triển & triển khai ứng dụng, sau quá trình phát triển, bạn đóng gói ứng dụng lại (containerize) vào 1 container image đẹp đẽ với đầy đủ các thành phần cần thiết để chạy được ứng dụng và muốn triển khai nó lên Azure nhằm khai thác sức mạnh của nền tảng điện toán đám mây này mang lại. Tuy nhiên, để chạy được container đó bạn cần phải khởi tạo máy ảo và cài đặt container engine phù hợp vào máy ảo đó, công việc này thường tốn tương đối thời gian trong khi bạn muốn triển khai được container của mình lên Azure trong một khoảng thời gian ngắn và không muốn đụng tay vào các công việc về cấu hình & quản lý máy ảo. Nếu sử dụng dịch vụ Azure Container Service thì quá cồng kềnh với nhiều bước thiết lập phức tạp và cũng tốn nhiều thời gian. Vậy giải pháp ở đây là gì? Câu trả lời là Azure Container Instances.

Azure Container Instances là gì?

Azure Container Instances là dịch vụ để giải quyết các vấn đề trong bài toán nói trên, nó cho phép lập trình viên:

  • Làm mờ đi khái niệm máy ảo qua việc cho phép triển khai container lên cloud mà không phải bận tâm tới việc khởi tạo, cấu hình & vận hành máy ảo.
  • Khả năng triển khai container lên cloud chỉ với một vài dòng lệnh.
    Azure Container Instances có thể nhanh chóng được tạo thông qua Azure Portal hoặc qua Azure CLI. Chỉ với vài dòng lệnh với Azure CLI, container image của bạn sẽ nhanh chóng được pull về từ container registry như Docker Hub hoặc Azure Container Registry và triển khai lên hạ tầng của Azure.
    Dưới đây là một đoạn code khởi tạo contain instance với container image là wordpress được pull về từ Docker Hub:
  • Tối ưu chi phí với cơ chế tính tiền linh hoạt, với khả năng tính tiền theo số giây sử dụng dựa trên số vCPU và GB bộ nhớ RAM được cấu hình.
    Azure Container Instances sẽ tính 1 khoản phí nhỏ cho mỗi instance được tạo ra thành công và sẽ tính phí dựa vào số tài nguyên tiêu thụ trên từng instance này theo từng giây sử dụng với bảng chi phí tham khảo sau:
Chi phi khởi tạo 1 container instance $0.0025
Chi phí tiêu thụ 1 core vCPU trong 1 giây cho 1 container instance $0.0000125
Chi phí tiêu thụ 1 core RAM trong 1 giây cho 1 container instance $ 0.0000125

(cập nhật tại thời điểm viết bài viết này)

  • Khả năng cấu hình số vCPU và RAM linh hoạt theo nhu cầu thực tế mà ứng dụng cần.
    Azure Container Instances cho phép bạn tùy chọn chính xác số lượng vCPU và RAM cần thiết để chạy được ứng dụng. Tính đến thời điểm viết bài viết này, Azure Container Instances hỗ trợ bạn cấu hình tối đa 4 core  vCPU và 14 GB RAM cho 1 container instance với cấu hình tối thiểu 1 core vCPU và 1 GB RAM cho 1 container instance.
    Giả sử tháng vừa rồi mình tạo ra 3 container instance với cấu hình mỗi instance là 2 core vCPU và 4 GB RAM. 3 instance này chỉ chạy trong 1000 giây thôi. Như vậy chi phí mình sẽ phải trả cho tháng đấy là:
Số container instance được khởi tạo thành công 3
Số core vCPU cho mỗi container instance 2
Số GB RAM cho mỗi container instance 4
Tổng số giây mỗi container instance chạy trong tháng 1000
Tổng số tiền chi phí khởi tạo container instance 3 (container instance) x $0.0025 = $0.0075
Tổng số tiền chi phí cho tiêu thụ vCPU 3 (container instance) x 2 (core vCPU) x $0.0000125 x 1000 (giây) = $0.075
Tổng số tiền chi phí cho tiêu thụ RAM 3 (container instance) x 2 (GB RAM) x $0.0000125 x 1000 (giây) = $0.075
Tổng số tiền phải trả cho tháng $0.0075 + $0.075 + $0.075 = $0.1575

Azure Container Instances khác gì Azure Container Service?

Azure Container Service hướng tới một giải pháp hoàn chỉnh cho các bài toán về container bao gồm các công cụ triển khai, quản lý & điều phối (container orchestration) các container cũng như cung cấp các tính năng về scaling & load balancing linh hoạt.

Còn Azure Container Instances lại hướng tới giải pháp cung cấp một dịch vụ về container tối giản, cung cấp những chức năng cơ bản nhất để lập trình viên nhanh chóng triển khai được ứng dụng container của họ lên cloud mà không phải bận tâm đến các công việc về quản lý, scale, điều phối container, …

Hiện tại trên Azure có một hệ sinh thái dành cho công nghệ container với nhiều dịch vụ được cung cấp để giải quyết các bài toán khác nhau liên quan đến công nghệ này, ví dụ như Azure Container Instances, Azure Container Service, Azure Container Register. Dưới đây là bảng so sánh các khả năng của một số dịch vụ về container trên Azure để bạn có thể tham khảo khi cần lựa chọn dịch vụ container phù hợp cho bài toán của mình:

Khả năng Azure Container Instances Azure Container Service Azure Container Registry
Chạy được container trên Azure X X
Chạy được container mà không cần thiết lập máy ảo X
Lưu trữ container image trên Azure X
Scale & orchestrate container sử dụng Kubernetes, DC/OS hay Docker Swarm được tích hợp sẵn X
Chạy được container nhanh chóng chỉ với 1 dòng lệnh X

Azure Container Instances hoạt động như thế nào?

Về mặt tính năng với người sử dụng, Azure Container Instances làm mờ đi khái niệm máy ảo khi sử dụng dịch vụ này. Tuy nhiên về mặt kiến trúc, Azure Container Instances vẫn sử dụng máy ảo làm hạ tầng của nó. Các container instance được tạo bởi Azure Container Instances sẽ được nhóm vào trong các container group và được chạy trong cùng một máy ảo và chia sẻ chung nguồn tài nguyên mạng và bộ nhớ. Nếu bạn đã từng sử dụng Kubernetes hay DC/OS, bạn sẽ thấy container group giống với khái niệm pod của 2 công cụ này.

Về hạ tầng mạng

Các container instance trong một container group sẽ cùng chia sẻ địa chỉ IP và port namespace. Khi khởi tạo container group, Azure Container Instances cho phép bạn tùy chọn có muốn các container instance bên trong nó có thể được truy cập trực tiếp từ Internet thông qua một địa chỉ IP public hay không. Bạn có thể tùy chọn tắt/bật khả năng này.

Để các container trong một container group có thể giao tiếp nội bộ được với nhau hoặc để điều hướng request từ bên ngoài tới đúng container mong muốn trong một container group thông qua địa chỉ IP public, bạn cần phải khai báo port cho các container đấy. Giống với ứng dụng web cài đặt trong web server như IIS hay Apache, mỗi một container instance trong container group cần có port riêng biệt. Trong trường hợp có nhiều hơn 1 container dùng chung port, việc khởi tạo container group sẽ rơi vào trạng thái lỗi, cụ thể là chỉ có container đầu tiên sẽ được khởi tạo, các container sau nó sẽ bị Terminated. Vì chia sẻ port namespace, nên kỹ thuật port mapping/port forwarding không thể sử dụng được trong Container Instances.

Ngoài ra, trong trường hợp bạn tùy chọn mở địa chỉ IP public cho container group, bạn cần phải thiết lập khai báo những port nào mà bạn mong muốn mở cho phép truy cập từ bên ngoài. Việc này khá giống với khi bạn cấu hình tường lửa (cho máy ảo chạy web server chẳng hạn), chỉ những port được cấu hình cho phép được truy cập từ bên ngoài thì các container sử dụng port đấy mới có thể truy cập được từ địa chỉ IP public. Còn trong trường hợp bạn chỉ muốn các container giao tiếp nội bộ với nhau thì bạn chỉ cần khai báo port chứ không cần phải khai báo mở port.

Về hạ tầng lưu trữ dữ liệu

Azure Container Instances mặc định là stateless, tức là khi container dừng hoạt động, mọi trạng thái, dữ liệu được lưu trữ trong container đấy sẽ bị xóa.

Để dữ liệu của container được lưu lại vĩnh viễn không phụ thuộc vào vòng đời của container, bạn cần phải sử dụng đến các giải pháp, dịch vụ lưu trữ dữ liệu bên ngoài. Azure Container Instances có tích hợp sẵn khả năng mount trực tiếp tới ổ đĩa lưu trữ sử dụng Azure Files Storage để làm nơi lưu trữ dữ liệu của container.

Dưới đây là diagram kiến trúc của một ví dụ về một container group được tạo thông qua Azure Container Instances:

  • Các container myacr.azurecr.io/app:v1 và myacr.azurecr.io/sidecar:v1 được khởi tạo trong cùng một container group có tên MyContainerGroup và có port được khai báo lần lượt là 80 và 5000. Các container này sẽ chia sẻ chung 1 một máy ảo làm hạ tầng máy chủ của nó.
  • MyContainerGroup được tùy chọn mở IP public với địa chỉ IP là 40.85.154.240.
  • Port 80 của container myacr.azurecr.io/app:v1 được mở ra ngoài với mục đích cho phép truy cập vào container này thông qua địa chỉ 40.85.154.240:80.
  • Port 5000 của container myacr.azurecr.io/sidecar:v1 không được mở ra ngoài mà chỉ được mở nội bộ với mục đích cho phép container myacr.azurecr.io/app:v1 tương tác với nó qua địa chỉ localhost:5000.
  • Mỗi container sẽ được mount tới một vùng lưu trữ riêng sử dụng Azure Files Storage, với file share là acishare1 của container myacr.azurecr.io/app:v1 và acishare2 của container myacr.azurecr.io/sidecar:v1.

Về cơ chế orchestration

Azure Container Instances được thiết kế ở mức tối giản nhất có thể nhằm mang đến cho người sử dụng khả năng triển khai container của mình lên Azure một cách nhanh chóng. Để làm được điều đó Azure đã lược giản đi một số tính năng phổ biến cho một dịch vụ về container trong đó có orchestration.

Orchestration là tính năng đóng vai trò quan trọng trong một hệ thống sử dụng container, nó giúp tự động hóa việc khởi tạo, điều phối & quản lý các container trong một hệ thống cũng như thiết lập cách các container tương tác với nhau. Có khá nhiều công cụ hỗ trợ công việc orchestration (được gọi là orchestrator) phổ biến như Kubernetes, DC/OS, hay Docker Swarm. Azure Container Service là dịch vụ về container có hỗ trợ tất cả các công cụ orchestrator kể trên.

Việc lược giản không có nghĩa Azure Container Instances không hỗ trợ orchestration. Trong một giải pháp orchestration cơ bản, có những công việc sau mà một orchestrator cần làm:

  • Schedule: Với một container image và các yêu cầu về tài nguyên hệ thống cụ thể, orchestrator cần tìm một máy chủ phù hợp để có thể chạy được container đấy.
  • Affinity/Anti-affinity: Linh hoạt trong việc cấu hình cho một nhóm các container nên chạy gần nhau (trong cùng một máy chủ chẳng hạn) để cải thiện hiệu suất hay cách xa nhau (khác máy chủ chẳng hạn) đủ để tăng tính sẵn sàng khi có sự cố xảy ra.
  • Health monitor: Theo dõi trạng thái của container và trong trường hợp xảy ra lỗi, orchestrator tự động thực hiện schedule lại những container bị gặp sự cố.
  • Failover: Theo dõi tình trạng hoạt động của từng máy chủ & kiểm soát các container chạy bên trong nó. Trong trường hợp máy chủ bị gặp sự cố, orchestrator sẵn sàng thực hiện schedule các container bên trong nó sang các máy chủ khác.
  • Scale: Thêm hoặc bớt các container instance để phù hợp với nhu cầu, orchestrator có thể làm công việc này một cách tự động hoặc thủ công bởi người vận hành.
  • Network: Cung cấp một hạ tầng mạng để phối hợp các container với nhau, cho phép tương tác qua lại giữa các container trong cùng một máy chủ hoặc giữa các máy chủ với nhau.
  • Service discovery: Cho phép các container có thể xác định được vị trí của nhau một cách tự động kể cả trong trường hợp chúng bị di chuyển qua máy chủ khác hoặc thay đổi địa chỉ IP.
  • Coordinated upgrades: Cơ chế quản lý việc nâng cấp các container nhằm tránh down time cho hệ thống ứng dụng cũng như khả năng rollback khi có sự cố xảy ra.

Azure Container Instances hỗ trợ orchestration ở mức rất cơ bản cụ thể là dịch vụ này chỉ cung cấp khả năng schedule cơ bản của một orchestrator mà không hỗ trợ các khả năng khác như scale hay coordinated upgrades. Tuy nhiên, Azure Container Instances hướng tới một giải pháp orchestration mở & linh hoạt hơn với việc hỗ trợ tích hợp với các công cụ orchestrator thứ ba như Kubernetes hay DC/OS thông qua phương pháp layered nhằm xây dựng thành một giải pháp orchestration tổng thể cho hệ thống ứng dụng.

Phương pháp layered

Layered về cơ bản là một phương pháp chia các nhiệm vụ trong orchestration ra thành các lớp công việc khác nhau và được thực hiện bởi các công cụ orchestrator khác nhau.

Cụ thể trong Azure Container Instances, các container được tạo, về mặt quản lý & điều phối hạ tầng bên dưới của các container này đều do Azure thực hiện, do vậy các công cụ orchestrator sẽ không cần phải quan tâm đến việc tìm kiếm máy chủ phù hợp để chạy được một container image. Nói một cách khác công việc schedule trong orchestration sẽ do Azure thực hiện. Ngoài ra, với sự linh hoạt của nền tảng điện toán đám mây, Azure Container Instances đảm bảo các container sẽ luôn chạy, như vậy công việc heath monitor hay failover cũng sẽ do Azure đảm nhận. Các công cụ orchestrator chỉ cần tập trung vào những công việc liên quan đến quản lý nhiều các container được tạo bởi Azure Container Instances cũng như các container bên ngoài nhưng trong cùng một hệ thống ví dụ như scale hay coordinated upgrades.

Azure Container Instances Connector for Kubernetes

Ở thời điểm viết bài viết này, khả năng tích hợp với các orchestrator của Azure Container Instances (ACI) còn khá hạn chế, Microsoft mới chỉ giới thiệu một phiên bản thử nghiệm của connector cho Kubernetes, với khả năng tích hợp công cụ Kubernetes với Azure Container Instances. Connector này cho phép các Kubernetes cluster có thể triển khai được container thông qua Azure Container Instances bằng cách bắt chiếc cơ chế hoạt động của kubelet trong K8S với việc khai báo một node với unlimited capacity và thực hiện schedule pod sử dụng Azure Container Instances thay vì sử dụng container engine trên máy ảo. Connector cho K8S này đang được mở nguồn và bạn có thể tham gia đóng góp cho connector này trên GitHub tại đây.

Về hệ điều hành được hỗ trợ, Azure Container Instances hiện hỗ trợ 2 hệ điều hành là Windows và Linux.

Bắt đầu làm quen với Azure Container Instances

Làm quen với một công nghệ mới không có cách nào tốt hơn bằng việc dùng thử nó. Trong phần này mình sẽ cùng các bạn tạo ra một container group có chứa 2 container image khác nhau sử dụng Azure Container Instances.

Mình sẽ sử dụng Azure CLI để thực hiện phần thực hành này. Bạn có thể sử dụng Azure Cloud Shell, một công cụ giả lập Azure CLI với khả năng chạy trực tiếp trên Azure Portal hoặc cài đặt Azure CLI vào máy tính để sử dụng. Mình sẽ sử dụng Azure Cloud Shell.

Khởi động Azure Cloud Shell

Để mở Azure Cloud Shell, tại giao diện Azure Portal, bạn chọn Cloud Shell ở thanh công cụ nằm phía trên giao diện. Ngay sau đó, cửa sổ Azure Cloud Shell sẽ xuất hiện ngay bên dưới giao diện của Azure Portal.

Khởi tạo Azure Resource Group

Mỗi dịch vụ được tạo trên Azure cần được lưu & quản lý theo Resource Group. Do vậy bạn cần khởi tạo 1 Resource Group để chứa dịch vụ Azure Container Instances mà bạn sẽ tạo ở những bước tiếp theo.

Để khởi tạo Resource Group bằng Azure CLI, bạn cần sử dụng cú pháp az group create.

Dưới đây là đoạn lệnh nhằm khai báo Resource Group có tên là LionContainerResourceGroup và có vị trí là West US:

Xây dựng ARM template

ARM (Azure Resource Manager) template là một tập tin có cấu trúc sử dụng định dạng JSON, chứa các thông tin cấu hình về dịch vụ mà bạn sẽ triển khai trên Azure. Thông tin về ARM template bạn có thể tìm hiểu thêm tại đây.

Bạn sẽ cần phải khai báo cấu hình của dịch vụ Azure Container Instances mà bạn muốn khởi tạo trong thuộc tính resourcesdưới dạng 1 resource object có type là Microsoft.ContainerInstance/containerGroups. Dưới đây là một ví dụ:

Mình đã chuẩn bị sẵn một ARM template với nội dung định nghĩa một container group có tên LionContainerGroup, chứa 2 container là:

  • aci-tutorial-app có image là microsoft/aci-helloworld:latest: Là một ứng dụng web Hello World đơn giản. Ứng dụng này sử dụng port 80.
  • aci-tutorial-sidecar có image là microsoft/aci-tutorial-sidecar: Là một ứng dụng dummy sẽ tương tác với ứng dụng web Hello World trên thông qua HTTP request.

container group này được cấu hình mở IP public với port được mở là 80.

ARM template này các bạn có thể tải về tại đây.

Khởi tạo Azure Container Instances sử dụng ARM template

Sau khi xây dựng xong ARM template, mình sẽ thực hiện triển khai ARM template này thông qua cú pháp az group deployment create để khởi tạo dịch vụ Azure Container Instances với cấu hình được khai báo trong template:

Bạn sẽ nhận thấy tốc độ khởi tạo container của Azure Container Instances ở đây. Chỉ trong vài giây hoặc chưa đầy 1 phút, 2 container đã được triển khai lên hạ tầng của Azure thành công và sẵn sàng để chạy. Bạn có thể xem thông tin về container group vừa được tạo của bạn thông qua cú pháp az container show:

 

Với IP public được mở, bạn có thể dễ dàng truy cập vào container aci-tutorial-app thông qua IP được cung cấp, ví dụ ở đây là 13.93.162.101:

Kết luận

Có thể thấy Azure Container Instances là một bước đột phá của Microsoft trong cuộc đua nhằm cung cấp các dịch vụ về container trên cloud. Azure Container Instances mang tới khả năng triển khai các container lên cloud một cách nhanh chóng cùng cơ chế tính phí linh hoạt.

Với các đặc điểm nhanh & linh hoạt nói trên, Azure Container Instances có thể được ứng dụng ở nhiều bài toán đặc biệt phù hợp với các bài toán cần nhanh chóng triển khai container & chạy trong một khoảng thời gian mang tính thời vụ. Lấy một ví dụ bạn đang có một hệ thống sử dụng công nghệ container và những container trong hệ thống này được chạy trên một hạ tầng máy chủ của riêng bạn. Hệ thống của bạn có lưu lượng sử dụng khá ổn định tuy nhiên trong 1 năm có khoảng vài đợt lưu lượng sử dụng tăng lên đột biến trong khoảng thời gian không dài. Trong những trường hợp tăng đột biến như vậy, orchestrator của hệ thống sẽ thực hiện nhiệm vụ scale các container đang chịu tải cao. Hướng tiếp cận có thể là scale out số lượng máy chủ chứa những container bị chịu tải cao và triển khai những container này vào các máy chủ mới. Tuy nhiên cách làm này sẽ mất thời gian và chi phí không thấp. Nhưng nếu chuyển sang hướng scale bằng cách triển khai thêm các container nói trên sử dụng Azure Container Instances thì tốc độ triển khai và chi phí sẽ được rút xuống đáng kể.

Azure Container Instances hiện đang trong giai đoạn Public Preview với nhiều tính năng còn hạn chế. Thông tin về dịch vụ này bạn có thể tìm hiểu thêm tại đây.

Happy containerizing!


AI (artificial intelligence) – Trí tuệ nhân tạo hay trí thông minh nhân tạo có thể được định nghĩa như một ngành của khoa học máy tính liên quan đến việc tự động hóa các hành vi thông minh, hay được hiểu như là trí tuệ của máy móc được tạo ra bởi con người; hiện nay  AI được áp dụng trong rất nhiều ngành nghề và công việc khác nhau, ví như có thể dùng để điều khiển một vật thể; có thể phân tích và lập luận để trả lời câu hỏi của khách hàng; hiểu ngôn ngữ để giao tiếp;…

Sự kiện AI – ỨNG DỤNG THỰC TIỄN VÀ CÁCH BẮT ĐẦU sẽ đem đến cho các bạn một cái nhìn tổng quan về AI cũng như các ứng dụng thực tiễn của nó vào một số khía cạnh trong thông qua một số chủ đề:

Topic 1: Triển khai Saas trên nền tảng cloud tối ưu tốc độ và chi phí + Ứng dụng Azure vào mô hình này

Topic 2: Ứng dụng AI vào tối đa hiệu quả marketing của E-commerce & cách ứng dụng Azure vào mô hình này

Topic 3: Ứng dụng AI trong fintech để chống gian lận

Topic 4: Triển khai chatbot thông minh ứng dụng AI trả lời tự động & ứng dụng Azure

AI – Ứng dụng thực tiễn và cách bắt đầu

Tp Hồ Chí Minh : Dreamplex 2, 195 Điện Biên Phủ, F.15, Q. Bình Thạnh 

^FBCB3E50DB113E7C896A008997E52E67C2DF29F07B5E587F11^pimgpsh_fullsize_distr

Techtalk Via blog.lionpham.com

CHIA SẺ