k8s與健康檢查--grpc服務健康檢查最佳實踐

前言

GRPC正在成爲雲原生微服務之間通訊的通用語言。若是您今天要將gRPC應用程序部署到Kubernetes,您可能想知道配置運行情況檢查的最佳方法。在本文中,咱們將討論grpc-health-probe,一種Kubernetes本地健康檢查gRPC應用程序的方法。linux

果您不熟悉,Kubernetes健康檢查(liveness and readiness probes)就是讓您的應用程序在您睡覺時保持可用的緣由。他們檢測到沒有響應的pod,將它們標記爲不健康,並致使這些pod從新啓動或從新調度。git

kubernetes自己不支持gRPC健康檢查。這使得gRPC開發人員在部署到Kubernetes時有如下三種方法:github

圖片描述

  • httpGet probe: 不能與gRPC原生使用。您須要重構您的應用程序以同時提供gRPC和HTTP / 1.1協議(在不一樣的端口號上)。
  • tcpSocket probe: 打開套接字到gRPC服務器是沒有意義的,由於它沒法讀取響應正文。
  • exec probe: 這會按期調用容器生態系統中的程序。對於gRPC,這意味着您本身實現健康RPC,而後使用編寫客戶端工具,並將客戶端工具與容器打包到一塊兒。

grpc-health-probe 解決方案

爲了標準化上面提到的「exec探針」方法,咱們須要:服務器

  • 標準的健康檢查「協議」,能夠輕鬆地在任何gRPC服務器中實現。
  • 標準的健康檢查「工具」,能夠輕鬆查詢健康協議。

得慶幸的是,gRPC有一個標準的健康檢查協議。它能夠從任何語言輕鬆使用。生成的代碼和用於設置運行情況的實用程序幾乎都在gRPC的全部語言實現中提供。tcp

若是在gRPC應用程序中實現此運行情況檢查協議,則可使用標準/通用工具調用此Check()方法來肯定服務器狀態。微服務

下來你須要的是「標準工具」,它是grpc-health-probe工具

圖片描述

使用此工具,您能夠在全部gRPC應用程序中使用相同的運行情況檢查配置。這種方法須要你:spa

  • 選擇您喜歡的語言找到gRPC「health」模塊並開始使用它(例如Go庫)。
  • 將grpc_health_probe二進制文件打到容器中。
  • 配置Kubernetes「exec」探針以調用容器中的「grpc_health_probe」工具。

示例

您能夠將靜態編譯的grpc_health_probe打在容器映像中。選擇二進制版本並將其下載到Dockerfile中:code

RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
    chmod +x /bin/grpc_health_probe

在你的 Kubernetes Pod manifest中,指定容器的 livenessProbe and/or readinessProbe 。server

spec:
  containers:
  - name: server
    image: "[YOUR-DOCKER-IMAGE]"
    ports:
    - containerPort: 5000
    readinessProbe:
      exec:
        command: ["/bin/grpc_health_probe", "-addr=:5000"]
      initialDelaySeconds: 5
    livenessProbe:
      exec:
        command: ["/bin/grpc_health_probe", "-addr=:5000"]
      initialDelaySeconds: 10

服務器健康檢查的代碼實現,主要部分以下:

hsrv := health.NewServer()
    hsrv.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
    healthpb.RegisterHealthServer(s, hsrv)

完整代碼,請查看git倉庫

相關文章
相關標籤/搜索