我已经将envoy容器部署为k8s上的Istio部署的一部分 . 每个Envoy代理容器都安装为k8s pod中app容器旁边的“sidecar” .
我'm able to initiate HTTP traffic from within the application, but when trying to contact Redis server (another container with another envoy proxy), I' m无法连接并接收来自envoy的 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
谢谢
1 回答
进入特使(istio代理):
看特使配置:
您将看到它生成一个TCP代理筛选器,它只处理TCP流量 . Redis示例:
在您的情况下,将
http
添加到Redis服务port name
(Kubernetes部署文件)中,生成http_connection_manager
过滤器,该过滤器不处理行TCP .见istio docs:
底线,只需删除
port name
表格Redis服务,它应该解决问题:)