Kubernetes và các ứng dụng được tăng tốc trên container

Kubernetes là một nền tảng mã nguồn mở để tự động hóa việc điều phối các triển khai container, mở rộng quy mô và quản lý các ứng dụng bên trong container.

Kubernetes là gì?

Kubernetes cung cấp một framework cho việc triển khai, quản lý, co dãn quy mô và chuyển đổi dự phòng của Container phân tán, là các microservices được đóng gói với các dependencies và cấu hình của chúng.

Được xây dựng dựa trên hơn mười năm kinh nghiệm phát triển các hệ thống container management tại Google, kết hợp với các ý tưởng và kinh nghiệm sử dụng từ ​​cộng đồng.

Tại sao lại là Kubernetes?

Software container đã được phổ biến rộng rãi với việc ra mắt của nền tảng Docker vào năm 2013 và giờ là Moby. Container package hoạt động trong một môi trường, bao gồm ứng dụng cộng với các thành phần phụ thuộc (dependencies), thư viện và các file binary cũng như các file cấu hình cần thiết để thực hiện ứng dụng. So với máy ảo, các container có các lợi ích cách biệt và tài nguyên tương tự, nhưng nhẹ hơn vì các Container ảo hóa hệ điều hành thay vì phần cứng. Các Container dễ mang theo hơn, chiếm ít dung lượng hơn, sử dụng ít tài nguyên hệ thống hơn và có thể được mở rộng trong vài giây. Các Container cũng mang lại hiệu quả cho các nhà phát triển. Thay vì chờ các hoạt động cung cấp máy móc, các nhóm DevOps có thể nhanh chóng đóng gói ứng dụng vào một Container và triển khai ứng dụng đó một cách dễ dàng và nhất quán trên các nền tảng khác nhau, cho dù là máy tính xách tay, trung tâm dữ liệu riêng, đám mây công cộng hay môi trường kết hợp.

Tài liệu tham khảo https://www.docker.com/resources/what-container

Vì những lợi ích của chúng, các Container đã ngay lập tức gây ấn tượng với các nhà phát triển và nhanh chóng trở thành lựa chọn phổ biến để triển khai ứng dụng đám mây. Sự phổ biến của các Container có nghĩa là một số tổ chức đã sớm vận hành hàng nghìn Container, tạo ra nhu cầu tự động hóa việc quản lý. Bằng cách làm cho các vùng chứa dễ quản lý hơn, Kubernetes đã trở nên phổ biến và cũng làm cho các vùng chứa trở thành xu hướng chủ đạo bằng cách tiếp tục cho phép kiến ​​trúc microservices thúc đẩy phân phối nhanh chóng và điều phối các ứng dụng dựa trên đám mây có thể mở rộng.

Cloud Native Computing Foundation được thành lập như một dự án của Linux Foundation vào năm 2015 để thúc đẩy việc áp dụng các công nghệ dựa trên đám mây. Chúng bao gồm các Container, lưới dịch vụ, microservices, cơ sở hạ tầng bất biến và API khai báo, đồng thời sắp xếp các nhà phát triển xung quanh một bộ tiêu chuẩn chung. CNCF đóng vai trò là ngôi nhà trung lập của các nhà cung cấp nhiều dự án nguồn mở phát triển nhanh nhất, bao gồm cả Kubernetes. Công việc của nhóm đã được ghi nhận là đã giúp ngăn chặn các nhánh mã Kubernetes xuất hiện. Do đó, mọi nền tảng điện toán và nhà cung cấp đám mây lớn hiện đều hỗ trợ cùng một cơ sở mã Kubernetes. Mặc dù các phiên bản Kubernetes có thương hiệu đã xuất hiện, chẳng hạn như Red Hat OpenShift hoặc Amazon Elastic Kubernetes Service, nhưng mã cơ bản vẫn giống nhau.

Kubernetes hoạt động như thế nào?

