flo*_*olu 5

1. 将grpc-health-probe二进制文件添加到 Bazel

在你的WORKSPACE文件中添加

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")

http_file(
    name = "grpc_health_check_bin",
    downloaded_file_path = "grpc_health_probe",
    urls = ["https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/v0.3.2/grpc_health_probe-linux-amd64"],
)
Run Code Online (Sandbox Code Playgroud)

下载可执行二进制文件。

2. 实施服务

选项 1:使用grpc-health-check npm 模块

  • 只需阅读文档即可:)

选项 2自行实施健康服务

  1. 转到页面并复制health-checking.proto文件,当前如下所示:
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
    
    http_file(
        name = "grpc_health_check_bin",
        downloaded_file_path = "grpc_health_probe",
        urls = ["https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/v0.3.2/grpc_health_probe-linux-amd64"],
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 BUILD.bazel 文件中创建一个包含 proto 文件的文件组,以便我们稍后可以将其添加到 NodeJs 映像中
    filegroup(
        name = "health_checking_proto",
        srcs = ["health-checking.proto"],
    )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 落实健康服务
    import * as protoLoader from '@grpc/proto-loader'
    import * as grpc from '@grpc/grpc-js'
    
    async function main() {
      const packageDefinition = await protoLoader.load('health-checking.proto')
      const grpcObject = grpc.loadPackageDefinition(packageDefinition)
      const {service} = (grpcObject.grpc as any).health.v1.Health
    
      const server = new grpc.Server()
      const implementation = {
        // status can be on of UNKNOWN, SERVING, NOT_SERVING
        Check: (_call: any, callback: any) => callback(null, {status: 'SERVING'}),
      }
      server.addService(service, implementation)
    
      server.bindAsync('0.0.0.0:9090', grpc.ServerCredentials.createInsecure(), () => server.start())
    }
    
    main()
    
    Run Code Online (Sandbox Code Playgroud)

3. 使用 Bazel 构建并部署 NodeJs 镜像

最终BUILD文件可能如下所示:

load("@npm//@bazel/typescript:index.bzl", "ts_library")
load("@k8s_deploy//:defaults.bzl", "k8s_deploy")
load("@io_bazel_rules_docker//nodejs:image.bzl", "nodejs_image")

package(default_visibility = ["//visibility:public"])

ts_library(
    name = "lib",
    srcs = glob(include = ["**/*.ts"]),
    deps = [
        "@npm//@grpc/grpc-js",
        "@npm//@grpc/proto-loader",
        "@npm//@types/node",
    ],
)

filegroup(
    name = "health_checking_proto",
    srcs = ["health-checking.proto"],
)

nodejs_image(
    name = "image",
    data = [
        # nodejs application
        ":lib",
        # health-checking.proto file
        ":health_checking_proto",
        # grpc-health-probe executable binary
        "@grpc_health_check_bin//file",
    ],
    entry_point = ":index.ts",
)

k8s_deploy(
    name = "k8s",
    images = {"k8s:placeholder_name": ":image"},
    template = ":k8s.yaml",
)
Run Code Online (Sandbox Code Playgroud)

4. 向 Kubernetes 添加 Liveness 和 Readiness 探针

syntax = "proto3";

package grpc.health.v1;

message HealthCheckRequest {
  string service = 1;
}

message HealthCheckResponse {
  enum ServingStatus {
    UNKNOWN = 0;
    SERVING = 1;
    NOT_SERVING = 2;
    SERVICE_UNKNOWN = 3;  // Used only by the Watch method.
  }
  ServingStatus status = 1;
}

service Health {
  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);

  rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}
Run Code Online (Sandbox Code Playgroud)