Khóa học
Khi tôi bắt đầu làm Kỹ sư Machine Learning, tôi nhanh chóng nhận ra rằng xây dựng mô hình không phải là thách thức lớn nhất. Triển khai chúng theo cách đáng tin cậy và có khả năng mở rộng mới là điều khó khăn.
Đó là lúc tôi được giới thiệu về Kubernetes, công cụ điều phối container mà dường như ai trong ngành cũng đang bàn tán.
Ban đầu, tôi vật lộn để hiểu kiến trúc phức tạp của nó. Tôi cố gắng học thêm bằng cách đọc tài liệu và các hướng dẫn về Kubernetes giải thích những nền tảng cơ bản. Nhưng tôi vẫn thấy khó hiểu.
Mọi thứ chỉ thay đổi khi tôi tự mình bắt đầu áp dụng các khái niệm. Bằng cách tự thiết lập cụm Kubernetes của riêng mình, thử nghiệm các cấu hình khác nhau và triển khai các ứng dụng nhỏ, tôi dần dần nối được các mảnh ghép. Trải nghiệm thực hành giúp tôi tự tin hơn, và cuối cùng tôi đã hiểu cách Kubernetes có thể đơn giản hóa việc quản lý ứng dụng ở quy mô lớn.
Hướng dẫn này được thiết kế để mang đến cho bạn trải nghiệm thực hành tương tự. Dù bạn là người mới hay đang muốn củng cố kiến thức nền tảng, bài viết sẽ hướng dẫn bạn thiết lập cụm Kubernetes cục bộ, triển khai ứng dụng và quản lý tài nguyên hiệu quả.
Kết thúc, bạn sẽ nắm vững các kiến thức cơ bản về Kubernetes và sẵn sàng áp dụng vào những ứng dụng thực tế!
Trước khi bắt đầu
Hãy điểm qua một số yêu cầu tiên quyết và công cụ bạn cần để theo dõi hướng dẫn này.
Yêu cầu tiên quyết
- Kiến thức cơ bản về dòng lệnh: Bạn nên có hiểu biết cơ bản về các lệnh Linux nền tảng để điều hướng thư mục, chạy lệnh và chỉnh sửa tệp, vì Kubernetes dựa vào tương tác qua dòng lệnh. Ví dụ: các lệnh như
cdvàlsvà sửa văn bản cơ bản bằng nano hoặc vim. - Hiểu về container: Nắm các khái niệm container hóa và công cụ như Docker. Tìm hiểu thêm về Docker trong các khóa học Introduction to Docker và Intermediate Docker.
- YAML: Bạn cần quen thuộc với tệp YAML và cú pháp của chúng. Điều này rất quan trọng, vì mọi thứ trong Kubernetes đều được quản lý qua tệp YAML.
- (Tùy chọn) Môi trường đám mây: Nhận biết các nền tảng đám mây công cộng như AWS, Azure hoặc GCP và các dịch vụ Kubernetes được quản lý của chúng (ví dụ: EKS, AKS, GKE). Sẽ hữu ích khi bạn muốn chuyển từ thiết lập cục bộ sang thiết lập trên đám mây sau này.
Công cụ
- minikube: Công cụ chạy cụm Kubernetes một nút trên máy cục bộ (chúng ta sẽ đi qua phần cài đặt).
- kubectl: Công cụ dòng lệnh Kubernetes để tương tác với cụm (chúng ta sẽ đi qua phần cài đặt).
- Trình soạn thảo văn bản: Bất kỳ trình soạn thảo nào để tạo và chỉnh sửa tệp YAML. Gợi ý, bạn dùng công cụ hỗ trợ tiện ích mở rộng cho YAML để tiện hơn (ví dụ: VSCode).
Môi trường
- Phần cứng: Ít nhất 2 CPU, 2GB bộ nhớ trống và 20GB dung lượng đĩa trống.
- Trình quản lý container: Để quản lý image container (ví dụ: Docker, Podman).
Bạn muốn tìm hiểu Kubernetes và Docker khác nhau thế nào? Xem bài so sánh chi tiết Kubernetes vs. Docker để hiểu vai trò của chúng trong môi trường container hóa.
Thiết lập cụm Kubernetes cục bộ của bạn
Giờ hãy bắt tay vào việc và thiết lập cụm Kubernetes cục bộ!
Nhưng cụm Kubernetes là gì? Một cụm Kubernetes là tập hợp các nút phối hợp với nhau để chạy ứng dụng của bạn. Nó bao gồm hai thành phần:
- Control plane: Quản lý cụm, xử lý các tác vụ như lập lịch ứng dụng, duy trì trạng thái mong muốn và mở rộng quy mô ứng dụng về trạng thái mong muốn.
- Worker node: Máy chạy ứng dụng của bạn bên trong các Pod, đơn vị nhỏ nhất trong Kubernetes (sẽ nói kỹ hơn bên dưới).