Kubernetes đã giới thiệu một khái niệm nhóm gọi là “pod” cho phép nhiều Container chạy trên máy chủ và chia sẻ tài nguyên mà không có nguy cơ xung đột. Một pod có thể được sử dụng để xác định các dịch vụ được chia sẻ như thư mục, địa chỉ IP hoặc bộ lưu trữ và hiển thị dịch vụ đó cho tất cả các Container trong pod. Điều này cho phép các dịch vụ trong một ứng dụng được chứa và chạy cùng nhau vì mỗi Container được liên kết chặt chẽ với ứng dụng chính.

Tài liệu tham khảo https://kubernetes.io/docs/concepts/workloads/pods/

Một node đủ động là kubelet quản lý các pob, Container và hình ảnh. Bộ điều khiển Kubernetes quản lý các pod và đảm bảo các tài nguyên thích hợp được phân bổ đạt được mức hiệu suất và khả năng mở rộng mong muốn.

Tài liệu tham khảo https://kubernetes.io/docs/concepts/overview/components/

Kubernetes cung cấp nhiều dịch vụ hữu ích, đặc biệt là trong môi trường clustered. Tự động tìm kiếm dịch vụ và cân bằng tải, tự động kết nối hệ thống lưu trữ và tự động triển khai và khôi phục để đạt được trạng thái mong muốn được chỉ định. Nó cũng giám sát tình trạng của Container, khởi động lại các Container bị lỗi và cho phép thông tin nhạy cảm như mật khẩu và khóa mã hóa được lưu trữ an toàn trong các Container.

Điều này giúp đơn giản hóa việc quản lý máy móc và dịch vụ, cho phép một quản trị viên duy nhất quản lý hàng nghìn Container đang chạy đồng thời. Kubernetes cũng cho phép điều phối giữa việc triển khai tại chỗ với đám mây công cộng hoặc riêng tư.

Kubernetes đã tạo ra nhiều sự hứng thú về lời hứa với tư cách là một nền tảng để kích hoạt điện toán đám mây lai. Vì cơ sở code giống nhau trong mọi môi trường vật lý và ảo hoá, nên về mặt lý thuyết các ứng dụng được chứa trong Container có thể chạy trên bất kỳ nền tảng nào hỗ trợ Kubernetes. Ngành công nghiệp tiếp tục tranh luận về giá trị của kiến ​​trúc lai. Có rất nhiều người ủng hộ trong khi có những người phản đối vì lập luận rằng nó sẽ phải đánh đổi cho tính di động là các nhà phát triển bị giới hạn trong một phạm vi hẹp của các công nghệ nguồn mở và không thể tận dụng toàn bộ chức năng của dịch vụ trên đám mây có thương hiệu và trên nền tảng cơ sở.

Các trường hợp sử dụng Kubernetes

Như đã lưu ý ở trên, triển khai kết hợp và nhiều đám mây là một trường hợp sử dụng tuyệt vời của Kubernetes vì ​​các ứng dụng không cần phải nối với một nền tảng cơ bản. Kubernetes xử lý phân bổ tài nguyên và theo dõi tình trạng của Container đảm bảo rằng các dịch vụ luôn sẵn sàng khi cần.

Kubernetes rất phù hợp với các môi trường có tính khả dụng quan trọng vì bộ điều phối bảo vệ chống lại các sự cố như phiên bản lỗi, xung đột port và tắc nghẽn tài nguyên.

Container là công nghệ nền tảng cho điện toán không có máy chủ, trong đó các ứng dụng được xây dựng từ các dịch vụ trở nên sống động và thực thi một chức năng chỉ dành cho nhu cầu của ứng dụng đó. Điện toán không có máy chủ (Serverless computing) có một chút nhầm lẫn vì các Container phải chạy trên máy chủ. Nhưng mục tiêu là giảm thiểu chi phí và thời gian cần thiết để cung cấp máy ảo bằng cách đóng gói chúng trong các Container có thể chạy trong mili giây được quản lý bởi Kubernetes.

