我们目前有一个设置,我们的 mesos/marathon 集群中的应用程序希望访问可能驻留在或不驻留在我们的 mesos/marathon 集群中的服务。外部流量进入集群是通过位于 Traefik 实例集群前面的 Amazon ELB 完成的,然后与本质上多对多的情况相比,Traefik 实例集群选择适当的一组容器实例来通过传入的 HTTP 主机标头进行负载平衡- 配置的主机标头与特定容器实例的一个关联。内部到内部的流量实际上也是通过相同的路由处理的,因为与给定服务关联的 DNS 记录被映射到我们的 mesos/marathon 集群内部和外部的同一个 ELB。我们还提供了让多个 DNS 记录指向同一容器集的能力。
此设置有效,但会导致我们的 ELB 以及 Traefik 集群看似不必要的网络流量和负载,就好像容器或其他组件中的应用程序能够自行确定它们希望调用的服务位于它们所在的特定 mesos/marathon 集群,并对容器组前面的集群内部的某些内容进行适当的调用,或者直接对特定容器本身进行调用。
根据我对 Kubernetes 的理解,Kubernetes 提供了服务的概念,它本质上可以充当一组 pod 的前端,基于服务应该匹配哪些 pod 的配置。然而,我并不完全确定我们可以让 Kubernetes 集群中的应用程序透明地知道将网络流量引导到服务 IP 的机制。我认为<application-name>.<cluster-name>.company.com,通过使用 Envoy 代理流量(例如服务名称)可以对此有所帮助,但如果我们有一个映射到先前 DNS 条目(例如, <application-name>.company.com)的 CNAME,我不完全确定我们如何可以避免退出集群。
对于这两种情况有没有好的解决办法呢?我们试图避免让应用程序的逻辑必须了解它位于特定的集群中,并且更喜欢应用程序外部的组件来适当地执行路由。
如果我从根本上误解了某个特定组件,我将很乐意纠正!
大家好,我是 Envoy 和 Istio 的新手。我正在尝试编写一个特使过滤器来重写/重定向 HTTP(s) 请求。下面是我的配置(是的,一个玩具示例),但它不起作用。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: lua-filter
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_OUTBOUND
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
subFilter:
name: "envoy.router"
patch:
operation: INSERT_BEFORE
value:
name: envoy.lua
typed_config:
"@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
inlineCode: |
function envoy_on_request(request_handle)
request_handle:headers():add("authorization", "it works!")
end
function envoy_on_response(response_handle)
filter_name = "ENVOY"
response_handle:headers():add("my_Filter", filter_name)
end
Run Code Online (Sandbox Code Playgroud)
在我部署应用程序(在端口 443 上侦听 https,在 Cloudflare 后面)和特使过滤器之后,我执行curl -v <my_app>. 我没有看到添加的请求标头或响应标头。我也尝试添加xff_num_trusted_hops: 2一些其他答案的建议,但无济于事。我做错了什么?
我已经为 envoy 编写了 ext_authz 过滤器,并且对 envoy 过滤器的工作原理有基本的了解。但现在我想过滤从上游返回的响应。具体来说,我想处理两件事:
在 Envoy 发送回下游之前,拦截来自上游的 data/jsonBody 并根据某些业务规则过滤/修改 responseJsonBody。
如果上游关闭(当http响应代码408-超时时),我想将后请求保存到async-msg-que并将202-Accepted发送回下游。这样,当上游返回时,它将处理来自 async-msg-que 的待处理后请求。
是否有现有的过滤器可以用于这些目的,或者使用 envoy-proxy sidecar 执行此操作的正确方法是什么。
谢谢。
当调试 envoy 时,我尝试从转储的配置文件运行,但无法弄清楚。
使用envoy admin api '/config_dump'转储配置。
curl -X POST http://127.0.0.1:15000/config_dump -o envoy.config
Run Code Online (Sandbox Code Playgroud)
但无法启动,出现错误:
envoy --config-path envoy.config
...
[2019-12-22 12:40:50.313][194][critical][main] [external/envoy/source/server/server.cc:98] error initializing configuration 'envoy.config': Protobuf message (type envoy.config.bootstrap.v2.Bootstrap reason INVALID_ARGUMENT:configs: Cannot find field.) has unknown fields
[2019-12-22 12:40:50.313][194][info][main] [external/envoy/source/server/server.cc:607] exiting Protobuf message (type envoy.config.bootstrap.v2.Bootstrap reason INVALID_ARGUMENT:configs: Cannot find field.) has unknown fields
Run Code Online (Sandbox Code Playgroud) 我已经在 grpc.mydomain.com 上使用 LetsEncrypt 在 traefik 上启动并运行了一项服务。但是,由于 CORS 的一些问题,traefik 不支持路由 grpc-web 请求(https://github.com/containous/traefik/issues/4210)。Envoy 似乎是 traefik 的替代品,它与 grpc-web 一起使用,但我不想重新配置所有内容。
如果我将 envoy 放在 envoy.mydomain.com 上,那么它实际上会首先访问 traefik,并且 traefik 无法将 grpc-web 请求路由到 envoy。所以这是行不通的。
如果我将 envoy 置于 traefik (mydomain.com:9091) 之外,则 envoy 不具备 traefik 所具备的 TLS 支持。
我需要将所有内容都切换为 Envoy 吗?还有我没有考虑过的替代方案吗?欢迎任何指导:)
当前 Traefik 设置:
traefik:
image: traefik:v2.0.0
container_name: traefik
command:
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --entrypoints.grpc.address=:8090
- --providers.docker
- --api
- --serversTransport.rootCAs=/certs/grpc.cert
# Lets Encrypt Resolvers
- --certificatesresolvers.leresolver.acme.email=${EMAIL}
- --certificatesresolvers.leresolver.acme.storage=/etc/acme/cert.json
- --certificatesresolvers.leresolver.acme.tlschallenge=${TLS_CHALLENGE}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- …Run Code Online (Sandbox Code Playgroud) 我试图了解如何使用 @type 键以及在哪里可以获取它的值。
例如,遵循文档中前端代理的简单示例。
在配置中设置侦听器,然后设置过滤器链。在 typed_config 中,我知道需要“@type”键来指定我们正在使用的过滤器类型。
我不完全理解这些值从何而来
在前面提到的情况下,配置使用:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
但是转到 HttpConnectionManager 文档中的 API 链接,类型似乎不同[extensions.filters.network.http_connection_manager.v3.HttpConnectionManager proto]
对我来说,这似乎是 v2 -> v3 的更改,并且文档示例已完全更新。但是有没有什么地方可以解释这些类型的来源以及哪些值是有效的?
如何在envoy中提取jwt ,并将提取的值放入标头
我需要在 http_filters 下面添加一些额外的属性,但我对此一无所知,并且我研究了jwtProvider和jwtHeader,它们都出现在 envoy 文档中
这是我的envoy.yaml文件,此配置有什么问题:
admin:
access_log_path: "/dev/null"
address:
socket_address:
address: 0.0.0.0
port_value: 8001
static_resources:
listeners:
- name: main
address:
socket_address:
address: 0.0.0.0
port_value: 1337
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
host_rewrite_literal: 0.0.0.0
cluster: web_service
http_filters:
- name: config.filter.http.jwt_authn.v2alpha.JwtHeader
from_params:
- jwt_token
- …Run Code Online (Sandbox Code Playgroud)