Source: https://www.tuanh.net/blog/devops/readiness-and-liveness-checks-in-kubernetes
Trong Kubernetes, Kiểm tra Sẵn sàng (Readiness Probes) và Kiểm tra Sống (Liveness Probes) là hai cơ chế quan trọng để duy trì sự ổn định và hiệu suất của các ứng dụng chạy trong môi trường container. Hôm nay, tôi sẽ giới thiệu hai khái niệm này và chứng minh cách sử dụng chúng khi triển khai hệ thống microservice với Kubernetes.
1. Readiness Probe
Readiness Probe được sử dụng để xác định khi nào một Pod sẵn sàng xử lý lưu lượng truy cập đến. Nếu một Pod được đánh giá là chưa sẵn sàng, nó sẽ bị loại trừ khỏi việc nhận lưu lượng từ một Service và sẽ không tham gia vào cân bằng tải. Để đảm bảo rằng ứng dụng bên trong một Pod sẵn sàng phục vụ các yêu cầu, Kubernetes đánh giá các điều kiện của một Readiness Probe (như một yêu cầu HTTP GET, kiểm tra socket TCP hoặc thực thi một lệnh) để xác định xem ứng dụng đã sẵn sàng hay chưa. Nếu kiểm tra thành công, Pod được thêm vào danh sách các Pod sẵn sàng và đủ điều kiện nhận lưu lượng. Một Readiness Probecó thể được cấu hình trong phần thông số kỹ thuật của container trong một deployment YAML. Ví dụ:
readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10
Phần này định nghĩa một kiểm tra sức khỏe dựa trên HTTP. path: Chỉ định đường dẫn URL mà Kubernetes sẽ yêu cầu để xác định sự sẵn sàng của Pod. /health là một điểm cuối (endpoint) phổ biến cho các kiểm tra sức khỏe.
port: Chỉ ra số cổng mà ứng dụng đang lắng nghe các yêu cầu.
initialDelaySeconds: Đặt một độ trễ trước khi kiểm tra sức khỏe đầu tiên để cho phép ứng dụng đủ thời gian khởi động.
periodSeconds: Định nghĩa khoảng thời gian giữa các kiểm tra sức khỏe liên tiếp.
2. Liveness Probe
Liveness Probe được sử dụng để xác định khi nào một Pod bị treo hoặc gặp sự cố và cần được khởi động lại. Khi Liveness Probe thất bại, Kubernetes sẽ khởi động lại Pod để khôi phục trạng thái hoạt động của nó. Kubernetes sử dụng các Liveness Probe để duy trì sức khỏe của các Pod. Những kiểm tra này, có thể cấu hình dưới dạng yêu cầu HTTP GET, kiểm tra socket TCP hoặc lệnh tùy chỉnh, xác định xem container ứng dụng bên trong một Pod vẫn đang chạy và phản hồi hay không. Sau nhiều lần thất bại, Kubernetes sẽ lên lịch khởi động lại Pod. Bạn có thể cấu hình Liveness Probe trong phần spec của container trong một deployment YAML. Ví dụ:
livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 15 periodSeconds: 20
path: /health - Đây là điểm cuối HTTP mà Kubernetes sẽ gửi yêu cầu GET để kiểm tra tính sống của Pod. Ứng dụng của bạn cần định nghĩa điểm cuối này và trả về mã trạng thái HTTP để chỉ ra xem nó đang chạy hay không. Mã trạng thái 200 OK thường được trả về nếu ứng dụng đang hoạt động bình thường.
port: 8080 - Cổng mà ứng dụng của bạn đang lắng nghe và nơi Kubernetes sẽ gửi yêu cầu GET. Cổng này phải khớp với cổng mà ứng dụng của bạn đang sử dụng để lắng nghe các yêu cầu HTTP.
initialDelaySeconds: 15 - Đây là số giây Kubernetes sẽ chờ đợi sau khi Pod khởi động trước khi bắt đầu thực hiện kiểm tra tính sống. Trong ví dụ này, Kubernetes sẽ chờ 15 giây sau khi Pod khởi động để kiểm tra tính sống của nó. Việc trì hoãn này đảm bảo ứng dụng có đủ thời gian để khởi động và sẵn sàng phục vụ yêu cầu.
periodSeconds: 20 - Đây là khoảng thời gian tính bằng giây giữa các lần kiểm tra tính sống. Trong ví dụ này, Kubernetes sẽ thực hiện kiểm tra tính sống cứ sau 20 giây. Nếu Pod không phản hồi chính xác ở bất kỳ lần kiểm tra nào, Kubernetes sẽ thực hiện các hành động khôi phục (như khởi động lại Pod).
3. Các điều kiện thường dùng để kiểm tra Liveness và Readiness Probes
3.1 Điều kiện đánh giá Readiness
Một Readiness Probe kiểm tra xem một ứng dụng đã sẵn sàng phục vụ lưu lượng truy cập hay chưa. Dưới đây là các điều kiện thường kiểm tra: * Kết nối cơ sở dữ liệu: Xác minh rằng ứng dụng có thể kết nối thành công với cơ sở dữ liệu (hoặc các dịch vụ khác mà ứng dụng phụ thuộc). Điều này đảm bảo rằng ứng dụng có tất cả các kết nối cần thiết và có thể thực hiện các hoạt động cơ sở dữ liệu. * Khởi tạo tài nguyên: Đảm bảo rằng tất cả các tài nguyên cần thiết, chẳng hạn như dịch vụ bên ngoài, tệp cấu hình hoặc dịch vụ mạng, đã được khởi tạo và sẵn sàng. * Hoàn thành khởi động: Kiểm tra xem ứng dụng đã hoàn tất quá trình khởi động và không còn ở trạng thái khởi động hoặc cấu hình. * Dịch vụ phụ thuộc: Đảm bảo rằng tất cả các dịch vụ bên ngoài mà ứng dụng phụ thuộc (như API, bộ trung gian tin nhắn hoặc dịch vụ web) đang hoạt động và có thể truy cập được.
@GetMapping("/readiness")
public ResponseEntity<String> readiness() { boolean dbReady = checkDatabaseConnection(); boolean externalServiceReady = checkExternalService(); if (dbReady && externalServiceReady) { return ResponseEntity.ok("Application is ready"); } else { return ResponseEntity.status(503).body("Application is not ready"); }
} private boolean checkDatabaseConnection() { // check database connection return true;
} private boolean checkExternalService() { // Check external service return true;
}
3.2 Điều kiện để đánh giá tính sống còn
Kiểm tra sống còn (Liveness Probe) xác định xem một ứng dụng còn hoạt động hay đã bị treo. Điều này đảm bảo rằng ứng dụng đang chạy và không rơi vào trạng thái không phản hồi hoặc bị treo.
- Sức khỏe ứng dụng: Kiểm tra xem ứng dụng có thể phản hồi các yêu cầu HTTP hoặc lệnh kiểm tra sức khỏe hay không. Nếu ứng dụng không phản hồi, có thể nó bị treo hoặc trục trặc.
- Tài nguyên hệ thống: Trong một số trường hợp, có thể kiểm tra các tài nguyên hệ thống cơ bản để đảm bảo ứng dụng không gặp phải tình trạng cạn kiệt tài nguyên hoặc bế tắc.
- Trạng thái tiến trình: Xác nhận rằng ứng dụng có thể xử lý các yêu cầu và không gặp phải các vấn đề như bế tắc hoặc các vấn đề nghiêm trọng khác.
@GetMapping("/liveness")
public ResponseEntity<String> liveness() { return ResponseEntity.ok("Application is alive");
}
4. Kết luận
Kết thúc phần thảo luận về Kiểm tra Sẵn sàng (Readiness Probe) và Kiểm tra Sống (Liveness Probe) trong Kubernetes, chúng ta có thể thấy rằng việc triển khai đúng các cơ chế này là rất quan trọng để đảm bảo sự ổn định và hiệu suất của các ứng dụng container hóa. Kiểm tra Sẵn sàng xác định khi nào một Pod sẵn sàng nhận lưu lượng truy cập, trong khi Kiểm tra Sống bảo vệ ứng dụng khỏi các trạng thái treo hoặc không phản hồi bằng cách khởi động lại các Pod khi cần thiết. Cấu hình đúng các kiểm tra này không chỉ nâng cao quản lý Pod mà còn cải thiện độ tin cậy và trải nghiệm người dùng.
Hiểu và áp dụng các kỹ thuật này sẽ giúp bạn tối ưu hóa hệ thống Kubernetes của mình, đảm bảo ứng dụng chạy trơn tru và phản hồi nhanh với các yêu cầu của người dùng. Hy vọng bài viết này đã cung cấp cho bạn những thông tin cần thiết để triển khai và quản lý các kiểm tra hiệu quả trong môi trường Kubernetes của bạn.