Kubernetes cũng có một tính năng gọi là không gian tên (namespace), là một cụm ảo trong cụm. Điều này cho phép các nhóm vận hành và phát triển chia sẻ cùng một bộ máy vật lý và truy cập các dịch vụ giống nhau mà không tạo ra xung đột.

Tại sao Kubernetes lại quan trọng đối với…

Data scientists

Một trong những thách thức của khoa học dữ liệu là tạo ra các thử nghiệm có thể lặp lại trong môi trường có thể lặp lại với khả năng theo dõi và giám sát các số liệu trong quá trình sản xuất. Các Container cung cấp khả năng tạo các quy trình có thể lặp lại với nhiều giai đoạn phối hợp hoạt động cùng nhau theo cách có thể lặp lại để xử lý, trích xuất tính năng và thử nghiệm.

Cấu hình khai báo trong Kubernetes mô tả kết nối giữa các dịch vụ. Kiến trúc vi dịch vụ (microservice) cho phép sửa lỗi dễ dàng hơn và cải thiện sự hợp tác giữa các thành viên trong nhóm khoa học dữ liệu. Các nhà khoa học dữ liệu cũng có thể tận dụng các tiện ích mở rộng như BinderHub , cho phép họ xây dựng và đăng ký bộ Container từ kho lưu trữ và trích xuất chúng dưới dạng notebook dùng chung mà những người dùng khác có thể tương tác.

Các tiện ích mở rộng khác như Kubeflow hợp lý hóa quy trình thiết lập, duy trì quy trình và quy trình học máy trong Kubernetes. Lợi ích về tính di động của bộ điều phối giúp nhà khoa học dữ liệu có thể phát triển trên máy tính xách tay và triển khai ở mọi nơi.

Devops

Đưa các mô hình máy học vào sản xuất có thể là một cuộc đấu tranh đối với các kỹ sư dữ liệu. Họ dành thời gian chỉnh sửa các tệp cấu hình, phân bổ tài nguyên máy chủ và lo lắng về cách mở rộng quy mô mô hình và kết hợp GPU mà không khiến dự án gặp sự cố. Hệ sinh thái Container đã giới thiệu nhiều công cụ nhằm giúp công việc của kỹ sư dữ liệu dễ dàng hơn.

Ví dụ: Istio là dịch vụ mã nguồn mở, có thể định cấu hình, giúp dễ dàng tạo mạng lưới các dịch vụ được triển khai với khả năng cân bằng tải tự động, xác thực dịch vụ đến dịch vụ và giám sát với ít hoặc không thay đổi mã dịch vụ. Cung cấp khả năng kiểm soát chi tiết về hành vi lưu lượng truy cập, quy tắc định tuyến phong phú, thử lại, chuyển đổi dự phòng và chèn lỗi, cùng với lớp chính sách có thể kết nối và API cấu hình để kiểm soát truy cập, giới hạn tốc độ và dung lượng.

Hệ sinh thái Kubernetes đang tiếp tục phát triển với các công cụ chuyên dụng như vậy để ẩn cấu hình máy chủ và cho phép các kỹ sư dữ liệu trực quan hóa các phụ thuộc giúp cấu hình và khắc phục sự cố dễ dàng hơn.

Tại sao Kubernetes chạy tốt hơn với GPU

Kubernetes bao gồm hỗ trợ cho GPU, giúp dễ dàng định cấu hình và sử dụng tài nguyên GPU để tăng tốc khối lượng công việc như khoa học dữ liệu, học máy và học sâu. Bổ sung thiết bị cho phép pods truy cập vào các tính năng phần cứng chuyên dụng như GPU và hiển thị chúng dưới dạng tài nguyên có thể lập lịch trình.

Với số lượng ngày càng tăng của các ứng dụng và dịch vụ do AI cung cấp cũng như tính khả dụng rộng rãi của GPU trong đám mây công cộng, nhu cầu nhận biết GPU của Kubernetes ngày càng tăng. NVIDIA đã liên tục xây dựng thư viện phần mềm của mình để tối ưu hóa GPU để sử dụng trong môi trường Container. Ví dụ: Kubernetes trên NVIDIA GPUs cho phép các cụm GPU đa đám mây được mở rộng một cách liền mạch với việc triển khai, bảo trì, lên lịch và vận hành tự động các Container được tăng tốc GPU trên multi-node clusters.

