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,負載成功!!!