Giới thiệu
Dạo gần đây mình có tìm hiểu về Kubernetes (k8s) nên mình viết bài này để chia sẻ kiến thức của mình học được khi tìm hiểu về nó. Ở bài viết này mình sẽ chia sẻ cái nhìn tổng quan về k8s và một số khái niệm quan trọng của k8s.
Kubernetes là gì?
Kubernetes là một nền tảng để quản lý, mở rộng các ứng dụng hoạt động dựa trên containers, giúp thuận lợi trong việc cấu hình và tự động triển khai ứng dụng một cách linh hoạt và tin cậy. Kubernetes giúp chúng ta điều phối các container, nó đảm bảo tất cả các containers được lên lịch chạy trên các server(physical machine hoặc virtual machine). Kubernetes còn giúp ta theo dõi hoạt động của các container, khi một container nào đó gặp lõi hoặc dừng hoạt động thì kubernetes sẽ tự động thay thế container đó. Ban đầu Kubernetes được phát triển bởi google, sau này google và linux foundation thành lập một tổ chức tên là Cloud Native Computing Foundation(CNCF) vào năm 2016 và kubernetes trở thành một project của tổ chức này.
Lợi ích
Kubernetes giúp chúng ta đẩy nhanh tốc độ phát triển hệ thống nhưng vẫn đảm bảo chất lượng và tính khả dụng. Nó cung cấp một số công cụ giúp ta gia tăng tần suất deploy các tính năng mới lên production nhưng vẫn duy trì được sự ổn định của hệ thống. Một số lợi ích quan trọng có thể kể đến như:
- High Availability: có thể hiển đơn giản đó là ứng dụng sẽ không có down time và người dùng có thể truy cập bất cứ lúc nào.
- Scalability: ứng dụng có hiệu năng cao, tải nhanh, người dùng có thể truy cập với thời gian phản hồi thấp.
- Disaster recovery: nếu một container nào đó có vấn đề (lost data, server issue), k8s có một số cơ chế backup(sao chép) dữ liệu và restore(khôi phục) lại trạng thái ban đầu của ứng dụng với đầy đủ dữ liệu. Container có thể chạy với trạng thái mới nhất sau khi khôi phục dữ liệu.
Một số khái niệm quan trọng trong Kubernetes
Pod
Pod là đơn vị nhỏ nhất trong k8s chứa một hoặc nhiều container liên quan đến nhau. Hay hiểu đơn giản là pod sẽ tạo ra môi trường chạy các container. Mỗi pod sẽ sở hữu một internal ip riêng và có thể giao tiếp với nhau. Địa chỉ IP này sẽ được thay đổi khi các pod được khởi tạo lại (re-creation). Thông thường một ứng dụng sẽ được chạy trên một pod.Vì địa chỉ IP của pod được thay đổi mỗi khi được khởi tạo lại nên giả sử container db của ta bị lỗi khiến pod chứa 2 container db và app phải tiến hành khởi tạo lại để thay thế cái cũ thì lúc này 2 pod sẽ bị mất kết nối. Chính vì vậy ta sẽ có tiếp một khái niệm mới là service.
Service
Service được xác định dựa trên label, đại diện cho một entry point để truy cập vào ứng dụng. Mỗi service có địa chỉ IP và port không đổi. Client có thể kết nối đến các IP và port của service, sau đó sẽ được điều hướng đến các pod để xử lý. Quan trọng hơn hết là life cycle của service và pod không liên quan quan (kết nối) với nhau nên khi một pod bị crash (hoặc chết) thì service và IP của nó vẫn tồn tại. Chúng ta có thể định nghĩa external service hoặc internal service tùy vào mục đích sử dụng. Khi browser request đến ứng dụng, lúc này ta sẽ sử dụng IP để kết nối (external service) nhưng url với những sản phẩm production sẽ có domain name lúc này ta có tiếp một khái niệm là ingress.
Ingress
Ingress là thành phần dùng để điều hướng các yêu cầu trafic giao thức HTTP và HTTPS từ bên ngoài vào các dịch vụ bên trong Cluster. Nó chỉ phục vụ các cỏng, yêu cầu HTTP và HTTPS còn lại các cổng khác, giao thức khác được truy cập từ bên ngoài thì ta dùng các kiểu service khác. Lúc này request sẽ đi đến ingreass và chuyển tiếp đến các service.
Label
Label cung cấp meta data nhận dạng cho các object trong Kubernetes. Label cho phép ta tổ chức và nhóm các object trong cluster. Một object có thể có nhiều label và một label có thể được gán cho nhiều object khác nhau (n-n). Ta có thể dùng label để lọc các đối tượng trong cluster một cách dễ dàng
Annotations
Annotations là một đối tượng khác giống label nó cũng cung cấp meta data nhưng là để máy tính sử dụng chứ không phải con người. Nó không dùng để truy vấn. Ta có thể sử dụng annotations để bổ xung thông tin như git branch, timestamp, ...
ReplicaSet
ReplicaSet sẽ đảm bảo rằng ứng dụng của ta luôn chạy đúng loại và số lượng pod trong cluster. Ví dụ như khi chạy webserver thay vì chỉ chạy 1 instance ta sẽ chạy 2 hoặc 3 instance đẻ đảm bảo ứng dụng hoạt động ổn định. Trong một trường hợp nào đó khi pod bị crash thì k8s sẽ tự động tạo lại đủ số lượng pod tùy vào ReplicaSet ta định nghĩa.
ConfigMap và Secrets
Khi cần cung cấp cấu hình trong quá trình runtime của container. Giả sử ta có ứng dụng laravel kết nới với database mysql ta cần một số config như DB_ADDRESS, DB_NAME, DB_PASSWORD, ... mà không cần can thiệp vào code. ConfigMap cung cấp dữ liệu dưới dạng key và value.
Secret cũng tương tự như ConfigMap nhưng dùng với nhưng dữ liệu nhạy cảm cần được bảo mật như API_TOKEN, DB_PASSWORD, ... Sử dụng secrets cho phép ta tạo container mà không cần đóng gói dữ liệu nhảy cảm trong container. Ta có thể truyền ConfigMap và Secret thông qua mainfest file hoặc k8s API.
Kubernetes Architecture
Khi deploy Kubernetes, chúng ta sec có một cluster.
Một Kubernetes cluster bao gồm một tập hợp các worker machine
đợi gọi là nodes
giúp ta chạy các ứng dụng đã được container hóa. Trong đó các node sẽ cung cấp các tài nguyên như computing, memory, storage, networking. Mỗi một cluster có ít nhất một worker node
.
Node processes
Kubernetes nodes là máy ảo hay máy vật lý chạy kubernetes. Các node này cần chạy Kubernetes và docker, và mỗi máy này là một docker host. Mỗi node có nhiều pod.
Master node
Master node là server điều khiển các máy worker chạy ứng dụng. Nó bao gồm 4 thành phần chính:
- Kubernetes API Server: cung cấp API cho k8s cluster dùng để thiết lập và xác thực cấu hình cho object như pod, service, .... Lập trình viên khi triển khai ứng dụng sẽ gọi đến API này.
- Scheduler: Thành phần này lập lịch triển khai cho các ứng dụng, đặt các pod vào node dựa trên tài nguyên và điều kiện khác được định nghĩa.
- Controler Manager: Thành phần đảm nhiệm phần quản lý các Worker, kiểm tra trạng thái các Worker sống hay chết, thực hiện những thay đổi đối với cluster sao cho phù hợp.
- Etcd: cơ sở dữ liệu của Kubernetes, tất cả các thông tin của Kubernetes được lưu trữ ở đây.
Worker node
Master node là server để chạy các ứng dụng. Nó bao gồm 3 thành phần chính:
- Kubelet: là một agent chạy trên mỗi worker có trách nghiệm giám sát giao tiếp với master node và quản lý các pod.
- Kube-proxy: quản lý network policy trên mỗi node, chuyển tiếp, traffic tới node dựa trên policy.
- Container runetime: phần chịu trách nghiệm chạy các container.
Lời kết
Qua bài viết này mình hy vọng các bạn sẽ hiểu được k8s là gì và có được cái nhìn tổng quan về k8s. Vì là mình chia sẻ những gì mình học được nên nếu bài viết có chỗ nào không đúng hay kiến thức bị thiếu mong các bạn chia sẻ đóng góp ý kiến để bài viết có thể hoàn thiện hơn. Cảm ơn các bạn đã theo dõi đến hết bài viết ❤️.