Gần đây, tôi đã đề cập đến chủ đề về những lầm tưởng và sự thật phổ biến về Kubernetes, giúp bạn hiểu rõ hơn về những hiểu lầm phổ biến và sự thật đằng sau chúng. Trong bài viết này, chúng ta sẽ thảo luận về những mẹo và thủ thuật hữu ích nhất khi sử dụng Kubernetes. Những mẹo này sẽ giúp bạn làm việc với Kubernetes dễ dàng và hiệu quả hơn.
Một trong những cuộc cách mạng công nghệ quan trọng nhất chính là sự ra đời của công nghệ container. Nhờ đó, hệ thống điều phối Kubernetes đã trở nên phổ biến trong thời gian gần đây. Kubernetes là một hệ sinh thái mã nguồn mở giúp tự động hóa việc triển khai, mở rộng và quản lý các ứng dụng được đóng gói trong container.
Dưới đây là những mẹo hữu ích về Kubernetes giúp bạn tận dụng tối đa nền tảng này.
Những Mẹo Kubernetes Bạn Cần Biết
Các công ty muốn triển khai các cụm container quy mô lớn, cân bằng tải với tính sẵn sàng cao có thể tận dụng tối đa Kubernetes. Kubernetes đã chứng tỏ tiềm năng trong các ứng dụng kinh doanh cũng như triển khai ở cấp độ doanh nghiệp. Hơn nữa, tác động của Kubernetes còn mở rộng đến người dùng, khách hàng và nhân viên. Hãy cùng khám phá cách tận dụng tối đa Kubernetes.
1. Bật Tính Năng Tự Động Hoàn Thành (Autocompletion)
Mẹo đầu tiên trong danh sách các mẹo Kubernetes là sử dụng các lệnh kubectl. Bạn cần kích hoạt tính năng tự động hoàn thành lệnh (bash completion) để cải thiện trải nghiệm làm việc với Kubernetes. Quá trình này khá đơn giản và giúp tăng tính linh hoạt khi sử dụng kubectl.
Người dùng Kubernetes sử dụng Bash có thể thêm tính năng tự động hoàn thành bằng cách nhập lệnh sau:
echo “source <(kubectl completion bash)” >> ~/.bashrc
Bạn có thể thêm tính năng tự động hoàn thành vào .bashrc bằng cách nhập lệnh sau. Khi mở terminal lần tiếp theo, tính năng này sẽ tự động hoạt động. Tự động hoàn thành rất hữu ích khi nhập các lệnh dài trong Kubernetes, chẳng hạn như –all-namespaces.
2. Thiết Lập Giới Hạn Mặc Định cho CPU và Bộ Nhớ
Mẹo tiếp theo trong danh sách các mẹo Kubernetes là thêm giới hạn mặc định về bộ nhớ và CPU vào namespaces. Dù cẩn thận đến đâu, sai sót vẫn có thể xảy ra.
Ví dụ: một lập trình viên có thể viết ứng dụng mở kết nối với cơ sở dữ liệu mỗi giây nhưng không đóng kết nối đúng cách. Điều này có thể dẫn đến rò rỉ bộ nhớ trong một ứng dụng trong cụm. Nếu ứng dụng được triển khai mà không có giới hạn nào, nó có thể tiêu thụ toàn bộ tài nguyên và làm sập node.
Vì vậy, Kubernetes khuyến nghị đặt giới hạn mặc định để ngăn chặn những sự cố như vậy.
Giới hạn mặc định nên được thiết lập theo từng namespace. Bạn có thể làm điều này một cách đơn giản bằng cách tạo một tệp YAML để định nghĩa giới hạn tài nguyên, sau đó gán nó cho namespace tương ứng.
Ví dụ, YAML dưới đây đặt giới hạn bộ nhớ mặc định là 512Mi cho namespace limit-example:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
3. Dọn Dẹp Docker image
Một trong những mẹo quan trọng trong Kubernetes là làm sạch ảnh Docker. Kubernetes có tích hợp sẵn tính năng này trong kubelet. Khi Kubelet khởi động, quá trình thu gom rác (garbage collection) sẽ tự động bắt đầu khi thư mục /var/lib/docker đạt 90% dung lượng.
Tuy nhiên, một điểm quan trọng cần lưu ý là các phiên bản Kubernetes trước 1.7 không có thiết lập mặc định để theo dõi số lượng inodes. Điều này có thể dẫn đến tình trạng hết inodes ngay cả khi dung lượng ổ đĩa chỉ mới sử dụng khoảng 50%.
Giải pháp là thêm cờ –eviction-hard vào kubelet để thiết lập các ngưỡng thu gom rác, đặc biệt nếu bạn sử dụng Kubernetes từ 1.4 đến 1.6.
Ví dụ:
--eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%
Lệnh này sẽ giúp tự động dọn dẹp khi tài nguyên xuống dưới các ngưỡng cho phép. Đối với Kubernetes 1.7 trở lên, thiết lập này đã được mặc định.
4. Sử Dụng Minikube để Triển Khai Cục Bộ
Minikube là một công cụ cực kỳ hữu ích giúp bạn chạy Kubernetes ngay trên máy tính cá nhân. Điều này đặc biệt phù hợp để phát triển và thử nghiệm ứng dụng mà không cần triển khai trên cloud.
Cách sử dụng Minikube Bước 1: Tải và cài đặt Minikube từ trang chính thức. Bước 2: Sau khi cài đặt xong, chạy lệnh sau để khởi động cluster:
minikube start
Bước 3: Để build ảnh Docker và sử dụng trực tiếp trong Minikube, chạy lệnh:
eval $(minikube docker-env)
Lệnh này giúp Docker build ảnh ngay trong môi trường Minikube, giúp tiết kiệm thời gian push lên registry bên ngoài.
Kết luận: Nếu bạn cần môi trường Kubernetes nhẹ nhàng để phát triển ứng dụng, Minikube là lựa chọn hoàn hảo.
5. Không Cấp Quyền kubectl Chung Cho Tất Cả Người Dùng
Các mẹo và thủ thuật Kubernetes cũng tập trung vào việc hạn chế quyền truy cập kubectl. Kubernetes được thiết kế để nhiều nhóm có thể triển khai lên cùng một cụm (cluster). Tuy nhiên, bạn không nên cấp quyền kubectl chung cho tất cả mọi người.
Cách tốt nhất là phân nhóm theo namespace. Chính sách RBAC (Role-Based Access Control) là cách phù hợp để giới hạn quyền truy cập vào một namespace cụ thể. Việc cấp quyền đọc, xóa, tạo theo từng nhóm có thể gây nhầm lẫn. Tuy nhiên, bạn nên ưu tiên việc chỉ cấp quyền truy cập secrets cho quản trị viên. Nhờ đó, có thể phân biệt giữa quyền quản trị hệ thống và quyền triển khai ứng dụng.
6. Giới Hạn Gián Đoạn Pod (Pod Disruption Budgets – PDB)
Một trong những mẹo hữu ích nhất trong Kubernetes là sử dụng Pod Disruption Budgets (PDB). PDB là giải pháp đảm bảo rằng ứng dụng chạy trên Kubernetes sẽ không gặp thời gian gián đoạn (downtime). Khi cập nhật cụm (cluster), PDB sẽ đảm bảo rằng các node được drain (giải phóng tải) một cách có kiểm soát. Vì vậy, PDB là bắt buộc đối với mọi triển khai (deployment) có nhiều hơn một instance.
Bạn có thể tạo một PDB bằng cách áp dụng một tệp YAML đơn giản vào cụm Kubernetes. Các bộ chọn nhãn (label selectors) có thể giúp xác định phạm vi áp dụng của từng PDB cụ thể.
Lưu ý rằng PDB chỉ áp dụng cho các gián đoạn tự nguyện (voluntary disruptions). Vì vậy, PDB sẽ không có tác dụng trong trường hợp có sự cố phần cứng. Dưới đây là một ví dụ về PDB:
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: app-a-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: app-a
Một trong những mẹo quan trọng nhất về Kubernetes, PDB được khuyến nghị để có sự kiểm soát tốt hơn. Trong PDB, có hai thành phần quan trọng nhất: minAvailable và matchLabels.
Phần matchLabels giúp Kubernetes xác định deployment nào được liên kết với PDB. Ví dụ, PDB được trình bày ở trên sẽ áp dụng cho deployment có nhãn app: app-a nhưng không áp dụng cho app: app-b.
Thành phần minAvailable giúp Kubernetes nhận biết khi nào một node đang bị drain (giải phóng tải). Ví dụ, nếu app-a đang chạy trên Node 1 và Node 1 bị drain, Kubernetes sẽ chỉ di dời (evict) app-a. Tại sao? Bởi vì đang có hai instance chạy cùng lúc. Điều thú vị là bạn có thể kiểm soát số lượng instance cần chạy tại một thời điểm nhất định.
7. Sử Dụng Probes Hiệu Quả
Một trong những mẹo Kubernetes quan trọng là kiểm tra tình trạng ứng dụng. Kubernetes cho phép định nghĩa probes, được Kubelet sử dụng để xác định sức khỏe của pod và ứng dụng. Có hai loại probe chính:
- Readiness Probe: Kiểm tra xem container có sẵn sàng nhận lưu lượng truy cập hay không.
- Liveness Probe: Kiểm tra xem container có đang hoạt động bình thường hay không, hoặc có cần khởi động lại không.
Bạn chỉ cần thêm cấu hình vào file YAML của deployment. Ngoài ra, có thể tùy chỉnh thời gian trễ (delays), thời gian chờ (timeouts), và số lần thử lại (retries).
8. Labels Rất Hữu Ích
Labels là một yếu tố quan trọng trong Kubernetes. Labels giúp liên kết các đối tượng với nhau mà không cần ràng buộc chặt chẽ. Chúng cũng hỗ trợ truy vấn dữ liệu dựa trên nhãn.
Một ứng dụng thực tế là khi sử dụng Kubernetes Go Client để theo dõi các sự kiện dựa trên labels.
Ví dụ: Bạn có một cụm Kubernetes chung cho QA và Dev, và cả hai môi trường cùng chạy một ứng dụng app-a. Bạn có thể tạo hai service objects, mỗi cái sẽ chọn một label khác nhau:
- Service 1: Chọn app: app-a, environment: Dev
- Service 2: Chọn app: app-a, environment: QA
Điều này giúp bạn tạo hai endpoint khác nhau cho cùng một ứng dụng, từ đó có thể dễ dàng kiểm thử cả hai môi trường.
9. Sử Dụng Go Client
Kubernetes Go Client mang lại nhiều lợi ích hơn bạn nghĩ. Vì Kubernetes được phát triển bằng Go, nên hầu hết các tiện ích mở rộng cũng được xây dựng trên nền tảng này. Go Client giúp bạn tùy chỉnh Kubernetes theo nhu cầu của mình.
Ví dụ, bạn có thể sử dụng Go Client để:
- Xây dựng deployment engine tùy chỉnh
- Viết một ứng dụng dọn dẹp tự động
- Phát triển công cụ thu thập dữ liệu từ các tài nguyên Kubernetes
10. Dọn Dẹp Định Kỳ
Mẹo cuối cùng là luôn giữ cho Kubernetes sạch sẽ. Giống như bất kỳ hệ thống nào khác, Kubernetes cũng có thể gặp vấn đề về dung lượng lưu trữ.
Kubelet có thể tự động thực hiện các kiểm tra, nhưng nếu hệ thống mở rộng đến hàng triệu instance, nó có thể bị quá tải. Do đó, khi xóa một deployment, hãy chắc chắn rằng bạn đã dọn dẹp tất cả các tài nguyên liên quan như:
- Pods
- Services
- Volumes
- ConfigMaps & Secrets Điều này giúp giữ cho cụm Kubernetes của bạn luôn ổn định và hiệu suất cao.
Kết Luận
Cuối cùng, danh sách các mẹo và thủ thuật Kubernetes được đề cập ở trên nhằm giúp bạn nâng cao trải nghiệm sử dụng Kubernetes. Bên cạnh đó, bạn có thể tìm hiểu thêm bằng cách tham khảo các tài liệu bổ sung. Ví dụ, cuốn sách “Kubernetes: The Smart Person’s Guide” sẽ giúp bạn nắm bắt toàn cảnh về Kubernetes. Kiến thức cơ bản không bao giờ là thừa, và bạn sẽ cần nhiều hơn thế để tận dụng tối đa Kubernetes.