昨天写了envoy的lds、cds基于文件系统的动态配置,今天整理一下eds的基于文件系统的动态配置。

resources:
- "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
  connect_timeout: 1s
  name: k8s.proxy
  type: EDS
  http2_protocol_options: {}
  eds_cluster_config:
    eds_config:
      path: /root/envoy/test.endpoint.json

首先需要将cluster的type类型改为EDS,表明该Cluster是基于EDS发现上游服务的。翻看envoy的grpc协议文件可以看出json格式内容

message DiscoveryResponse {
  option (udpa.annotations.versioning).previous_message_type =
      "envoy.service.discovery.v3.DiscoveryResponse";
  string version_info = 1;
  repeated google.protobuf.Any resources = 2;
  bool canary = 3;
  string type_url = 4;
  string nonce = 5;
  config.core.v4alpha.ControlPlane control_plane = 6;
}
message ClusterLoadAssignment {
  option (udpa.annotations.versioning).previous_message_type = "envoy.api.v2.ClusterLoadAssignment";
 
  message Policy {
    option (udpa.annotations.versioning).previous_message_type =
        "envoy.api.v2.ClusterLoadAssignment.Policy";

   
    message DropOverload {
      option (udpa.annotations.versioning).previous_message_type =
          "envoy.api.v2.ClusterLoadAssignment.Policy.DropOverload";

      // Identifier for the policy specifying the drop.
      string category = 1 [(validate.rules).string = {min_len: 1}];

      // Percentage of traffic that should be dropped for the category.
      type.v3.FractionalPercent drop_percentage = 2;
    }

    reserved 1, 5;

    reserved "disable_overprovisioning";
    
    repeated DropOverload drop_overloads = 2;

    google.protobuf.UInt32Value overprovisioning_factor = 3 [(validate.rules).uint32 = {gt: 0}];

    google.protobuf.Duration endpoint_stale_after = 4 [(validate.rules).duration = {gt {}}];
  }
 
  string cluster_name = 1 [(validate.rules).string = {min_len: 1}];

  repeated LocalityLbEndpoints endpoints = 2;
  
  map<string, Endpoint> named_endpoints = 5;

  Policy policy = 4;
}

简单的EDS配置文件如下

{
    "version_info": "1",
    "resources": [
        {
            "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment",
            "cluster_name": "k8s.proxy",
            "endpoints": [
                {
                    "lb_endpoints": [
                        {
                            "endpoint": {
                                "address": {
                                    "socket_address": {
                                        "address": "xxx.xx.xx.xx",
                                        "port_value": 80
                                    }
                                }
                            }
                        },
                        {
                            "endpoint": {
                                "address": {
                                    "socket_address": {
                                        "address": "xxx.xxx.xxx",
                                        "port_value": 80
                                    }
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

这样配置之后就可以只更新某个Cluster的EndPoint,而不是更新整个cds配置。