Các thành phần cốt lõi của Kubernetes. Ảnh từ Kubernetes.io
Cài đặt minikube
Minikube có thể được cài trên Windows, Linux và MacOS. Vui lòng làm theo hướng dẫn trong mục Get Started của tài liệu Minikube chính thức.
Tôi làm việc trên Windows nhưng dùng WSL2 vì tôi thích giao diện Linux. Nếu bạn muốn thiết lập WSL2 cho máy Windows của mình, hãy đọc hướng dẫn cài đặt của Microsoft.
Cài đặt kubectl
kubectl là giao diện dòng lệnh để làm việc với tài nguyên Kubernetes của bạn. Bạn có thể cài bằng cách làm theo tài liệu Kubernetes chính thức hoặc dùng bản tích hợp sẵn trong minikube.
Tôi khuyên bạn cài theo tài liệu chính thức của Kubernetes để có thể dùng kubectl như một lệnh độc lập. Với minikube, bạn sẽ phải chạy lệnh kèm tiền tố minikube.
Khởi động cụm minikube
Giờ khi đã cài xong minikube, chúng ta có thể khởi động một cụm từ terminal với quyền quản trị bằng lệnh sau:
minikube start
Lệnh này sẽ tự động tải về các binary cần thiết của Kubernetes và khởi chạy cho bạn một cụm một nút.
Xác minh cụm
Giờ chúng ta có thể kiểm tra trạng thái cụm để xem mọi thứ chạy như mong đợi chưa:
minikube status
Kết quả sẽ tương tự như sau:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
Chúng ta còn có thể tiến thêm một bước và dùng kubectl để lấy tất cả các nút trong cụm, vốn sẽ chỉ có một:
kubectl get nodes
Lệnh trên sẽ trả về kết quả tương tự như sau:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 10m v1.32.0
Dừng cụm
Nếu bạn muốn dừng cụm để giải phóng tài nguyên khi không cần dùng, bạn có thể chạy:
bash
minikube stop
Chỉ cần khởi động lại khi lần tới bạn muốn tiếp tục làm việc với Kubernetes.
Xóa cụm
Nếu bạn muốn xóa hoàn toàn cụm minikube và mọi tài nguyên đã thêm vào đó, hãy chạy:
minikube deleteKiến thức cơ bản về Kubernetes: Pod, Deployment, Service và Namespace
Giờ khi đã thiết lập cụm và kiểm tra mọi thứ hoạt động, đã đến lúc tạo ứng dụng đầu tiên của chúng ta.
Nhưng trước khi tạo ứng dụng đầu tiên, điều quan trọng là hiểu những kiến thức cơ bản của Kubernetes. Nếu bạn muốn phần giới thiệu sâu hơn về Kubernetes, Tôi khuyến nghị bạn xem khóa học Introduction to Kubernetes.
Những khái niệm cơ bản nhất trong Kubernetes là Pod, Deployment và Service. Hiểu ba loại tài nguyên này có thể giúp bạn tạo ra các ứng dụng mạnh mẽ. Vậy nên, hãy đi sâu vào chúng.
Pod là gì?
Pod là đơn vị có thể triển khai nhỏ nhất trong Kubernetes. Nó chạy một hoặc nhiều container liên kết chặt chẽ, chia sẻ cùng lưu trữ, mạng và namespace. Pod luôn được lập lịch trên một nút Kubernetes.
Bạn có thể định nghĩa lượng tài nguyên Pod của mình sẽ nhận được (ví dụ: CPU và bộ nhớ).
Một ví dụ ứng dụng với hai container có thể là container ứng dụng của bạn và một container hỗ trợ gom nhật ký và gửi đi nơi khác.
Tính năng của Pod:
- Đơn thể: Mỗi Pod chạy một phiên bản ứng dụng của bạn.
- Tính chất tạm thời: Pod được thiết kế để tạm thời và sẽ được thay thế nếu gặp lỗi hoặc khi cập nhật.
Ví dụ YAML tạo một Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx-container
image: nginx:1.21
ports:
- containerPort: 80
Sau đó bạn có thể cài Pod bằng kubectl:
kubectl apply -f pod.yaml
Lệnh này sẽ khởi chạy một Pod tên my-pod, chạy webserver nginx cho bạn.
Deployment là gì?
Deployment là đối tượng Kubernetes cấp cao hơn dùng để quản lý vòng đời của Pod. Nó đảm bảo số lượng bản sao Pod mong muốn luôn chạy và xử lý cập nhật cũng như rollback.
Tính năng của Deployment:
- Quản lý bản sao: Đảm bảo số lượng pod mong muốn luôn chạy.
- Tự phục hồi: Tự động thay thế các Pod không khỏe mạnh.
- Rolling update: Cập nhật phiên bản ứng dụng theo từng bước mà không gây downtime (nếu được cấu hình).
Hãy xem một tệp YAML Deployment tạo webserver nginx, lần này với ba bản sao:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
Bạn có thể cài Deployment này bằng kubectl:
kubectl apply -f deployment.yaml
Lệnh trên sẽ tạo một Deployment tên nginx-deployment sinh ra ba Pod, mỗi Pod chạy container nginx.
Service là gì?
Giờ đến phần cuối: Service.
Service là một lớp trừu tượng cung cấp kết nối mạng ổn định tới các Pod, ngay cả khi địa chỉ IP của chúng thay đổi. Nó đóng vai trò cầu nối giữa ứng dụng của bạn và các client bên ngoài.
Nhưng tại sao cần điều đó? Mỗi Pod có một địa chỉ IP. Vậy sao không dùng trực tiếp IP đó?
Ta có thể! Nhưng không nên. Tại sao?
Vì Pod có tính tạm thời, nó có thể bị Deployment dừng và một Pod mới được tạo khi Pod của bạn không khỏe. Pod mới sẽ có IP khác. Điều này có nghĩa là client muốn dùng ứng dụng của bạn sẽ phải liên tục thay đổi IP mỗi khi một Pod sập, điều có thể xảy ra thường xuyên.
Đây là lúc Service phát huy tác dụng: nó tìm tất cả các Pod khớp với một nhãn cụ thể và tự động định tuyến lưu lượng tới chúng. Nếu một Pod không khỏe, Service sẽ ngừng gửi lưu lượng đến Pod đó. Và nếu một Pod mới xuất hiện, nó sẽ bắt đầu gửi lưu lượng tới Pod mới.
Service cũng phân phối lưu lượng giữa tất cả các bản sao của Deployment, điều này rất tuyệt vì bạn có thể tạo thêm nhiều phiên bản ứng dụng để phân tán lưu lượng mà không cần xử lý trong logic ứng dụng.
Các loại Service:
- ClusterIP (mặc định): Phơi bày Service trong phạm vi cụm.
- NodePort: Phơi bày Service trên một cổng có thể truy cập từ bên ngoài cụm.
- LoadBalancer: Tích hợp với nhà cung cấp đám mây để phơi bày Service qua một bộ cân bằng tải.
Ví dụ YAML để phơi bày web server nginx ra bên ngoài cụm:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Bạn có thể tạo service này bằng kubectl:
kubectl apply -f service.yaml
Service này sẽ phân phối lưu lượng vào tới tất cả các Pod có nhãn app=nginx trên cổng 80.
Nếu bạn chạy lệnh describe trên Service vừa tạo, bạn sẽ thấy có ba endpoint, mỗi endpoint đại diện địa chỉ IP của Pod đang chạy:
kubectl describe service nginx-service
Lệnh trên sẽ trả về kết quả tương tự:
Name: nginx-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.104.53.131
IPs: 10.104.53.131
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32256/TCP
Endpoints: 10.244.0.5:80,10.244.0.6:80,10.244.0.7:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Mối quan hệ giữa Pod, Deployment và Service
Tóm tắt nhanh:
- Pod: Đại diện cho các phiên bản ứng dụng riêng lẻ.
- Deployment: Quản lý vòng đời Pod và đảm bảo chúng khỏe mạnh.
- Service: Cung cấp truy cập ổn định tới Pod và cho phép giao tiếp nội bộ hoặc bên ngoài.
Namespace là gì?
Namespace trong Kubernetes cho phép bạn tổ chức và cô lập tài nguyên trong một cụm. Bạn có thể coi chúng như các cụm ảo trong cùng một cụm vật lý.
Lợi ích khi dùng Namespace:
- Phân tách mối quan tâm: Các đội hoặc ứng dụng khác nhau có thể hoạt động trong namespace riêng mà không ảnh hưởng lẫn nhau.
- Quản lý tài nguyên: Bạn có thể đặt quota và giới hạn tài nguyên cho từng namespace.
- Bảo mật và kiểm soát truy cập: Có thể áp chính sách ở cấp độ namespace.
Mặc định, Kubernetes có một vài namespace dựng sẵn:
- default: Namespace mặc định nơi tài nguyên được tạo nếu không chỉ định khác
- kube-system: Dùng cho các thành phần nội bộ của Kubernetes (ví dụ: API server, scheduler, v.v.).
- kube-public: Một namespace có thể đọc công khai.
- kube-node-lease: Dùng để theo dõi heartbeat của nút.
Bạn có thể tạo một namespace bằng tệp YAML:
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
Lưu vào tệp tên namespace.yaml và áp dụng bằng:
kubectl apply -f namespace.yaml
Khi chạy lệnh dưới đây, bạn sẽ thấy danh sách tất cả namespace mặc định kể trên và namespace mới tạo:
kubectl get namespaces
Bạn có thể tạo tài nguyên trong namespace đó bằng cách đặt namespace trong phần metadata của tài nguyên.
Deployment nginx của chúng ta sẽ như sau nếu muốn tạo trong namespace mới tạo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: my-namespace
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
Giờ bạn cần chỉ rõ rằng bạn muốn truy xuất tài nguyên từ namespace mới tạo bằng tham số -n như sau:
kubectl get deployment -n my-namespace
Quản lý ứng dụng đầu tiên của bạn với Kubernetes
Được rồi, giờ bạn đã quen với các khái niệm cơ bản của Kubernetes, hãy triển khai ứng dụng web đầu tiên lên Kubernetes và thử truy cập nó.
Trong chương này, chúng ta sẽ tạo một web server nginx, phơi bày web server đó ra thế giới bên ngoài qua một Service, mở rộng ứng dụng để mô phỏng hành vi lưu lượng cao, và cập nhật ứng dụng bằng rolling update lên phiên bản mới hơn.
Vậy hãy bắt đầu phần thú vị thôi!
Tạo một deployment ứng dụng web đơn giản
Bước đầu tiên là tạo một Deployment cho webserver của chúng ta, tạo container sử dụng image Nginx.
Sao chép đoạn mã dưới đây và lưu vào tệp nginx-deployment.yaml.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Sau đó, áp dụng Deployment này lên cụm bằng lệnh sau:
kubectl apply -f nginx-deployment.yaml
Bạn có thể xác minh rằng Pod đang chạy:
kubectl get pods
Phơi bày ứng dụng bằng service
Chúng ta cần phơi bày web server nginx ra bên ngoài qua một Service. Ở đây, ta tạo Service kiểu NodePort, vì chúng ta muốn truy cập webserver nginx từ máy cục bộ bên ngoài cụm Kubernetes.
Vậy hãy tạo tệp nginx-service.yaml và thêm nội dung sau:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Bạn có thể áp dụng Service bằng lệnh dưới đây:
kubectl apply -f nginx-service.yaml
Cuối cùng, bạn có thể dùng minikube để lấy URL tới web server nginx của mình:
minikube service nginx-service --url
Mở URL đó trong trình duyệt, bạn sẽ thấy trang chào mừng của web server nginx.

