Zvi*_*ika 5 tcp http kubernetes istio envoyproxy
我已经在 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:
name: redis-db
spec:
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:3.2-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
Run Code Online (Sandbox Code Playgroud)
谢谢
进入 Envoy(istio 代理):
\n\nkubectl exec -it my-pod -c proxy bash\nRun Code Online (Sandbox Code Playgroud)\n\n查看 Envoy 配置:
\n\ncat /etc/envoy/envoy-rev2.json\nRun Code Online (Sandbox Code Playgroud)\n\n您将看到它生成一个 TCP 代理过滤器,仅处理 TCP 流量。雷迪斯示例:
\n\n"address": "tcp://10.35.251.188:6379",\n "filters": [\n {\n "type": "read",\n "name": "tcp_proxy",\n "config": {\n "stat_prefix": "tcp",\n "route_config": {\n "routes": [\n {\n "cluster": "out.cd7acf6fcf8d36f0f3bbf6d5cccfdb5da1d1820c",\n "destination_ip_list": [\n "10.35.251.188/32"\n ]\n }\n ]\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n在您的情况下,添加http到 Redis 服务port name(Kubernetes 部署文件)中,会生成http_connection_manager不处理行 TCP 的过滤器。
请参阅istio 文档:
\n\n\n\n\nIstio 服务的正常运行需要 Kubernetes 服务。服务端口必须命名,并且这些名称必须以 http 或 grpc 前缀开头,以利用 Istio\xe2\x80\x99s L7 路由功能,例如 name: http-foo 或 name: http 都可以。具有非命名端口或没有 http 或 grpc 前缀的端口的服务将作为 L4 流量进行路由。
\n
底线,只需删除port nameRedis 服务即可解决问题:)
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |