..

Nhập môn Kubernetes

Kubernetes là gì?

Monolithic vs Microservices

Kiến trúc phần mềm (kể từ giờ sẽ dùng thuật ngữ tiếng anh là software architecture) là tổ chức hệ thống bao gồm nhiều thành phần như web server, database, API server, … và cách chúng tương tác với nhau.

Có hai mô hình phổ biến của software architecture là monolithic và microservices.

Monolithic là mô hình mà ở đó toàn bộ các chức năng của ứng dụng như UI, Business logic, Data Access Layer,… được đóng gói và triển khai dưới một đơn vị duy nhất.

...

Ưu và nhược:

  • Ưu: Quá trình phát triển và triển khai đơn giản, vì tất cả các thành phần được đóng gói trong một ứng dụng duy nhất
  • Nhược: Khó mở rộng, bảo trì và cập nhật. Thiếu tính ổn định, một lỗi bất kì cũng có thể ảnh hướng tới toàn bộ hệ thống

Một architect khác là microservices. Ta có thể hình dung microservices chính là monolithic nhưng được chia nhỏ thành các thành phần độc lập. Những thành phần này sẽ giao tiếp với nhau thông qua mạng, thường là API (REST API) hoặc gRPC

Ưu và nhược:

  • Ưu: Vì các services độc lập với nhau, nên nếu một services bị lỗi thì nó sẽ không ảnh hưởng tới các services còn lại. Chẳng hạn service phục vụ cho việc gợi ý sản phẩm bị lỗi thì cũng không làm ảnh hưởng tới service phụ trách thanh toán
  • Nhược: Phức tạp và khó triển khai hơn nhiều so với monolithic.

...

Các dịch vụ này thường được triển khai dưới dạng container và số lượng có thể lên tới hàng trăm services. Do đó, việc quản lý và điều phối các container này trở nên rất khó khăn. Kubernetes ra đời để giải quyết vấn đề này.

Tại sao phải container hóa các services?

Bây giờ ta đặt vấn đề triển khai ứng dụng lên server thì sẽ có những cách làm nào.

Cách đầu tiên là chạy thẳng ứng dụng trên server.

...

Điểm yếu: không có cách để phân bổ tài nguyên giữa các ứng dụng. Xảy ra tình trạng một số ứng dụng sẽ chiếm hết tài nguyên của server.

Cách giải quyết điểm yếu này đó là sử dụng VM - Virtual Machine

...

Công nghệ ảo hóa cho phép ta chạy nhiều máy ảo (Virtual Machines - VMs) trên cùng một máy chủ vật lý, mỗi máy ảo sẽ có hệ điều hành (OS), File System và CPU riêng biệt.

VM cho phép ta cô lập tài nguyên rất mạnh, nhưng bù lại thì cách này yêu cầu khá cao về phần cứng vì mỗi VM duy trì một hệ điều hành riêng biệt.

Cách cuối cùng đó là sử dụng container.

...

Container cũng thực hiện ảo hóa giống như VM nhưng khác với VM nó chỉ sao chép lại hệ điều hành và file system chứ không sao chép cả hardware. Về phần này, mọi người đọc cuốn Docker in Action để hiểu rõ hơn.

Tóm lại: kubernetes giúp ta giải quyết câu chuyện quản lí và điều phối các container trong môi trường microservices (theo những gì mình hiểu ở hiện tại là như vậy)

Cài đặt

Để thực hành ở máy tính cá nhân thì ta cần cài đặt hai công cụ là kubectlminikube.

Đầu tiên kiểm tra xem máy có hỗ trợ ảo hóa hay không bằng lệnh:

grep -E --color 'vmx|svm' /proc/cpuinfo

Nếu kết quả hiện ra có dạng vmx flag ... thì oke.

Tiếp theo là cái đặt kubectl. Có hai cách để cài đặt. Cách đầu tiên và đơn giản nhất là cài đặt thông qua package manager. Vì mình dùng fedora nên đầu tiên mình cần thêm repository của kubernetes vào hệ thống bằng lệnh sau:

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF
sudo yum install -y kubectl

Cách thứ hai là tải bằng curl.

curl -LO https://dl.k8s.io/release/`curl -LS https://dl.k8s.io/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version

Tải minikube:

curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

Check:

❯ kubectl version
Client Version: v1.35.3
Kustomize Version: v5.7.1
Unable to connect to the server: dial tcp 192.168.49.2:8443: connect: no route to host

Ở đây thì client chưa connect được với server. Để khởi động server thì chạy lệnh sau:

❯ minikube start
😄  minikube v1.38.1 on Fedora 43
✨  Using the docker driver based on existing profile
👍  Starting "minikube" primary control-plane node in "minikube" cluster
🚜  Pulling base image v0.0.50 ...
🔄  Restarting existing docker container for "minikube" ...
🐳  Preparing Kubernetes v1.35.1 on Docker 29.2.1 ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Note: Các nền tảng Cloud lớn cũng có cung cấp dịch vụ Kubernetes rất dễ sử dụng như AWS cung cấp EKS, Azure cung cấp AKS và Google Cloud cung cấp GKE.

Pod là gì?