我已经在 k8s 上部署了 Envoy 容器,作为 Istio 部署的一部分。每个 Envoy 代理容器都作为“sidecar”安装在 k8s pod 中的应用程序容器旁边。
我能够从应用程序内部启动 HTTP 流量,但是当尝试联系 Redis 服务器(另一个具有另一个特使代理的容器)时,我无法连接和接收 HTTP/1.1 400 Bad Request来自特使的消息。
在检查特使的日志时,每当此连接通过特使时,我都可以看到以下消息: HTTP/1.1" 0 - 0 0 0 "_"."_"."_"."_""
据我了解,Redis 命令使用纯 TCP 传输(无 HTTP)发送。Envoy 是否可能只希望看到 HTTP 流量并拒绝仅 TCP 流量?假设我的理解是正确的,有没有办法使用 Istio 改变这种行为并接受和处理通用 TCP 流量?
以下是我的相关部署yaml文件:
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
labels:
component: redis
role: client
spec:
selector:
app: redis
ports:
- name: http
port: 6379
targetPort: 6379
protocol: TCP
type: ClusterIP
apiVersion: extensions/v1beta1
kind: Deployment
metadata: …Run Code Online (Sandbox Code Playgroud) Istio 如何支持同一服务中的 Pod 之间基于 IP 的路由(或者更具体地说是 ReplicaSet)?
我们想在 Istio 网格中部署一个副本 > 1 的 Tomcat 应用程序。该应用程序运行 Infinispan,它使用 JGroups 来整理通信和集群。JGroups 需要识别其集群成员,为此需要使用 KUBE_PING(JGroups 的 Kubernetes 发现协议)。它将通过类似于kubectl get pods的查找来咨询 K8S API 。集群成员既可以是其他服务中的 pod,也可以是同一服务/部署中的 pod。
尽管我们的问题是由相当具体的需求驱动的,但该主题是通用的。我们如何让 pod 能够在副本集内相互通信?
示例:作为展示,我们部署了演示应用程序https://github.com/jgroups-extras/jgroups-kubernetes。相关的东西是:
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ispn-perf-test
namespace: my-non-istio-namespace
spec:
replicas: 3
< -- edited for brevity -- >
Run Code Online (Sandbox Code Playgroud)
在没有 Istio的情况下运行,三个 Pod 会相互找到并形成集群。在my-istio-namespace 中使用 Istio部署相同的内容并添加基本服务定义:
kind: Service
apiVersion: v1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 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) 我在 Kubernetes 环境中使用https://github.com/jetstack/cert-manager自动加载https://letsencrypt.org/。它创建的证书将在 90 天后过期。在到期前30 天,cert-manager 更新证书并替换证书。证书存储在 k8s 机密中。
你如何让 Envoy Proxy自动重新加载证书?这些问题已关闭,似乎没有答案。有人提到可以帮助提供解决方案的 Secret Discovery Service (SDS),但我还没有弄清楚。
对于 nginx,可以通过将 k8s 机密添加到 k8s 卷,将卷挂载到文件系统以供 nginx 使用来配置 TLS。然后可以使用文件系统观察程序调用sudo nginx -s reload以在证书更改时重新加载配置。我看到 Envoy Proxy 支持hot restart,但我没有看到类似于 nginx 的命令来让它热重启。
有一个hot-restarter.py,但它不是文件观察器,我宁愿不在 envoyproxy/envoy:latest docker 镜像上安装 python。我认为该程序的某些功能可能会内置到一个也可以查看文件的 Rust 应用程序中,但是对于这种非常常见的场景,必须已经存在一些东西,对吧?
我正在寻找具有基于 URL 的亲和性的服务代理(或负载平衡器)。
这是用于在集群内部的 Kubernetes 中使用的:我正在寻找一个“内部”负载均衡器,我不需要将服务暴露在外面。
默认情况下,Kubernetes 中的 Service 使用“循环”算法。
我想要基于 HTTP URL 的一部分的一些亲和性:第一个请求将转到随机 pod,使用相同 URL 的后续请求将(最好)转到同一个 pod。
我已经阅读了一些关于基于 sourceIP 的亲和性的文档,这是否基于 URL 存在?
我已经快速阅读了 Envoy,也许使用“Ring hash”负载平衡算法就可以了,但我不知道是否可以基于 URL 进行散列。
也许使用 kube-proxy 的“ipvs”代理模式(https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-ipvs)可以,但我只看到“目的地散列”和“源哈希”作为负载平衡算法,我也不知道如何配置它。
我正在尝试通过博客的帮助构建特使代理,但在那里遇到了一些问题。
首先,博客修复了 ip 地址,并且它与任何 URL 通配符匹配,保留唯一重要的端口,但是当我尝试运行http://192.168.99.100:9901/博客中给出的管理命令的 URL 时,它没有打开,而当我尝试它时我的IP,它运行成功。
而且,我在浏览器上打开个人服务或产品服务的网页时遇到问题,要么http://192.168.99.100:10000/person是博客中提供的,要么是在浏览器和邮递员中使用http://<myip>:10000/person它们显示no healthy upstream的,我不知道no healthy upstream.
我没有使用zipkins。
我看过相关的问题,no healthy upstream但我找不到可以解决这个问题的答案。
请帮忙。
我试图从特使文档中设置一个基本的特使代理(使用 Docker),但我不断收到如下解析错误:
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:238] initializing epoch 0 (hot restart version=11.104)
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:240] statically linked extensions:
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:242] access_loggers: envoy.file_access_log,envoy.http_grpc_access_log
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:245] filters.http: envoy.buffer,envoy.cors,envoy.csrf,envoy.ext_authz,envoy.fault,envoy.filters.http.dynamic_forward_proxy,envoy.filters.http.grpc_http1_reverse_bridge,envoy.filters.http.header_to_metadata,envoy.filters.http.jwt_authn,envoy.filters.http.original_src,envoy.filters.http.rbac,envoy.filters.http.tap,envoy.grpc_http1_bridge,envoy.grpc_json_transcoder,envoy.grpc_web,envoy.gzip,envoy.health_check,envoy.http_dynamo_filter,envoy.ip_tagging,envoy.lua,envoy.rate_limit,envoy.router,envoy.squash
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:248] filters.listener: envoy.listener.original_dst,envoy.listener.original_src,envoy.listener.proxy_protocol,envoy.listener.tls_inspector
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:251] filters.network: envoy.client_ssl_auth,envoy.echo,envoy.ext_authz,envoy.filters.network.dubbo_proxy,envoy.filters.network.mysql_proxy,envoy.filters.network.rbac,envoy.filters.network.sni_cluster,envoy.filters.network.thrift_proxy,envoy.filters.network.zookeeper_proxy,envoy.http_connection_manager,envoy.mongo_proxy,envoy.ratelimit,envoy.redis_proxy,envoy.tcp_proxy
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:253] stat_sinks: envoy.dog_statsd,envoy.metrics_service,envoy.stat_sinks.hystrix,envoy.statsd
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:255] tracers: envoy.dynamic.ot,envoy.lightstep,envoy.tracers.datadog,envoy.tracers.opencensus,envoy.zipkin
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:258] transport_sockets.downstream: envoy.transport_sockets.alts,envoy.transport_sockets.tap,raw_buffer,tls
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:261] transport_sockets.upstream: envoy.transport_sockets.alts,envoy.transport_sockets.tap,raw_buffer,tls
[2019-09-30 11:16:05.313][1][info][main] [source/server/server.cc:267] buffer implementation: old (libevent)
[2019-09-30 11:16:05.318][1][critical][main] [source/server/server.cc:93] error initializing configuration '/etc/envoy/envoy.yml': Unable to parse JSON as proto (INVALID_ARGUMENT:Unexpected token.
admin: …Run Code Online (Sandbox Code Playgroud) TL;DR:我们如何配置 istio sidecar injection/istio-proxy/envoy-proxy/istio egressgateway 以允许长时间(> 3 小时)、可能空闲的 TCP 连接?
一些细节:
我们正在尝试执行到 PostgreSQL 的数据库迁移,该迁移由一个配置了 Spring Boot + Flyway 的应用程序触发,此迁移预计将持续约 3 小时。
我们的应用程序部署在我们的 kubernetes 集群中,该集群配置了 istio sidecar 注入。在运行迁移正好一小时后,连接总是关闭。
我们确定它是 istio-proxy 关闭连接,因为我们尝试从没有 istio sidecar 注入的 pod 迁移并且它运行了超过一个小时,但是这不是一个选项,因为这可能意味着生产中的一些停机时间我们不能考虑。
我们怀疑这应该可以在 istio 代理设置参数 idle_timeout 中进行配置 - 这是在这里实现的。但是这不起作用,或者我们没有正确配置它,我们试图在 istio 安装期间通过添加--set gateways.istio-ingressgateway.env.ISTIO_META_IDLE_TIMEOUT=5s到我们的 helm 模板来配置它。
我正在关注本教程,以便将 gRPC 服务转码为 HTTP。但是,它不是最新的,因为它使用 envoy API v2,但这不再可用(我收到一个错误说这个),他们现在使用 v3。因此,语法略有不同。
对于 v2,此代码段没有语法错误,但是,它引发了一个错误,指出 V2 不再可用(因此最终无法使用):
- name: envoy.http_connection_manager
config:
...
Run Code Online (Sandbox Code Playgroud)
根据这个例子,有一个 HTTP 连接管理器(它是 v3 兼容的)的方法是在envoy.yml配置文件中这样做(我们明确地告诉我们我们正在使用 v3):
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个Illegal map value错误指向"@type":
error initializing configuration '/etc/envoy/envoy.yaml': yaml-cpp: error at line 15, column 17: illegal map value
我也试过强制 envoy 使用 V2,带有 flag --bootstrap-version 2,但是一直说 v2 不再使用,所以现在使用 envoy 的唯一方法就是使用 v3。你遇到过同样的问题吗?我的目标只是将 rGPC 服务转码为 HTTP。
如果你需要更多的材料来解决问题,我把整个项目上传到了GitHub
envoyproxy ×10
kubernetes ×6
istio ×4
tcp ×2
cert-manager ×1
curl ×1
docker ×1
grpc ×1
haproxy ×1
http ×1
infinispan ×1
java ×1
jgroups ×1
lets-encrypt ×1
proxy ×1
ssl ×1
virtualhost ×1