使用 Envoy

部署polaris

kubernetes环境使用

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

虚拟机环境使用

如果已经部署好了polaris,可忽略这一步。

polaris支持在linux虚拟机环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

Envoy Gateway 启动配置

  1. node:
  2. # Envoy 的 node 配置必须遵守以下规则
  3. id: "gateway~${envoy gateway 网关服务所在的命名空间}/${UUID}~${envoy 节点IP}"
  4. metadata:
  5. gateway_service: ${envoy gateway 网关服务名称}
  6. gateway_namespace: ${envoy gateway 网关服务所在的命名空间}
  7. dynamic_resources:
  8. ads_config:
  9. api_type: GRPC
  10. transport_api_version: V3
  11. grpc_services:
  12. - google_grpc:
  13. target_uri: ${北极星服务端IP}:15010
  14. stat_prefix: polarismesh
  15. channel_args:
  16. args:
  17. grpc.http2.max_ping_strikes:
  18. int_value: 0
  19. grpc.keepalive_time_ms:
  20. int_value: 10000
  21. grpc.keepalive_timeout_ms:
  22. int_value: 20000

说明:

  • 当前推荐 envoy 版本为 envoyproxy/envoy-contrib:v1.21.4
  • 必须在北极星创建 envoy gateway 的服务,其服务名为 ${node.metadata.gateway_service}, 所在命名空间为 ${node.metadata.gateway_namespace}

创建 Envoy Gateway 使用的路由规则

假定现在有两个服务 service-a 以及 service-b,希望 Envoy Gateway 能够按照以下规则路由到特定的服务

  • 路由到 service-a
    • 条件 1: http path 为 /api/v1/service-a
  • 路由到 service-b
    • 添加 1: http path 为 /api/v1/service-b

那么需要按照下列步骤准备

准备 Envoy 启动配置

  • 参考 Envoy Gateway 启动配置 创建 gateway_xds_test.yaml

    1. # 这里只给出 node 节点部份的配置
    2. node:
    3. id: "gateway~default/c962adc3-673e-4637-9ba8-969d755ef66a~127.0.0.1"
    4. cluster: "CLUSTER_NAME"
    5. metadata:
    6. gateway_service: EnvoyGateway
    7. gateway_namespace: default
  • 在北极星上创建服务,服务名为 EnvoyGateway, 所在命名空间为 default

创建路由到 service-a 的路由规则

使用 Envoy - 图1

创建路由到 service-b 的路由规则

使用 Envoy - 图2

运行 Envoy Gateway

  1. docker run -it --rm -p 15001:15001 -p 15000:15000 -v $(pwd)/gateway_xds_test.yaml:/gateway_xds_test.yaml envoyproxy/envoy-contrib:v1.21.4 -c /gateway_xds_test.yaml

查看 Envoy Gateway 收到的 XDS 规则

进入 envoy 容器执行以下命令

  1. curl http://127.0.0.1:15000/config_dump

如果 RoutesConfigDump 如下,则 XDS 规则获取成功

  1. {
  2. "@type":"type.googleapis.com/envoy.admin.v3.RoutesConfigDump",
  3. "dynamic_route_configs":[
  4. {
  5. "version_info":"2023-04-01T01:06:47+08:00/9",
  6. "route_config":{
  7. "@type":"type.googleapis.com/envoy.config.route.v3.RouteConfiguration",
  8. "name":"polaris-router",
  9. "virtual_hosts":[
  10. {
  11. "name":"gateway-virtualhost",
  12. "domains":[
  13. "*"
  14. ],
  15. "routes":[
  16. {
  17. "match":{
  18. "path":"/api/v1/service-a"
  19. },
  20. "route":{
  21. "weighted_clusters":{
  22. "clusters":[
  23. {
  24. "name":"service-a",
  25. "weight":100,
  26. "metadata_match":{
  27. "filter_metadata":{
  28. "envoy.lb":{
  29. "env":"prod"
  30. }
  31. }
  32. }
  33. }
  34. ],
  35. "total_weight":100
  36. }
  37. }
  38. },
  39. {
  40. "match":{
  41. "path":"/api/v1/service-b"
  42. },
  43. "route":{
  44. "weighted_clusters":{
  45. "clusters":[
  46. {
  47. "name":"service-b",
  48. "weight":100,
  49. "metadata_match":{
  50. "filter_metadata":{
  51. "envoy.lb":{
  52. "env":"prod"
  53. }
  54. }
  55. }
  56. }
  57. ],
  58. "total_weight":100
  59. }
  60. }
  61. },
  62. {
  63. "match":{
  64. "prefix":"/"
  65. },
  66. "route":{
  67. "cluster":"PassthroughCluster"
  68. }
  69. }
  70. ]
  71. }
  72. ],
  73. "validate_clusters":false
  74. },
  75. "last_updated":"2023-03-31T17:06:47.547Z"
  76. }
  77. ]
  78. }

请求验证

  1. curl http://127.0.0.1:15000/api/v1/service-a
  2. # 期望输出:I'm service-a
  3. curl http://127.0.0.1:15000/api/v1/service-b
  4. # 期望输出:I'm service-b

附录:Demo 程序

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "net/http"
  6. "os"
  7. )
  8. func main() {
  9. handler := func(w http.ResponseWriter, req *http.Request) {
  10. io.WriteString(w, "I'm "+os.Getenv("SERVICE_NAME"))
  11. }
  12. http.HandleFunc("/", handler)
  13. log.Fatal(http.ListenAndServe(":"+os.Getenv("PORT"), nil))
  14. }