Envoy實現.NET架構的網關(二)基於控制平面的動態配置

什麼是控制平面

上一篇我們講了文件系統的動態配置,這次我們來看看通過Control Panel來配置Envoy。控制平面就是一個提供Envoy配置資訊的單獨服務,我們可以通過這個服務來修改Envoy的配置。官方為我們提供了兩種已經實現好的控制面板。

 

go控制面板://github.com/envoyproxy/go-control-plane

java控制面板://github.com/envoyproxy/java-control-plane

配置控制面板

我們下載官方的go語言控制面板,並修改go-control-plane\internal\example\resource.go中的配置

首先修改upstream資訊,指定我們的上游ip與兩個上有服務的埠

const (
    ClusterName   = "example_proxy_cluster"
    RouteName     = "local_route"
    ListenerName  = "listener_0"
    ListenerPort  = 10000
    UpstreamHost  = "192.168.43.94"
    UpstreamPort  = 5000
    UpstreamPort2 = 5001
)

然後我們修改,修改dns類型,修改為靜態dns解析

func makeCluster(clusterName string) *cluster.Cluster {
    return &cluster.Cluster{
        Name:                 clusterName,
        ConnectTimeout:       ptypes.DurationProto(5 * time.Second),
        ClusterDiscoveryType: &cluster.Cluster_Type{Type: cluster.Cluster_STATIC},
        LbPolicy:             cluster.Cluster_ROUND_ROBIN,
        LoadAssignment:       makeEndpoint(clusterName),
        DnsLookupFamily:      cluster.Cluster_V4_ONLY,
    }
}

修改makeEndpoint方法,指定兩個Endpoint

func makeEndpoint(clusterName string) *endpoint.ClusterLoadAssignment {
    return &endpoint.ClusterLoadAssignment{
        ClusterName: clusterName,
        Endpoints: []*endpoint.LocalityLbEndpoints{{
            LbEndpoints: []*endpoint.LbEndpoint{{
                HostIdentifier: &endpoint.LbEndpoint_Endpoint{
                    Endpoint: &endpoint.Endpoint{
                        Address: &core.Address{
                            Address: &core.Address_SocketAddress{
                                SocketAddress: &core.SocketAddress{
                                    Protocol: core.SocketAddress_TCP,
                                    Address:  UpstreamHost,
                                    PortSpecifier: &core.SocketAddress_PortValue{
                                        PortValue: UpstreamPort,
                                    },
                                },
                            },
                        },
                    },
                },
            },
                {
                    HostIdentifier: &endpoint.LbEndpoint_Endpoint{
                        Endpoint: &endpoint.Endpoint{
                            Address: &core.Address{
                                Address: &core.Address_SocketAddress{
                                    SocketAddress: &core.SocketAddress{
                                        Protocol: core.SocketAddress_TCP,
                                        Address:  UpstreamHost,
                                        PortSpecifier: &core.SocketAddress_PortValue{
                                            PortValue: UpstreamPort2,
                                        },
                                    },
                                },
                            },
                        },
                    },
                },
            },
        }},
    }
}

啟動控制平面

PS C:\demo\go-control-plane\internal\example\main> go run .\main.go
2021/10/29 15:55:14 management server listening on 18000

配置Envoy.yaml

我們需要配置Envoy.yaml讓Envoy從控制平面中獲取詳細的配置資訊,需要在dynamic_resources中配置ads_config,並讓cds_config與lds_config從中讀取;另外我們需要配置xds cluster,讓Envoy知道控制平面的地址。具體配置資訊如下:

admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9902
      
node:
  cluster: test-cluster
  id: test-id

dynamic_resources:
  ads_config:
    api_type: GRPC
    transport_api_version: V3
    grpc_services:
    - envoy_grpc:
        cluster_name: xds_cluster
  cds_config:
    resource_api_version: V3
    ads: {}
  lds_config:
    resource_api_version: V3
    ads: {}

static_resources:
  clusters:
  - type: STRICT_DNS
    typed_extension_protocol_options:
      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
        "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
        explicit_http_config:
          http2_protocol_options: {}
    name: xds_cluster
    load_assignment:
      cluster_name: xds_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 192.168.43.94
                port_value: 18000

運行Envoy

我們通過docker運行Envoy

docker run --rm -it -p 9902:9902 -p 10000:10000 -v D:/gateway/envoy/config/dynamic-plane/:/etc/envoy/ -v D:/gateway/envoy/logs:/logs envoyproxy/envoy-dev  -c /etc/envoy/envoy.yaml

啟動我們上一節的server1與server2

 

 調用//localhost:10000/Name,負載成功!!!

Tags: