Trường hợp sử dụng – Quy trình xây dựng, kiểm thử, triển khai hình ảnh container gốc đám mây cho Kubernetes với Artifactory
Talk transcription:
(Kit và Ray — chuyển đổi nhanh) Bạn làm đi. Thế nào? Ừ.
(Kit) Tôi kiểm soát được rồi. Đây nhé.
(Ray) Chào buổi sáng mọi người. Cảm ơn đã đến phiên này. Tôi là Ray, đại diện phát triển của Google Cloud Platform. Công việc của tôi là đem những công nghệ mới nhất của Google tới cộng đồng phát triển và lắng nghe phản hồi, cũng như chia sẻ trải nghiệm sử dụng thực tế từ các bạn. Nếu muốn liên hệ, Twitter @saturnism là cách tốt nhất.
(Kit) Tôi là Kit, quản lý sản phẩm tại Google Cloud. Tôi từng tham gia dự án Kubernetes từ những ngày đầu, từng làm việc với Container Engine, Container Registry và hiện vẫn rất tích cực trong cộng đồng container. Hiện tại, tôi phát triển Cloud Launcher – chợ ứng dụng của hệ sinh thái Google Cloud, đồng thời xây dựng quan hệ đối tác cùng các doanh nghiệp như JFrog. Mục tiêu của tôi luôn là phát triển hệ sinh thái mở.
(Kit) Nội dung hôm nay, trước tiên chúng tôi có khảo sát nhanh thì thấy không nhiều người thực sự sử dụng hoặc biết về Kubernetes, nên sẽ giới thiệu cơ bản về Kubernetes, rồi trình diễn trực tiếp một số đoạn mã, chỉ dẫn thao tác thực tế và cùng các bạn khám phá sâu hơn.
(Kit) Bắt đầu với khái niệm: cách triển khai truyền thống. Đa phần các bạn quen thuộc với việc deploy lên VM hoặc máy vật lý – mọi thứ gom chung lại, từ file thực thi, cấu hình, và phải đảm bảo tránh xung đột phiên bản. Tất cả đóng thành một image để quản lý triển khai, nhưng rất khó kiểm soát trạng thái thực tế cũng như phát sinh lỗi do thay đổi không kiểm soát. Triển khai immutable với VM image có thể là một giải pháp, nhưng lại nặng nề và mất nhiều thời gian khởi động.
(Kit) Xu hướng hiện nay là container. Với khối đóng gói gọn nhẹ chỉ mang những phụ thuộc cần thiết, container đem lại khả năng di động cao, độ tin cậy lớn hơn rất nhiều trong quá trình triển khai. Nhiều ứng dụng có thể chạy cạnh nhau, dù có thể chứa các binary xung đột, thậm chí trên cùng một máy vật lý hoặc VM. Đây là lợi thế vượt trội giúp developer tăng tốc đưa sản phẩm ra thị trường.
(Kit) Và có thể khiến bạn ngạc nhiên, nhưng tại Google, chúng tôi đã xây dựng và sử dụng hệ thống mang tên Borg để vận hành container suốt hơn 10 năm. Google cũng đóng góp c-groups cho Linux – nền tảng của công nghệ container hiện đại. Hầu hết các công ty internet lớn như Twitter, Facebook cũng áp dụng cách tiếp cận này. Tại Google, từ Gmail, tìm kiếm tới YouTube đều vận hành trên nền tảng container.
(Kit) Điều này cho phép chúng tôi tách rời công việc của kỹ sư phát triển khỏi đội ngũ xây dựng data center. Hình dung việc xây dựng data center mất rất nhiều thời gian, còn phát triển tính năng thì lại cần nhanh chóng. Nếu không tách biệt được quy trình, sẽ có nhiều mâu thuẫn nội bộ. Và đó là lý do cần tới nền tảng điều phối container.
(Kit) Vậy với vai trò developer nội bộ Google, tôi sẽ khai báo một “Borg job”. Ví dụ, tôi định nghĩa một công việc hello world, gán cho nó “cell” – là nhóm 10.000 máy trong data center (tôi không cần biết cụ thể máy nào). Tôi chỉ định binary, vị trí source, các tham số môi trường (ví dụ port), tài nguyên cần thiết như CPU/RAM/Disk, và số lượng replica – thông thường, ở Google không chỉ dừng ở 5 mà có thể là 10.000 instance. Đó là toàn bộ cấu hình tôi cần để triển khai sản phẩm ra thế giới.
(Kit) Và phía sau là kiến trúc nền tảng Borg: developer đưa binary vào kho lưu trữ, thiết lập cấu hình tại Borg master, Borg master phối hợp với scheduler để lên kế hoạch phân bổ tài nguyên và triển khai lên các máy phù hợp trong data center. Toàn bộ quy trình tối ưu hóa, giám sát và vận hành đều tự động hóa, giúp đảm bảo hàng ngàn “hello world app” chạy ổn định, linh hoạt.
(Kit) Giờ nói tới Kubernetes. Câu hỏi thường gặp là tên này từ đâu ra? Kubernetes nghĩa là “người lái tàu” – lấy cảm hứng từ chủ đề hàng hải của Docker. K8S là tên viết tắt (8 ký tự giữa chữ K và S). Về bản chất, Kubernetes là phiên bản “tái thiết kế” của Borg để phổ cập ra cộng đồng, được viết bằng Go, hoàn toàn mã nguồn mở, cộng đồng ngày càng lớn mạnh với nhiều doanh nghiệp chọn làm nền tảng chiến lược. Cloud Data Computing Foundation cũng được thành lập để quản lý và duy trì tính mở, độc lập nhà cung cấp cho các dự án như Kubernetes. Tôi rất tự hào khi được đồng hành cùng dự án này và mời các bạn trải nghiệm.
(Kit) Kiến trúc Kubernetes khá tương tự như Borg, chỉ đổi tên thành phần. Trong slide hôm nay chúng tôi bổ sung Artifactory thay cho binary store, quy trình gồm: đóng gói image đưa vào container store (Artifactory), cấu hình bằng file config đẩy lên Kubernetes master. Master phối hợp scheduler để lên lịch, phân bổ ra node (VM) qua kubelet, kéo và vận hành image. Toàn bộ quy trình thống nhất cho mọi developer Google.
(Kit) Đó là phần trình bày slide, giờ sẽ tới demo. Mời Ray tiếp tục.
(Ray) Cảm ơn Kit.
(Ray) Tôi sẽ trình bày demo thực tế với một ứng dụng “đẹp nhất” tôi từng làm, thực ra là ứng dụng demo với Bootstrap, gồm hai phần: hello world và guestbook (sổ lưu bút). Người dùng nhập tên, nhấn nút sẽ hiện lời chào, đồng thời ghi nhận dữ liệu qua backend vào MySQL.
(Ray) Ứng dụng này tuân theo kiến trúc microservices – frontend tách rời backend với hai dịch vụ hello world và guestbook phía sau, sử dụng JSON/HTTP/REST để giao tiếp. Khi xây dựng theo dạng này, số lượng thành phần độc lập cần quản lý tăng lên rất nhanh.
(Ray) Để quản lý, bạn cần các công cụ hỗ trợ. Ví dụ ở đây ngoài 3 thành phần chính còn có cả persistent storage: Redis dạng memory database hỗ trợ session replication, MySQL làm nơi lưu trữ dữ liệu ổn định. Đây là ứng dụng tôi sẽ lấy làm demo cách triển khai, vận hành trên Kubernetes và xây dựng pipeline CI/CD – từ check-in code, build/test, promote image với Artifactory đến deploy dạng rolling update.
(Ray) Demo được thực hiện trên Google Container Engine (dịch vụ Kubernetes managed bởi Google), lưu ý Kubernetes có thể chạy trên bất kỳ môi trường nào: cloud, on-prem, thậm chí là cluster Raspberry Pi. Ở đây tôi dùng cloud với 4 node (4 VM), preview container là Spring Boot app dạng hello world, REST controller trả về lời chào, code bằng Groovy.
(Ray) Ứng dụng đã được đóng gói thành image. Dành cho ai mới với Docker: cách đóng gói sử dụng file Dockerfile, tự mô tả từng bước cần thiết để tạo image kèm runtime (Java, Groovy, Spring Boot v.v.). Nhờ đó, toàn bộ môi trường có thể tái tạo, đồng nhất ở mọi nơi triển khai.
(Ray) Với image đã có, để triển khai trên cluster, tôi dùng lệnh kubectl run. Kubectl là công cụ dòng lệnh giao tiếp với Kubernetes cluster, mỗi thao tác là một API call có thể tích hợp vào tool khác. Ví dụ: chỉ định tên ứng dụng, image, labels… Trong Kubernetes, label là cặp key-value gán cho mọi resource để tìm kiếm, phân loại, quản lý dễ dàng. Bạn có thể filter theo label (ví dụ, environment=staging, version=1.0), rất tiện lợi khi vận hành hệ thống lớn.
(Ray) Sau khi chạy, Kubernetes tự động chọn node phù hợp để deploy, tôi không cần quan tâm cụ thể nằm trên máy nào. Ngoài container (hộp màu xám), khái niệm “pod” là nhóm các container chia sẻ tài nguyên (local host, volume, IP), chạy cùng nhau, cùng chung vòng đời (fail hay scale cũng đồng bộ). Nhờ vậy, trong cùng nhóm pod có thể chạy app ở các ngôn ngữ, phụ thuộc khác nhau nhưng hoạt động liền mạch. Tuy nhiên, không nên dồn frontend và backend vào cùng một pod – bạn sẽ không scale độc lập được từng phần.
(Ray) Để nhân bản, ta dùng Replication Controller hoặc Deployment – liên tục đảm bảo trạng thái thực tế khớp mong muốn (số lượng pod đang chạy như mong đợi). Khi tăng/giảm số replica, hệ thống tự động điều chỉnh và phục hồi pod nếu phát sinh lỗi bất ngờ (ví dụ sysadmin kill container). Đây chính là nguyên lý “cattle, not pets”: khi pod chết, tự sinh pod mới thay thế, không cần sửa chữa từng instance.
(Ray) Nhưng có vấn đề, IP của pod là dạng tạm, tự động thay đổi, vậy làm sao truy cập ổn định? Khi này bạn cần public service endpoint kèm load balancer, dùng lệnh kubectl expose để tạo, chỉ định port, mapping… Kubernetes sẽ đứng ra tự động gán IP, gắn load balancer và thực hiện cân bằng tải xuyên suốt các pod, nhờ đó khách ngoài truy cập ổn định và hiệu quả.
(Ray) Toàn bộ ứng dụng guestbook gồm nhiều component (frontend, backend, database v.v.) được quản lý bởi các file deployment descriptor lưu trong Git repo, tôi dùng một script tổng hợp các lệnh kubectl để triển khai loạt tài nguyên (MySQL + volume, Redis, các service…) chỉ với một lần thực thi. Bất kể môi trường cloud hay on-prem, cấu hình luôn nhất quán.
(Ray) Sau khi triển khai, chỉ cần chờ load balancer cấp IP public là có thể truy cập, kiểm thử trực tiếp trải nghiệm người dùng. Toàn bộ dữ liệu được lưu bền vững trong MySQL – mọi thao tác hoàn toàn tự động nhờ mô hình vận hành của Kubernetes.
(Kit) Ray, có thể demo CI/CD không?
(Ray) Được chứ. Đầu tiên, không dùng CI, tôi sẽ update ứng dụng bằng cách chỉnh sửa deployment trên Kubernetes: chỉ việc sửa tag image (ví dụ từ 1.0 lên 2.0), hệ thống thực hiện rolling update – chuyển từng instance lên version mới mà không gây downtime. Nếu muốn rollback, chỉ cần chạy kubectl rollout undo deployment để quay lại version trước cực kỳ thuận tiện, mọi thao tác đều có lịch sử ghi log chi tiết.
(Ray) Tôi cũng đã xây dựng pipeline với Jenkins kết nối GitHub: khi có commit mới (ví dụ update màu background theo ý marketing), Jenkins tự động build image, push lên Artifactory (chạy trên GCP), test thành phần, nếu pass sẽ promote image lên registry release. Toàn bộ Jenkins, plugin và triển khai cũng setup đơn giản qua Google Cloud Launcher.
(Kit) Khi pipeline hoàn thành, toàn bộ tiến trình build, test, promote đều tự động, update rolling trên Kubernetes chỉ bằng các plugin tích hợp. Toàn bộ hệ thống minh bạch, nhanh chóng và dễ kiểm soát.
(Ray) Tôi có thể demo thêm một số cấu hình kỹ thuật sâu hơn nếu còn thời gian, hoặc chuyển sang phần hỏi đáp.
(Kit) Mời mọi người đặt câu hỏi. Nhưng nhớ truy cập slide cuối cùng nhé.
(Ray) Đây rồi.
(Kit) Hai điểm quan trọng: Thứ nhất, bạn có thể dùng thử miễn phí JFrog Artifactory trên GCP, rất mong các bạn trải nghiệm. Thứ hai, nhận $300 free credit từ GCP để xây dựng ý tưởng riêng của mình và khám phá nền tảng này. Một lần nữa cảm ơn các bạn đã theo dõi!
(Ray) Cảm ơn mọi người.
(Kit) Cảm ơn!
Đừng ngần ngại liên hệ Softribution ngay hôm nay để được tư vấn chi tiết giải pháp, hỗ trợ lựa chọn nền tảng cũng như triển khai Kubernetes, Artifactory, CI/CD tối ưu cho doanh nghiệp của bạn. Nhấn vào đây để kết nối Softribution hoặc đăng ký mua giải pháp!
