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 Hostheader 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!