Ảnh chụp màn hình trang chào mừng của web server nginx trong trình duyệt cục bộ.
Mở rộng ứng dụng
Hiện tại chúng ta có một Pod đang chạy. Nhưng có thể sẽ có lượng lớn người dùng truy cập trang. Đó là lý do trong Kubernetes, bạn có thể nhanh chóng mở rộng ứng dụng để có nhiều Pod chạy hơn.
Service sẽ tự động phát hiện tất cả Pod thuộc Deployment đó và cân bằng tải các yêu cầu đến tất cả Pod đang chạy web server nginx. Điều này giúp cải thiện hiệu năng tổng thể của trang khi có nhiều lưu lượng đổ vào.
Vậy hãy mở rộng ứng dụng lên 3 bản sao bằng lệnh dưới đây:
kubectl scale deployment nginx-deployment --replicas=3
Giờ bạn có thể liệt kê các Pod đang chạy, số lượng sẽ là ba:
kubectl get pods
Bạn cũng có thể dùng lệnh dưới đây để xem tất cả endpoint mà nginx-service đang kết nối. Kết quả sẽ là ba endpoint, mỗi endpoint là một địa chỉ IP nội bộ trong cụm:
kubectl get endpoints nginx-service
Rolling update
Giờ đây, chúng ta có thêm một lợi ích lớn khi dùng Kubernetes: Rolling update.
Rolling update nhằm mục tiêu tránh mọi downtime của ứng dụng web. Hãy tưởng tượng thiệt hại tài chính với những công ty như Amazon nếu trang của họ bị sập mỗi khi phát hành phiên bản mới.
Với rolling update, Kubernetes sẽ tăng một Pod mới, kiểm tra xem Pod đó có khỏe không, rồi giảm Pod cũ xuống.
Mặc định, Kubernetes đảm bảo ít nhất 75% số Pod mong muốn luôn chạy, với 25% là tối đa số Pod không khả dụng. Điều này có nghĩa trong trường hợp của chúng ta, nơi có ba bản sao đang chạy, Kubernetes sẽ chỉ thêm một Pod mới mỗi lần, kiểm tra Pod đó có khỏe không, và nếu ổn thì giảm một Pod cũ. Quá trình lặp lại cho tới khi tất cả Pod được cập nhật lên phiên bản mới.
Hãy làm điều đó bằng cách đổi phiên bản image nginx từ latest sang 1.23:
kubectl set image deployment/nginx-deployment nginx=nginx:1.23
Bạn có thể theo dõi trạng thái rollout bằng:
kubectl rollout status deployment/nginx-deployment
Kết quả sẽ trông tương tự:
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
Và trong suốt quá trình rollout, trang web của bạn vẫn luôn truy cập được, không hề downtime!
Tuyệt vời phải không?
Quản lý tài nguyên Kubernetes
Kubernetes cung cấp các công cụ mạnh mẽ để kiểm tra, chỉnh sửa và xóa tài nguyên ở mọi loại. Hiểu cách quản lý tài nguyên hiệu quả giúp bạn khắc phục sự cố tốt hơn, phân bổ tài nguyên hợp lý và duy trì cụm tổng thể.
Trong phần này, chúng ta sẽ tìm hiểu các lệnh quan trọng khác giúp bạn quản lý tài nguyên hiệu quả và xử lý sự cố khi cần.
Xem tài nguyên trong cụm
Trước khi thay đổi bất kỳ tài nguyên nào, việc xem và kiểm tra các tài nguyên đang chạy trong cụm là rất quan trọng.
Ví dụ, bạn có thể liệt kê tất cả Pod, Service và Deployment đang chạy để xem tình hình trong cụm:
# list running Pods
kubectl get pods
# list running Services
kubectl get services
# list running Deployments
kubectl get deployments
Nếu muốn đi sâu vào một tài nguyên cụ thể, bạn có thể dùng lệnh describe như sau:
kubectl describe deployment nginx-deployment
Lệnh này sẽ hiển thị nhiều thông tin hơn, bao gồm rolling update, mở rộng hay các sự kiện kéo image. Đây là điểm đầu tiên bạn nên kiểm tra nếu có sự cố.
Bạn cũng có thể xem log của một Pod đang chạy để biết chuyện gì đang diễn ra bên trong Pod bằng lệnh dưới đây:
kubectl logs <pod-name>
Xóa tài nguyên
Việc dọn dẹp tài nguyên khi không còn sử dụng cũng quan trọng để giải phóng tài nguyên cụm cho các ứng dụng mới.
Bạn có thể xóa một Pod bằng:
kubectl delete pod <pod-name>
Chúng ta có thể thử với một trong các pod nginx. Tuy nhiên, một Pod mới sẽ lập tức được tạo thêm vì chúng được quản lý qua Deployment, vốn luôn cố gắng duy trì ba bản sao chạy sẵn.
Vì vậy, ở đây chúng ta cần xóa nginx-deployment:
kubectl delete deployment nginx-deployment
Sau khi chạy lệnh này, tất cả Pod nginx đang chạy sẽ bị xóa.
Chúng ta cũng có thể xóa tất cả tài nguyên trong một Namespace. Lệnh sau sẽ xóa tất cả tài nguyên của chúng ta, mặc định được tạo trong Namespace default:
kubectl delete all --all
Kết luận
Chúc mừng! Bạn đã đi đến cuối và thành công với những bước đầu tiên trong Kubernetes.
Bằng cách làm theo hướng dẫn này, bạn đã học cách:
- Thiết lập cụm Kubernetes cục bộ bằng minikube.
- Làm việc với Pod, Deployment, Service và Namespace (những khối xây dựng thiết yếu của Kubernetes).
- Triển khai và quản lý một ứng dụng web đơn giản trong Kubernetes.
- Mở rộng ứng dụng động và thực hiện rolling update mà không có downtime.
- Quản lý tài nguyên Kubernetes bằng cách liệt kê, mô tả và xóa chúng.
Ban đầu Kubernetes có thể trông phức tạp (ít nhất là với tôi). Nhưng khi tách thành các khái niệm nền tảng, nó trở nên dễ tiếp cận hơn.
Tiếp tục thử nghiệm và triển khai nhiều ứng dụng hơn.
Cách tốt nhất để học Kubernetes là bắt tay làm, hãy bắt đầu xây dựng!
Để nâng cao kỹ năng Kubernetes, hãy cân nhắc khám phá thêm:
- Làm việc với ConfigMap và Secret: Lưu trữ và quản lý cài đặt cấu hình một cách an toàn.
- Persistent volume: Học cách lưu trữ dữ liệu tồn tại qua việc khởi động lại Pod bằng persistent volume.
- Mạng và ingress controller: Thiết lập định tuyến dựa trên tên miền và quản lý lưu lượng bên ngoài.
- Helm: Dùng Helm chart để đóng gói và triển khai ứng dụng phức tạp một cách hiệu quả.
- Kubernetes trên đám mây: Thử nghiệm với các dịch vụ Kubernetes được quản lý như AWS EKS, Azure AKS hoặc Google GKE.
Cuối cùng, lộ trình Containerization and Virtualization with Docker and Kubernetes trên DataCamp là nguồn tài nguyên tuyệt vời để thực hành cả Docker và Kubernetes.
Câu hỏi thường gặp
Làm thế nào để lưu dữ liệu bền vững trong Kubernetes qua các lần khởi động lại Pod?
Pod trong Kubernetes có tính tạm thời, nghĩa là dữ liệu sẽ mất khi chúng khởi động lại. Để lưu dữ liệu bền vững, bạn có thể dùng Persistent Volume (PV) và Persistent Volume Claim (PVC). Chúng cho phép lưu dữ liệu độc lập với vòng đời của Pod. Bạn có thể định nghĩa Persistent Volume trong YAML và gắn nó vào Pod để ngay cả khi Pod bị xóa và tạo lại, dữ liệu vẫn được giữ.
Làm sao phơi bày ứng dụng Kubernetes ra internet với tên miền?
Để phơi bày ứng dụng của bạn ra internet công cộng với tên miền tùy chỉnh, bạn cần dùng Ingress Controller. Ingress cho phép bạn định nghĩa các quy tắc định tuyến lưu lượng bên ngoài vào các service. Thông thường, nó yêu cầu một LoadBalancer bên ngoài và cấu hình DNS trỏ về cụm của bạn. NGINX Ingress Controller là lựa chọn phổ biến để quản lý lưu lượng trong Kubernetes.
Làm thế nào để bảo vệ cụm Kubernetes khỏi truy cập trái phép?
Bảo mật là yếu tố then chốt trong Kubernetes. Dưới đây là một vài bước quan trọng để bảo vệ cụm của bạn:
- Dùng RBAC (Role-Based Access Control) để hạn chế truy cập dựa trên vai trò người dùng.
- Bật network policy để giới hạn lưu lượng giữa các Pod.
- Thường xuyên cập nhật Kubernetes và các phụ thuộc để vá lỗ hổng bảo mật.
- Hạn chế truy cập API bằng các cơ chế xác thực và ủy quyền.
- Dùng Secret để quản lý an toàn dữ liệu nhạy cảm như API key và thông tin xác thực.
Làm thế nào để giám sát hiệu năng cụm Kubernetes?
Bạn có thể giám sát cụm bằng các công cụ như:
- Prometheus & Grafana – Thu thập và trực quan hóa số liệu.
- Kubernetes Dashboard – Giao diện web để quản lý cụm.
- kubectl top – Cung cấp mức sử dụng CPU và bộ nhớ cho Node và Pod.
- Giải pháp log như Fluentd hoặc Loki – Tập trung hóa log để khắc phục sự cố.
Làm thế nào để triển khai ứng dụng Kubernetes trong môi trường production?
Trong môi trường production, bạn nên:
- Dùng dịch vụ Kubernetes được quản lý như AWS EKS, Azure AKS hoặc Google GKE.
- Triển khai tự động mở rộng với Horizontal Pod Autoscaler (HPA) và Cluster Autoscaler.
- Dùng pipeline CI/CD (ví dụ: GitHub Actions, ArgoCD hoặc Jenkins) để triển khai tự động.
- Bảo mật cụm với các thực hành tốt như RBAC, network policy và quét image.
- Giám sát cụm bằng Prometheus, Loki hoặc giải pháp giám sát native trên đám mây.
Tôi là Kỹ sư Cloud với nền tảng vững chắc về Kỹ thuật Điện, học máy và lập trình. Sự nghiệp của tôi bắt đầu từ lĩnh vực thị giác máy tính, tập trung vào phân loại ảnh, trước khi chuyển sang MLOps và DataOps. Tôi chuyên xây dựng nền tảng MLOps, hỗ trợ các nhà khoa học dữ liệu và triển khai các giải pháp dựa trên Kubernetes để tinh gọn quy trình làm việc của học máy.
