我正在尝试使用 Istio 和 Envoy 通过 Kubernetes 实现服务网格。我能够设置服务和 istio-proxy,但无法控制容器和 istio-proxy 的启动顺序。
我的容器是第一个启动的,并尝试通过 TCP 访问外部资源,但当时 istio-proxy 尚未完全加载,外部资源的 ServiceEntry 也没有完全加载
我尝试在服务中添加恐慌,并尝试在访问外部资源之前睡眠 5 秒。
有没有办法可以控制这些的顺序?
我在尝试让 Istio 在我的集群上运行时遇到问题。我的基础设施如下所示:
我有一个 Magento 商店,用清漆作为前端缓存。它在安装 istio 之前就可以工作。我已经启用了特使注入。Varnish 部署在 pod 中,并且有自己的服务未缓存重定向到 magento 服务。
当我尝试从 varnish 卷曲到 magento 时,问题就出现了。
如果我从 varnish 卷曲 magento 服务,我会重定向到 magento URL(这是预期的行为)
root@varnish-6468d5958d-dvxhx:/# curl -v store-es
* Rebuilt URL to: store-es/
* Trying 10.32.97.229...
* TCP_NODELAY set
* Connected to store-es (10.32.97.229) port 80 (#0)
> GET / HTTP/1.1
> Host: store-es
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< server: envoy
< date: Wed, 07 Nov 2018 11:08:47 GMT
< content-type: …Run Code Online (Sandbox Code Playgroud) 我正在寻找利用更主流且与语言无关的API代理/包装器来实现常见模式(例如,断路器,运行状况检查等)并跟踪API调用的统计信息。
但是,此包装将用于远程第三方API,而不是我自己的内部SOA /微服务API。
看来这与Hystrix或Phystrix类似,但作为其自身的代理运行,而不依赖于语言。
我以前见过Envoy代理(由Lyft创建),但看起来它仅用于包装内部服务。
可以用于包装第三方API还是有更好的代理?
谢谢
我有一个启用TLS的双向Istio网格。我的设置如下
/info/路由到上述服务。/info/路径定向到图2中描述的服务我正在尝试使用curl命令从入口网关访问服务,例如:
$ curl -X GET http://istio-ingressgateway.istio-system:80/info/ -H "Authorization: Bearer $token" -v
Run Code Online (Sandbox Code Playgroud)
但是我遇到了503 not found错误,如下所示:
$ curl -X GET http://istio-ingressgateway.istio-system:80/info/ -H "Authorization: Bearer $token" -v
Note: Unnecessary use of -X or --request, GET is already inferred.
* Trying 10.105.138.94...
* Connected to istio-ingressgateway.istio-system (10.105.138.94) port 80 (#0)
> GET /info/ HTTP/1.1
> Host: istio-ingressgateway.istio-system
> User-Agent: curl/7.47.0
> Accept: */*
> Authorization: Bearer ...
>
< HTTP/1.1 503 Service Unavailable
< content-length: 57 …Run Code Online (Sandbox Code Playgroud) 在使用特使代理进行外部身份验证后,是否有任何方法可以删除上游的标头?我们计划为我们的内部 API 网关迁移到 Envoy 代理,但现在这是一个障碍。
例如:外部认证服务获取请求并处理认证头,万一验证失败,它会抛出401。但如果成功,我想阻止auth头进入上游。
根据文档Ext Auth:
成功的检查允许授权服务在将原始请求分派到上游之前添加或覆盖来自原始请求的标头。这是通过配置授权响应中的哪些标头应该发送到上游来完成的。请参阅下面的 allowed_authorization_headers。
没有提到我是否可以完全删除上游的标题。
我可以选择覆盖标头,但这会导致上游服务器上的标头冲突。所以这不是一个可能的解决方案。
我怎样才能做到这一点?
我正在尝试配置统计接收器以将统计信息收集到statsd.
我已配置 envoy.yaml 如下:
admin:
access_log_path: /logs/envoy_access.log
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 8001
stats_sinks:
name: envoy.statsd
config:
tcp_cluster_name: statsd-exporter
static_resources:
...
clusters:
- name: app
connect_timeout: 0.25s
type: strict_dns
lb_policy: round_robin
hosts:
- socket_address:
address: {{appName}}
port_value: {{appPort}}
- name: statsd-exporter
connect_timeout: 0.25s
type: strict_dns
lb_policy: round_robin
hosts:
- socket_address:
address: statsd_exporter
port_value: 9125
Run Code Online (Sandbox Code Playgroud)
statsd在同一个 docker 网络中构建为容器。
当我使用 Envoy 和 statsd 运行 docker 容器时,Envoy 显示以下错误:
proxy_1 | [2019-05-06 04:50:38.006][27][info][main] [source/server/server.cc:516] exiting
proxy_1 | tcp statsd: …Run Code Online (Sandbox Code Playgroud) 我有 ext_authz 过滤器,如下所示:
kind: EnvoyFilter
metadata:
name: authn-filter
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
subFilter:
name: "envoy.router"
patch:
operation: INSERT_BEFORE
value:
name: envoy.ext_authz
config:
http_service:
server_uri:
uri: http://authservice.istio-system.svc.cluster.local
cluster: outbound|8080||authservice.istio-system.svc.cluster.local
failure_mode_allow: false
timeout: 10s
authorization_request:
allowed_headers:
patterns:
- exact: "cookie"
- exact: "X-Auth-Token"
authorization_response:
allowed_upstream_headers:
patterns:
- exact: "kubeflow-userid"
status_on_error:
code: GatewayTimeout
Run Code Online (Sandbox Code Playgroud)
问题是它适用于同一入口下的所有虚拟主机。我只想将其应用于特定的虚拟主机。目前我使用以下内容排除一些主机:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: bypass-auth-filter
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingressgateway …Run Code Online (Sandbox Code Playgroud) 我在 scala Play Framework 中有 gRPC 服务器,它在端口 9000 上公开了 gRPC hello world 示例服务。我正在尝试将它与 React Web 客户端连接。我似乎遇到了部署到 Mac 上 docker 容器的 Envoy 代理的连接问题。
\n我总是遇到同样的错误,我认为这意味着 Envoy 无法与后端连接:
\n\xe2\x80\x8bcode: 2\xe2\x80\x8b\nmessage: "Http response at 400 or 500 level"\n\xe2\x80\x8bmetadata: Object { }\nRun Code Online (Sandbox Code Playgroud)\n我用来构建 Envoy 的 docker 文件是:
\nFROM envoyproxy/envoy:v1.12.2\nCOPY ./envoy.yaml /etc/envoy/envoy.yaml\nCMD /usr/local/bin/envoy -c /etc/envoy/envoy.yaml -l trace --log-path /tmp/envoy_info.log\nRun Code Online (Sandbox Code Playgroud)\n我正在使用这个脚本构建它:
\necho --- Building my-envoy docker image ---\ndocker build -t my-envoy:1.0 .\n\necho --- Running my-envoy docker image ---\ndocker run -d -p …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Python 中设置 GRPC 客户端来访问特定服务器。服务器设置为需要通过访问令牌进行身份验证。因此,我的实现如下所示:
def create_connection(target, access_token):
credentials = composite_channel_credentials(
ssl_channel_credentials(),
access_token_call_credentials(access_token))
target = target if target else DEFAULT_ENDPOINT
return secure_channel(target = target, credentials = credentials)
conn = create_connection(svc = "myservice", session = Session(client_id = id, client_secret = secret)
stub = FakeStub(conn)
stub.CreateObject(CreateObjectRequest())
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我尝试使用此连接时,出现以下错误:
File "<stdin>", line 1, in <module>
File "\anaconda3\envs\test\lib\site-packages\grpc\_interceptor.py", line 216, in __call__
response, ignored_call = self._with_call(request,
File "\anaconda3\envs\test\lib\site-packages\grpc\_interceptor.py", line 257, in _with_call
return call.result(), call
File "anaconda3\envs\test\lib\site-packages\grpc\_channel.py", line 343, in result
raise self
File "\anaconda3\envs\test\lib\site-packages\grpc\_interceptor.py", …Run Code Online (Sandbox Code Playgroud) 我们正在使用访问日志字段来提供持续时间类型我们正在使用以下内容
totalDuration: '%DURATION%'
upstreamTime: '%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%'
Run Code Online (Sandbox Code Playgroud)
我们正在获取这些值,但是它在访问日志中的值相同(完全相同的时间),为什么?我想持续时间应该总是大于 upstram_service_time 我在这里错过了什么?
1 We need the total time of the calls E2E - for that we use '%DURATION%'
2. How much time it spent e2e on the upstream '%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%'
Run Code Online (Sandbox Code Playgroud)
可以打印微秒吗?也许我们可以看到差异
envoyproxy ×10
kubernetes ×6
istio ×3
grpc ×2
api ×1
curl ×1
docker ×1
filter ×1
grpc-web ×1
proxy ×1
python ×1
statsd ×1
virtualhost ×1