Kubernetes với NVIDIA GPU có các tính năng chính sau:

  • Cho phép hỗ trợ GPU trong Kubernetes bằng thiết bị của NVIDIA
  • Chỉ định các thuộc tính GPU như loại GPU và yêu cầu bộ nhớ để triển khai trong các cụm GPU không đồng nhất
  • Cho phép trực quan hóa và giám sát các số liệu cũng như tình trạng của GPU với ngăn giám sát GPU tích hợp của NVIDIA DCGM, Prometheus và Grafana
  • Hỗ trợ nhiều thời gian chạy Container cơ bản như Docker và CRI-O
  • Chính thức được hỗ trợ trên các hệ thống NVIDIA DGX

NVIDIA EGX stack là ngăn xếp phần mềm gốc trên đám mây và có thể mở rộng, cho phép điện toán AI tăng tốc được đóng gói trong Container do Kubernetes quản lý. Với NVIDIA EGX stack, các tổ chức có thể dễ dàng triển khai các Container AI được cập nhật trong vài phút.

Tuy nhiên, Kubernetes không phải là “viên đạn bạc”. Nó cung cấp các API tốt để tìm kiếm và quản lý tài nguyên, nhưng nó không phải là toàn bộ giải pháp khi làm cho các tài nguyên đó trở nên dễ sử dụng. Vì điều này, NVIDIA đã phát triển Triton, một nền tảng phục vụ suy luận mã nguồn mở cho phép người dùng triển khai các mô hình đào tạo AI trên bất kỳ giao diện dựa trên GPU hoặc CPU nào. Bằng cách chạy Triton trong môi trường Kubernetes, có thể tách hoàn toàn phần cứng khỏi phần mềm. Trong trường hợp này, Kubernetes đóng vai trò là chất nền mà Triton chạy trên đó. Triton xử lý phần trừu tượng hóa của phần cứng trong node, trong khi Kubernetes điều phối cụm, cho phép cụm mở rộng hiệu quả hơn.

Kubernetes với phần cứng GPU

Ngoài phần mềm, NVIDIA cũng đã thực hiện các bước để điều chỉnh phần cứng của mình để sử dụng trong môi trường ảo hóa. Tuy nhiên, điều này không chỉ dành riêng cho Kubernetes. Với việc ra mắt Ampere-based A100 enterprise GPUs và hệ thống DGX A100, NVIDIA đã giới thiệu GPU đa phiên bản (MIG). MIG cho phép chia một GPU A100 thành 7 GPU nhỏ hơn, tương tự như cách CPU có thể được phân chia thành các cores riêng lẻ. Điều này cho phép người dùng tự động điều chỉnh quy mô ứng dụng của họ bằng cách sử dụng container runtime như Kubernetes với độ chi tiết cao hơn.

Với MIG, mỗi node trong cụm Kubernetes được tăng tốc bởi GPU sẽ đòi hỏi GPU chuyên dụng của riêng nó. Với MIG, chỉ một NVIDIA DGX A100 gắn 8 GPU A100, và hỗ trợ đến 7 GPU nhỏ. Điều này cho phép ứng dụng và tài nguyên mở rộng quy mô mang tính tuyến tính hơn.

Khi việc phục vụ cho AI trở thành nhiệm vụ chính của các workload được tăng tốc bởi GPU trong thời điểm hiện tại, GPU sẽ bắt đầu chuyển sang xu hướng chủ đạo của Kubernetes. Khi mọi thứ được mở rộng, chúng ta sẽ nghĩ về việc tăng tốc GPU một cách nhanh chóng hoặc hiệu quả và không phải nghĩ về việc phát triển hoặc lập trình GPU.

____
Bài viết liên quan
Góp ý / Liên hệ tác giả