Tips nhỏ với httpGet trong livenessProbe và readinessProbe
Khi làm việc với Kubernetes (K8s) thì hai khái niệm livenessProbe và readiness Probe khá quan trọng, nó là một trong những thứ giúp cho các ứng dụng của bạn tiếp tục hoạt động nếu có lỗi xảy ra.
Như chúng ta biết thì livenessProbe
sẽ giúp K8s biết rằng ứng dụng của bạn có đang alive hay không. Còn readinessProbe
sẽ giúp cho K8s biết ứng dụng của bạn có ready cho việc serve
những request tới hay chưa. Với các ứng dụng là webserver thì sử dụng cách httpGet
thường được áp dụng.
httpGet
sẽ tính là thành công nếu http response code là 200.
Tuy nhiên vấn đề là các ứng dụng là webserver thì thường không chỉ mở port 80 mà còn kiểm tra nó đang phục vụ cho domain nào. Nếu domain trong những request không khớp với cái mà app chúng ta quan tâm thì thường nó sẽ redirect tới domain mà nó phục vụ và chúng ta code 302
được trả về từ app của chúng ta. K8s sẽ tính cái Pod đó của bạn không ready và cố gắng restart nó. Và chúng ta có một vọng loop lẩn quẩn.
Để giải quyết vấn đề này khi sử dụng httpGet
chúng ta nên gửi kèm theo thông tin Host
header trong những request để app của chúng ta biết mình đang phục vụ đúng domain.
Một đoạn code mẫu mà chúng ta có thể tham khảo. Chú thích thêm là trong ví dụ này có truyền thêm thông tin initialDelaySeconds
vì một vài app cần một chút thời gian để khởi động nhé.
livenessProbe:
initialDelaySeconds: 30
failureThreshold: 5
timeoutSeconds: 5
httpGet:
path: /
port: http
httpHeaders:
- name: Host
value: "kikiguru.com"
- name: X-Forwarded-Proto
value: "https"
readinessProbe:
initialDelaySeconds: 30
timeoutSeconds: 5
failureThreshold: 5
httpGet:
path: /
port: http
httpHeaders:
- name: Host
value: "kikiguru.com"
- name: X-Forwarded-Proto
value: "https"
Chúc anh em vui!