我们想根据Websocket连接的数量动态扩展我们的AKS集群。
我们在AKS上使用应用网关V2和应用网关入口控制器作为入口。
我配置了HorizontalPodAutoscaler来根据消耗的内存扩展部署。
当我将示例应用程序部署到AKS时,我可以连接到websocket端点并进行通信。但是,当任何扩展操作发生时(添加或删除pod),我看到所有客户端的连接丢失。- 添加pod时如何保持现有连接?
- 我如何才能优雅地排水连接时,pods被删除,使现有的客户端不受影响?
我尝试在应用网关上激活基于cookie的关联,但这对问题没有影响。
下面是我用于测试的部署。它基于此示例并修改了a,因此它允许指定连接数并定期向服务器发送ping消息。
apiVersion: apps/v1
kind: Deployment
metadata:
name: wssample
spec:
replicas: 1
selector:
matchLabels:
app: wssample
template:
metadata:
labels:
app: wssample
spec:
containers:
- name: wssamplecontainer
image: marxx/websocketssample:10
resources:
requests:
memory: "100Mi"
cpu: "50m"
limits:
memory: "150Mi"
cpu: "100m"
ports:
- containerPort: 80
name: wssample
---
apiVersion: v1
kind: Service
metadata:
name: wssample-service
spec:
ports:
- port: 80
selector:
app: wssample
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: websocket-ingress
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/cookie-based-affinity: "true"
appgw.ingress.kubernetes.io/connection-draining: "true"
appgw.ingress.kubernetes.io/connection-draining-timeout: "60"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wssample-service
port:
number: 80
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: websocket-scaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: wssample
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 50
更新:
- 我在一个2节点集群上运行,激活了自动缩放器以扩展到4个节点。
- 节点上仍有大量可用内存
- 起初我认为这是浏览器和javascript的问题,但我得到了相同的结果,当我通过一个基于。net核心控制台应用程序连接到端点时(Websockets在规模操作后进入"中止"状态) 更新2:
我发现了一个模式。在没有HPA的情况下也会出现这个问题,可以使用以下步骤重现:
- 将部署扩展到3个副本
- 连接20个客户机
- 使用kubectl Scale命令手动缩放部署到6个副本
- (现有连接仍然正常,客户端与后端通信)
- 连接另外20个客户端
- 几秒钟后,所有现有的连接被重置 更新3:
- AKS集群正在使用kubenet网络
- 与Azure CNI网络相同的问题,尽管
我有一个非常不愉快的发现。这个GitHub问题的结果基本上说,行为是由设计和AGW重置所有的websocket连接时,任何后端池规则的变化(这发生在规模操作)。
在这种情况下,投票支持一个功能来保持这些连接是可能的。