什麼是控制面板
這篇我們來看看如何通過控制平面(Control Panel)來配置Envoy。
控制平面就是一個提供Envoy配置信息的單獨服務,Envoy可以通過調用這個服務的api來加載配置。
配置控制面板
官方爲我們提供了兩種已經實現好的控制面板。
go控制面板:https://github.com/envoyproxy/go-control-plane
java控制面板:https://github.com/envoyproxy/java-control-plane
我們下載官方的go語言控制面板,先來看看go控制面板中提供的樣例結構。
其中有三個核心文件,main.go,server.go,與resource.go
1.main.go:啓動go-controll-panel的入口
2.server.go:定義go-controll-panel的grpc服務
3.resource.go:定義了envoy相關的資源配置,包括cluster,listener,endpoint等
其中resource.go組成了一個結構化的配置信息,並通過server.go中的grpc提供給envoy,而main.go則是啓動了grpc,因此我們需要修改的就是resource.go中的資源配置,需要將裏面的cluster,listener,endpoint等設置爲我們自己的服務信息。下面我們就來將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方法,指定兩個測試server,server1與server2的地址爲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, }, }, }, }, }, }, }, }, }}, } }
啓動控制平面
控制平面監聽在18000端口
配置Envoy
.NET網關與Gateway實戰-Envoy與kong課程希望大家支持 https://ke.qq.com/course/4033027?tuin=1271860f
我們需要配置Envoy.yaml讓Envoy從控制平面中獲取詳細的配置信息。我們可以參考官網的推薦配置。
1.需要在dynamic_resources中配置ads_config,並讓cds_config與lds_config從中讀取
2.另外我們需要配置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
測試
我們通過http://localhost:10000/Name來判斷我們的配置是不是配置成功
可以看到其中一次調用返回了server1,另一次調用返回了server2,控制面板驗證成功!
二次開發
目前的樣例代碼中提供的配置都是硬編碼的方式,把配置寫死在代碼中,如果生產環境中我們想使用這種方式來配置envoy,我們可以基於現在的代碼二次開發。開發的步驟如下:
1.新增數據庫表結構組織Envoy中的資源,比如Listener表,Cluster表,Endpoint表,Route表
2.新增接口來對Listener,Cluster,Endpoint,Route等資源進行增刪改查
3.新增UI來調用增刪改查接口,對資源進行管理
4.定時刷新Snapshot信息
這樣我們就可以實現一個可視化的界面來動態的配置我們的Envoy。