我已遵循此处提到的所有步骤 - https://kubernetes.github.io/ingress-nginx/user-guide/exusing-tcp-udp-services/
<external-port>: <namespace/k8s-svc:port>
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
9000: "default/sample-go-app:8080"
Load balancer service
部分下的external-port
的ports
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: proxied-tcp-9000
port: 9000
targetPort: 9000
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
args:
- /nginx-ingress-controller
- --tcp-services-configmap=ingress-nginx/tcp-services
现在,一切都按预期进行。 即客户端可以将 tcp 流量发送到 [LoadBalancer-IP:External-Port],并且 tcp 流量被路由到 [default/sample-go-app:8080] svc/pod,现在如果我在示例中查找活动的 TCP 连接使用
netstat
的 go-app pod,它显示大约 4 个活动连接(我认为这可能会因客户端而异)
但问题是,当没有来自客户端的连接(没有客户端发起任何连接)时,我仍然可以看到从 [NGINX Ingress Controller Pod] 到 [目标 pod] 之间大约有 3 个处于
ESTABLISHED
状态的 tcp 连接 - 即示例-go-app pod]
sample-go-app$ netstat | grep tcp
tcp 0 0 sample-app-pod-ip:8080 ingress-controller-pod-ip:port ESTABLISHED
tcp 0 0 sample-app-pod-ip:8080 ingress-controller-pod-ip:port ESTABLISHED
tcp 0 0 sample-app-pod-ip:8080 ingress-controller-pod-ip:port ESTABLISHED
有什么建议为什么我们从 NGINX 控制器到上游服务器(即 example-go-app pod)有这些活动连接并每隔几秒刷新一次(只有入口控制器 pod 的端口号发生变化)?有没有办法删除这些未使用的连接?
NGINX 处理 TCP 连接以实现负载平衡和连接重用的方式可能是您所观察到的行为的原因,即使在没有客户端请求的情况下,NGINX Ingress 控制器和目标 Pod 之间也存在活动连接。
需要注意的是,NGINX 包含一个 keepalive 指令,它指定连接池中应保持多少个连接处于打开状态。因此,即使没有客户端请求传入,您也可能会看到某些连接保持打开状态。有关更多信息,请参阅 this。
您还可以将 NGINX 入口控制器配置为更短的保持活动超时,以更快地关闭空闲连接。简而言之,**您可以通过为 TCP 连接设置较低的 keep_alive 超时来修改 NGINX 配置。**有关此 keepalive 连接的更多信息,请参阅 Timo Stark 的博客。