20.ImperativeDeclarative
1. Imperative vs. Declarative - Hai "Trường phái" Quản lý¶
Hãy dùng một phép so sánh đơn giản để hiểu rõ hai trường phái này:
-
Imperative (Mệnh lệnh) - Giống như bạn đi Taxi truyền thống 🚕:
-
Bạn phải chỉ đường từng bước cho tài xế: "Đi thẳng, đến ngã tư rẽ phải, đi thêm 200m rồi rẽ trái...".
-
Bạn chỉ rõ CÁI GÌ cần làm và quan trọng hơn là LÀM THẾ NÀO để làm điều đó.
-
Declarative (Khai báo) - Giống như bạn đặt xe Uber/Grab 🚗:
-
Bạn chỉ cần nhập vào điểm đến cuối cùng: "Đưa tôi đến nhà hát lớn".
- Hệ thống (tài xế và ứng dụng) sẽ tự tìm ra con đường tối ưu nhất để đưa bạn đến đó.
- Bạn chỉ nói CÁI GÌ bạn muốn (trạng thái cuối cùng), còn cách làm đã có hệ thống lo.
2. Áp dụng vào Kubernetes¶
Trong Kubernetes, hai trường phái này được thể hiện qua cách bạn sử dụng lệnh kubectl
.
a. Cách tiếp cận Mệnh lệnh (Imperative Approach)¶
Đây là cách bạn ra lệnh trực tiếp cho Kubernetes phải làm gì. Nó có 2 dạng:
-
Dùng lệnh trực tiếp (Pure Imperative Commands):
-
Tạo mới:
kubectl run
,kubectl create deployment
,kubectl expose
. - Cập nhật:
kubectl edit
,kubectl scale
,kubectl set image
. - Ưu điểm: Rất nhanh và tiện lợi cho các tác vụ đơn giản, đặc biệt hữu ích khi làm bài thi CKA để tiết kiệm thời gian.
-
Nhược điểm: Khó theo dõi (chỉ lưu trong lịch sử dòng lệnh), không phù hợp cho môi trường làm việc nhóm, giới hạn chức năng với các yêu cầu phức tạp.
-
Dùng file cấu hình (nhưng với lệnh mệnh lệnh):
-
Tạo mới:
kubectl create -f my-pod.yaml
- Cập nhật:
kubectl replace -f my-pod.yaml
- Xóa:
kubectl delete -f my-pod.yaml
- Vấn đề: Cách này vẫn là mệnh lệnh vì bạn phải biết trạng thái hiện tại của hệ thống để chọn đúng lệnh. Ví dụ, bạn không thể chạy
create
nếu object đã tồn tại (sẽ báo lỗi), và không thể chạyreplace
nếu object chưa tồn tại.
b. Cách tiếp cận Khai báo (Declarative Approach) - "Chân ái" của Kubernetes ❤️¶
Đây là phương pháp được khuyến khích sử dụng trong thực tế.
- Lệnh duy nhất:
kubectl apply -f <file.yaml hoặc thư mục>
- Cách hoạt động:
- Bạn định nghĩa trạng thái cuối cùng mong muốn cho toàn bộ ứng dụng của mình trong một hoặc nhiều file YAML.
- Bạn luôn luôn chạy lệnh
kubectl apply -f ...
. - Sự "thông minh" của
apply
: - Nó sẽ tự so sánh trạng thái bạn khai báo trong file với trạng thái hiện tại trên cụm.
- Nếu object chưa tồn tại, nó sẽ tạo mới.
- Nếu object đã tồn tại, nó sẽ tính toán sự khác biệt và chỉ cập nhật những thay đổi cần thiết.
- Nó không bao giờ báo lỗi "object đã tồn tại". Bạn chỉ cần "khai báo" và
apply
, Kubernetes sẽ lo phần còn lại.
3. Mẹo cho Kỳ thi CKA 📝¶
Trong kỳ thi CKA, thời gian là vàng, vì vậy bạn cần linh hoạt:
- Để tạo nhanh các object đơn giản (Pod, Deployment với một image duy nhất): Hãy dùng các lệnh mệnh lệnh như
kubectl run
hoặckubectl create deployment
. - Để sửa nhanh một thuộc tính của object đang có:
kubectl edit
là lựa chọn nhanh nhất. - Với các yêu cầu phức tạp (tạo Pod nhiều container, định nghĩa volumes, env-vars,...): Tốt nhất là nên tạo một file YAML. Cách này giúp bạn dễ dàng kiểm tra, sửa lỗi và áp dụng lại nếu cần. Khi đó, dùng
kubectl apply -f
là một lựa chọn rất tốt.
Reference:¶
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
https://kubernetes.io/docs/reference/kubectl/conventions/
Mặc dù cách làm khai báo (dùng file YAML) là chuẩn trong thực tế, nhưng trong kỳ thi CKA, những lệnh này sẽ giúp bạn tiết kiệm cực kỳ nhiều thời gian quý báu!
1. Hai "Bảo bối" Cần Nhớ: --dry-run
và -o yaml
¶
Trước khi đi vào từng lệnh cụ thể, bạn cần nắm vững hai tùy chọn (options) "thần thánh" này:
-
--dry-run=client
: -
Nghĩa là: "Chạy thử thôi, đừng tạo thật nhé!".
-
kubectl
sẽ kiểm tra cú pháp lệnh của bạn và cho bạn biết liệu tài nguyên có thể được tạo hay không, nhưng nó sẽ không thực sự tạo ra bất kỳ tài nguyên nào trong cụm. -
-o yaml
: -
Nghĩa là: "In kết quả ra màn hình dưới định dạng YAML nhé!".
🚀 Combo Thần thánh: Kết hợp hai tùy chọn này, bạn có thể tạo ra một file template YAML một cách siêu tốc mà không cần phải viết từ đầu.
Sau đó, bạn chỉ cần mở file
ten-file.yaml
ra và chỉnh sửa thêm cho các yêu cầu phức tạp.
2. Các Lệnh Mệnh lệnh (Imperative Commands) Thông dụng¶
a. Với Pod
¶
- Tạo nhanh một NGINX Pod:
- Tạo file YAML cho Pod mà không tạo Pod thật:
b. Với Deployment
¶
- Tạo một Deployment:
- Tạo Deployment với 4 bản sao (replicas):
- Scale một Deployment đang có:
- Tạo file YAML cho Deployment:
c. Với Service
(Phần cần lưu ý)¶
Tạo Service bằng lệnh có hơi phức tạp hơn một chút vì có hai lệnh chính với những ưu và nhược điểm riêng:
-
Cách 1:
kubectl expose
(Khuyến khích dùng làm điểm khởi đầu) -
Lệnh:
kubectl expose pod redis --port=6379 --name redis-service
- ✅ Ưu điểm: Nó sẽ tự động sử dụng
labels
của Pod làmselector
cho Service. Đây thường là điều bạn muốn. -
❌ Nhược điểm: Bạn không thể chỉ định
nodePort
trực tiếp bằng lệnh này. -
Cách 2:
kubectl create service
-
Lệnh:
kubectl create service nodeport nginx --tcp=80:80 --node-port=30080
- ✅ Ưu điểm: Bạn có thể chỉ định các thông số chi tiết như
node-port
. - ❌ Nhược điểm: Nó không tự động lấy
selector
từlabels
của Pod. Thay vào đó, nó sẽ giả định một selector mặc định (ví dụ:app=nginx
). Nếu Pod của bạn có label khác, Service sẽ không hoạt động.
💡 Chiến lược đề xuất:
Hãy bắt đầu với lệnh
kubectl expose
. Nếu bạn cần chỉ định các trường nâng cao nhưnodePort
, hãy dùngexpose
với combo--dry-run=client -o yaml
để tạo ra một file YAML cơ bản (đã có sẵnselector
đúng). Sau đó, bạn chỉ cần mở file đó ra và thêm dòngnodePort
vào rồi mới tạo Service.
3. "Chốt hạ" Chiến lược thi 📝¶
- Đối với các yêu cầu tạo tài nguyên đơn giản, hãy dùng các lệnh mệnh lệnh như
kubectl run
,kubectl create deployment
để tiết kiệm thời gian. - Hãy thành thạo "combo thần thánh"
--dry-run=client -o yaml
để tạo nhanh các file template YAML khi cần giải quyết các yêu cầu phức tạp hơn. - Khi tạo Service, hãy ưu tiên dùng
kubectl expose
để đảm bảoselector
được thiết lập chính xác.
Nắm vững các lệnh này sẽ là một lợi thế cực lớn, giúp bạn hoàn thành các bài thực hành trong kỳ thi CKA một cách nhanh chóng và chính xác. Chúc bạn một buổi chiều học tập hiệu quả!