Kubernetes là gì?
Kubernetes là một nền tảng mã nguồn mở giúp tự động hóa việc quản lý, mở rộng (scale) và triển khai ứng dụng dưới dạng container. Do đó còn được gọi là Container Orchestration Engine (hiểu nôm na là công cụ điều phối container).
Kubernetes Orchestration cho phép người dùng xây dựng các dịch vụ ứng dụng mở rộng nhiều containers, lên lịch các containers đó trên một cụm máy chủ (cluster), mở rộng các containers và quản lý tình trạng của các containers theo thời gian.
Tại sao chúng ta lại cần có Kubernetes?
Khi thực sự chạy các container trong production, một người có thể tạo đến hàng chục, thậm chí hàng nghìn container theo thời gian. Những container này cần được triển khai (trên nhiều server host), quản lý, kết nối và cập nhật. Nếu thực hiện công việc này một cách thủ công thì sẽ cần cả một team. Khi sử dụng docker, có thể tạo ra nhiều container trên 1 host. Tuy nhiên nếu muốn sử dụng trên môi trường production thì sẽ cần phải quan tâm đến rất nhiều vấn đề như:
- Quản lý nhiều docker host cùng lúc
- Điều phối các container
- Rolling update
- Scaling/Auto Scaling
- Giám sát tình trạng của container (còn hoạt động hay không)
- Self-healing (tự phát hiện và sửa lỗi) trong trường hợp có lỗi xảy ra
- Service discovery
- Load balancing
- Quản lý data, work load, log
- Infrastructure as Code
- Liên kết và mở rộng với các hệ thống khác
Nếu không dùng K8s thì việc quản lý tất cả các tác vụ này thủ công gần như là không thể.
Ý nghĩa tên gọi K8s
Kubernetes viết đầy đủ có tất cả 10 chữ cái, cái tên K8s đơn giản là K-8 (số chữ cái ở giữa)-s.
Kiến trúc của Kubernetes và Các thành phần cốt lõi của Kubernetes
Kubernetes tuân theo kiến trúc master-slave. Master node giao tiếp với các worker node và lập lịch các pod để chạy trên các node cụ thể.
Master node
Thành phần control plane của Kubernetes, đưa ra các quyết định cho cluster (như schedule), phát hiện và phản hồi các cluster event (như khởi động một pod mới khi trường của bản sao của triển khai không được thỏa mãn).
API server
Máy chủ API hiển thị API Kubernetes, có nhiệm vụ đồng bộ hóa thông tin qua REST API, sử dụng để đặt pod vào node và nhận các cài đặt cho pod/service/replicationController.
etcd
Kho lưu trữ toàn bộ dữ liệu Kubernetes cluster như thông tin cấu hình cụm Kubernetes, biểu thị trạng thái của cụm tại bất kỳ thời điểm nào. Có thể sử dụng để kết nối các đặt cho từng node.
Scheduler
Thành phần chịu trách nhiệm chọn node tốt nhất để chạy pod. Khi một pod được tạo, Scheduler sẽ quyết định chạy node nào dựa trên các yếu tố bao gồm tổng lượng tài nguyên có sẵn, số tài nguyên phân bổ cho mỗi workload trên mỗi máy… để đảm bảo không xảy ra quá tải và hệ thống chạy ổn định.
Controller Manager
Controller Manager theo dõi và điều chỉnh trạng thái của cluster và thực hiện các tác vụ thông thường để duy trì trạng thái mong muốn. Chi tiết tất cả các hoạt động sẽ được ghi Ví dụ: nếu một pod ngừng hoạt động, Controller Manager sẽ nhận thấy điều này và khởi chạy một pod mới để duy trì số lượng pod mong muốn.
Worker node
Máy chủ chạy ứng dụng. Kubernetes worker nodes host các pod, các pod là các thành phần workload của ứng dụng.
- Kubelet là một quy trình chịu trách nhiệm giao tiếp giữa Kubernetes Master và node; nó quản lý các pod và các container đang chạy trên một máy.
- Container runtime (như Docker, rkt), chịu trách nhiệm kéo hình ảnh container từ kho, giải nén container và chạy ứng dụng.
Pod
Pod thường chứa một hoặc nhiều container để chạy một quy trình cụ thể, ví dụ như một phần mềm nào đó chẳng hạn. Các pod được tạo và xóa tùy thuộc vào nhu cầu khi triển khai công việc. Các pod chia sẻ địa chỉ IP và không gian lưu trữ với nhau. Để tìm các thông tin về pod, ta có thể chạy lệnh: describe pod PODNAME
Service
Trong Kubernetes chúng ta có khái niệm dịch vụ là một lớp nằm trên một nhóm các Po, hiển thị các ứng dụng đang chạy trên đó. Service nhóm một tập hợp các endpoints của pod (địa chỉ IP) lại với nhau để cho phép giao tiếp mà không cần biết nhiều về cấu trúc mạng, giải quyết vấn đề giao tiếp khó khăn giữa các microservice, thực hiện cân bằng tải tại đây.
Vì bản chất K8s là để giải quyết hàng trăm, hàng nghìn container/service chứ không chỉ 1, cho nên chúng ta sẽ cần service ở đây.
Sau đây là một ví dụ đơn giản về định nghĩa Pod và Service trong YAML:
Pod definition
apiVersion: v1
kind: Pod
metadata: name: my-app
spec: containers: - name: my-app image: my-app:1.0 ---
# Service definition
apiVersion: v1
kind: Service
metadata: name: my-service
spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 9376
Persistent Volume (PV)
Trong kiến trúc K8s, chúng ta sẽ cần 1 nơi để lưu trữ, bởi vì chúng ta không thể lưu trên container được, nếu container hỏng thì dữ liệu cũng sẽ mất theo. Do đó sẽ phải lưu trữ dữ liệu ở một storage khác. Persistent Volume (PV) là dung lượng lưu trữ được cấp (do người quản trị hoặc bằng Storage Classes) ví dụ: 1GB hoặc 10GB chẳng hạn, phù hợp với nhu cầu sử dụng của ứng dụng. Persistent Volume Claims (PVC) là yêu cầu lưu trữ từ phía người dùng. Như vậy khi PV đáp ứng được với PVC thì thỏa mãn điều kiện..
Sử dụng dịch vụ K8s như Bizfly Kubernetes (BKE) thì có hỗ trợ Persistent Volume. Bạn có thể tham khảo Sử dụng volume có sẵn làm Persistent Volume tại link: https://docs.bizflycloud.vn/kubernetes_engine/howtos/using-preexisting-volume
Network Policies và Ingress
Network Policies cung cấp quy tắc kết nối đến pod dựa trên label và port, xác định ai có thể hoặc không thể kết nối đến port.
Mặt khác, Ingress quản lý quyền truy cập ra vào các dịch vụ trong cụm từ bên ngoài, thường là truy cập HTTP.
ConfigMaps & Secrets
ConfigMaps được sử dụng để lưu trữ dữ liệu không bảo mật theo cặp key-value. Tức là có thể tách một số phần trong cấu hình khỏi nội dung hình ảnh (như là không lưu mật khẩu trong file cấu hình để đảm bảo an toàn) để giúp cho các ứng dụng container có thể di chuyển.
Secrets tương tự như ConfigMaps, nhưng được sử dụng để lưu trữ thông tin nhạy cảm như mật khẩu, mã thông báo OAuth và khóa ssh. Lưu trữ thông tin bảo mật trong Secret an toàn hơn và linh hoạt hơn so với việc đưa nguyên văn vào định nghĩa Pod hoặc trong hình ảnh container.
Các khái niệm cho các dịch vụ khác nhau:
Deployments cung cấp các bản cập nhật khai báo cho Pod và Replica Set. Bạn mô tả trạng thái mong muốn trong Deployment và Deployment Controller sẽ thay đổi trạng thái thực tế thành trạng thái mong muốn.
StatefulSet được sử dụng cho các workload cần mã định danh mạng ổn định, persistent storage ổn định, deploy và scale nhẹ nhàng. Vì thiếu linh hoạt như vậy nên dịch vụ này cũng không còn được sử dụng nhiều.
DaemonSet đảm bảo rằng tất cả (hoặc một số) node chạy một bản copy của pod. Khi các node được thêm vào cluster, các pod sẽ được thêm vào. Khi các node bị xóa khỏi cluster, các pod đó sẽ được collect.
Lợi ích của Kubernetes là gì?
1. Hiệu quả
Mặc dù triển khai và cập nhật Kubernetes không phải là nhiệm vụ đơn giản tuy nhiên với các Engine được phát triển sẵn thì việc chạy ứng dụng container bằng Kubernetes sẽ được đơn giản hóa rất nhiều khi không phải triển khai riêng hạ tầng máy chủ và quản lý vận hành chi tiết bên trong..
2. Độ tin cậy
Kubernetes với nhiều tính năng như load balancer hay autoscale giúp duy trì sự ổn định và khả dụng của các ứng dụng khi chúng đang chạy.
3. Tính linh hoạt
Cung cấp khả năng tự động mở rộng tài nguyên để cung cấp cho ứng dụng giúp đáp ứng quy mô phát triển của doanh nghiệp.
4. Khả năng di động
Kubernetes có thể triển khai trên nhiều môi trường đám mây khác nhau, public cloud, private cloud, on-premise. Ví dụ như BKE hỗ trợ tính năng K8s Everywhere giúp kết nối K8s trên Bizfly Cloud tới một hoặc nhiều nhà cung cấp khác hoặc với K8s trên hạ tầng vật lý giúp chuyển đổi linh hoạt giữa các đám mây, không giới hạn nhu cầu phát triển.
5. Quản lý và bảo mật tài nguyên
Kubernetes cung cấp một số API và kiểm soát bảo mật, cũng như các phương thức để xác định các chính sách giúp người dùng xây dựng phương án quản lý bảo mật thông tin.
6. Mã nguồn mở
Kubernetes được phát triển trên nguồn mở, trước kia là phần mềm mã nguồn mở phát triển nhanh nhất từ trước đến nay. Có nghĩa là có một hệ sinh thái khổng lồ gồm các công cụ mã nguồn mở khác tương thích với K8s. Do đó Kubernetes sẽ liên tục được cải tiến không ngừng, giúp tạo ra tính linh hoạt vượt trội giúp người dùng không bị trói buộc vào công nghệ lỗi thời.
7. Cộng đồng hỗ trợ rộng lớn
Vì Kubernetes là công cụ điều phối container phổ biến nhất hiện nay nên có một cộng đồng người dùng năng động với nhiều đóng góp cho tài nguyên tham khảo trực tuyến, gồm có thông tin, công cụ quản lý và tiện ích mở rộng.
8. Hỗ trợ Docker và nhiều nền tảng khác
Những ai nên sử dụng Kubernetes?
- Kubernetes loại bỏ rất nhiều các quy trình thủ công liên quan đến việc triển khai và scale các container. Vì vậy doanh nghiệp có nhu cầu scale nhanh chóng không thể bỏ qua K8s.
- Những dự án bắt buộc chạy >=5 container cho cùng 1 loại hình dịch vụ.
- Những startup đang phát triển, chịu đầu tư vào công nghệ để dễ dàng auto scale về sau.
- Các DevOps/Sysadmin muốn tìm hiểu, học hỏi.
So sánh Docker với Kubernetes
Nếu Docker là nền tảng container hóa thì Docker Swarm là một hệ thống điều phối các container tương tự như Kubernetes. Docker Swarm là công cụ điều phối của chính Docker, được tích hợp sẵn trong hệ sinh thái của nó.
Kubernetes | Docker Swarm | |
---|---|---|
Triển khai ứng dụng | Sử dụng kết hợp các pod, deployments, services (hay microservices) | Triển khai như một service (hay microservices) trong một Swarm cluster. |
Cài đặt | Thực hiện thủ công và có kế hoạch cụ thể để đảm bảo hoạt động hiệu quả. | Cài đặt rất đơn giản, bản chỉ cần một bộ công cụ tùy chọn để build theo cấu hình và môi trường. |
Sử dụng | Yêu cầu người dùng phải có kiến thức về CLI để chạy trên Docker. | Sử dụng ngôn ngữ chế định hướng trong một cấu trúc. |
Ưu điểm | Khả năng scale tự động mạnh mẽ giữa các môi trường. Kubernetes có một cộng đồng mạnh mẽ hơn so với Docker Swarm. Kubernetes xây dựng được hơn 50.000 commits và 1200 contributors. | Triển khai các container nhanh hơn Kubernetes vì vậy thời gian phản ứng sẽ nhanh hơn dẫu thay đổi môi theo yêu cầu. Tuy nhiên ở mức trường production thì không đạt được khả năng như Kubernetes. |
Sự khác nhau giữa Kubernetes và Docker nằm ở mục đích, vai trò của chúng nhưng cả hai lại có thể phối hợp với nhau để hỗ trợ cho việc triển khai và điều phối các container trong một kiến trúc phân tán. Docker là một nền tảng để build, phân phối và run các Docker container, còn Kubernetes là hệ thống giúp điều phối cho các Docker container.
Như vậy, sự lựa chọn tốt nhất cho lập trình viên là kết hợp cả Docker và Kubernetes để tăng thêm tính hiệu quả trong việc phát triển phần mềm.
Ứng dụng của Kubernetes trong thực tế
Triển khai ứng dụng quy mô lớn
Các trang web có lưu lượng truy cập lớn và các ứng dụng phát triển trên cloud có thể nhận tới hàng triệu request từ người dùng mỗi ngày.
Các lĩnh vực yêu cầu điện toán hiệu năng cao
Các ngành như chính phủ, khoa học, tài chính và kỹ thuật phụ thuộc rất nhiều vào điện toán hiệu năng cao (HPC), các công việc cần xử lý dữ liệu lớn để thực hiện các thuật toán phức tạp.
AI và machine learning
Việc xây dựng và triển khai các hệ thống trí tuệ nhân tạo (AI) và máy học (ML) yêu cầu khối lượng dữ liệu khổng lồ và các quy trình phức tạp tương tự như điện toán hiệu năng cao và phân tích dữ liệu lớn.
Kiến trúc Microservice
Mô hình microservice chia nhỏ ứng dụng thành nhiều thành phần hoặc các dịch vụ nhỏ hơn. Ví dụ như phát triển các web thương mại điện tử thường sử dụng mô hình microservice.
Enterprise DevOps
Khả năng cập nhật và triển khai ứng dụng nhanh chóng là rất quan trọng đối với thành công của doanh nghiệp. Kubernetes cung cấp cho devops team khả năng tối ưu vận hành để tăng tính linh hoạt trong toàn bộ công việc. Bên cạnh đó, CI/CD ngày càng đóng vai trò quan trọng hơn trong phát triển phần mềm. Và Kubernetes đóng vai trò quan trọng trong các quy trình cloud native CI/CD nhờ tự động triển khai container trên các môi trường đám mây và đảm bảo khả năng sử dụng hiệu quả tài nguyên.
Hướng dẫn cài đặt và triển khai Bizfly Kubernetes Engine
Nếu bạn đang muốn bắt đầu với Kubernetes, truy cập: https://bizflycloud.vn/kubernetes-engine để tạo tài khoản. BKE cung cấp gói dùng thử miễn phí và gói standard với free chi phí quản lý cluster.
Tạo cluster
Tạo mới một Kubernetes cluster bằng cách nhấn vào nút Tạo cluster tại giao diện quản lý Kubernetes Engine hoặc trong menu Khởi tạo được đặt ở thanh điều hướng.
Lựa chọn phiên bản Kubernetes phù hợp và cấu hình các worker node cho cluster.
Lựa chọn VPC cho cluster.
Tips: Bạn có thể đặt tên và thêm tag cho cluster để dễ dàng quản lý khi có nhiều cluster
Chọn cấu hình cho Node pools
Ta nhập tên từng Node, chọn gói Network cho node:
Sau đó tùy chọn cấu hình, dung lượng ổ cứng hay loại ổ cứng cho từng node.
Ta chọn cấu hình Node hoặc auto scale cho node:
Rồi ấn nút Tạo cluster, sau đó hãy chờ vài phút để cluster được khởi tạo hoàn chỉnh.
Vậy là ta đã tạo thành công!
Tải file cấu hình kubeconfig
Nếu sử dụng giao diện dòng lệnh kubectl hãy tải file KUBECONFIG bằng cách nhấn vào nút Tải file cấu hình trong dropdown menu phía bên cạnh tên cluster.
Lưu ý: File cấu hình có thời gian hiệu lực là 7 ngày kể từ khi tải về
Truy cập giao diện Kubernetes Dashboard
Bizfly Kubernetes Engine hỗ trợ sẵn giao diện quản lý GUI cho cluster, truy cập bằng cách ấn vào nút Dashboard phía bên cạnh tên cluster.
Một số câu hỏi thường gặp về Kubernetes
1. Kubernetes có thể chạy trên mọi nền tảng không?
Có thể cài đặt trên Windows, macOS, và nhiều nền tảng Linux khác nhau.
2. Tôi có thể sử dụng Kubernetes mà không cần sử dụng Docker không?
Nếu không có Docker, Kubernetes vẫn có thể hoạt động với nhiều môi trường container khác như RunC, cri-o,...
3. Kubernetes cải thiện bảo mật ứng dụng như thế nào?
Kubernetes cung cấp các lợi thế bảo mật sẵn có. Ví dụ, các application container thường không được vá hoặc cập nhật — thay vào đó, các container image được thay thế hoàn toàn bằng các phiên bản mới. Nhờ vậy mà kiểm soát phiên bản nghiêm ngặt và có thể khôi phục nhanh chóng nếu phát hiện ra lỗi trong mã mới.