iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0

Kubernetes 需要知道應用的健康狀況,Quarkus 也內建了 Extension 可以容易的提供探針(Probe) 予 Kubernetes 作健康檢查。關於 Application 的健康,主要分成以下兩種探針

Liveness 探針

告訴 K8S 說你的 Quarkus 應用在已服務的狀況下是否活著,如果是 down 的話,Platform 可以作一些自動回復的動作。例如重啟 pod, 新增更多的pod 等等。

Readiness 探針

告訴 platform 說你的應用已經暖機完成,可以開始接受服務,例如可能開始後要先作一些資料庫連接才能開始接受 request。

增加 Health 擴展支援

用 quarkus 指令新增

quarkus ext add quarkus-smallrye-health

或是手動新增 pom dependency

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-health</artifactId>
    </dependency>

測試 /q/health

可以看到因為有接 mongodb ,所以也會自動加入 mongodb 的連接狀況

curl localhost:8080/q/health
{
    "status": "UP",
    "checks": [
        {
            "name": "MongoDB connection health check",
            "status": "UP"
        }
    ]
}

新增客製 liveness 探針

新增以下檔案
src/kotlin/tw.brandy.ironman.health.CustomLiveness.kt

import org.eclipse.microprofile.health.HealthCheck
import org.eclipse.microprofile.health.HealthCheckResponse
import org.eclipse.microprofile.health.Liveness

@Liveness
class CustomLiveness : HealthCheck {

    override fun call(): HealthCheckResponse =
        HealthCheckResponse.up("I'm alive")
}

新增客製 Readiness 探針

Quarkus 裡面的很多 Extensions 都會提供預設的健康檢查,而且會自動注冊到 health probes 裡,像是管理 datasource 的 agroal, 就會把每個 datasource 都注冊。

但是是在 API first 的世界,我們有更多東西要 check 像是外部的 RESTful 服務。 例如如果我們的服務依賴了 https://www.fruityvice.com ,可能就需要新增這個外部服務的檢查

新增以下檔案與設定

src/kotlin/tw.brandy.ironman.health.CutsomReadiness.kt

@ApplicationScoped
class CutsomReadiness {

    @ConfigProperty(
        name = "tw.brandy.ironman.FruityViceService/mp-rest/url",
        defaultValue = "https://www.fruityvice.com"
    )
    lateinit var externalUrl: String

    @Readiness
    fun checkUrl() = UrlHealthCheck("$externalUrl/api/fruit/banana")
        .name("ExternalURL health check").requestMethod(HttpMethod.GET).statusCode(200)
}

重新查看 health

curl localhost:8080/health

{
    "status": "UP",
    "checks": [
        {
            "name": "I'm alive",
            "status": "UP"
        },
        {
            "name": "MongoDB connection health check",
            "status": "UP"
        },
        {
            "name": "ExternalURL health check",
            "status": "UP",
            "data": {
                "host": "GET https://www.fruityvice.com/api/fruit/banana"
            }
        }
    ]
}

在 dev mode 也可以有 UI: http://localhost:8080/q/health-ui/
(其實就只是跟 JSON 長一樣)

https://ithelp.ithome.com.tw/upload/images/20220926/20135701lvKNMxxLSV.png

參考資料


上一篇
Quarkus 的設定檔, Kube-native 的讀取順序 - application.properties & ENV
下一篇
Quarkus 的可觀測性 Metrics , Prometheus-Ready
系列文
Quarkus, Kotlin, Reactive 雲原生服務開發32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言