[英]Is sessionAffinity not working with LoadBalancer on GCE
我有一个运行在两个节点集群上的两个Pod复制的小型nodejs应用程序。
但是,似乎连接不是粘性的。 我需要保持粘性,因为我使用的是websocket。
sessionAffinity是否不能在GCE上与LoadBalancer一起使用? 让我知道是否可以提供更多信息。 谢谢
最后,我有时间进行更多实验:
如果创建服务后删除rc并再次创建rc,则sessionAffinity似乎停止工作。
重现步骤:
ServerName.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: servername
labels:
name: servername
spec:
replicas: 10
selector:
name: servername
template:
metadata:
labels:
name: servername
spec:
containers:
- name: app
image: fibheap/printhostname
imagePullPolicy: "Always"
ports:
- containerPort: 80
ServerNameSv.yaml
apiVersion: v1
kind: Service
metadata:
name: servername
labels:
name: servername
spec:
ports:
# the port that this service should serve on
- port: 80
targetPort: 80
selector:
name: servername
type: LoadBalancer
sessionAffinity: ClientIP
Dockerfile
FROM google/nodejs
WORKDIR /app
ADD ./main.js /app/main.js
EXPOSE 80
CMD ["node", "--harmony", "./main.js"]
main.js
// Load the http module to create an http server.
var http = require('http');
var os = require('os');
// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (req, res) {
res.writeHead(200, {"Content-Type": "text/plain"});
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
res.end("CIP:" + ip + " Remote Server:" + os.hostname());
});
// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(80);
// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:80/");
2)创建rc和服务(描述服务以获取IP并确保已设置ClientIP)
3)从loadbalancer ip卷曲多次-> pod名称应保持不变
4)删除rc并再次创建
5)多次卷曲->荚名称更改
请让我知道这是否有助于复制。 请随时直接使用docker仓库fibheap / printhostname
亲和力应该起作用。 您可以读回您的服务对象并看到亲缘关系已被正确接受并保存吗?
kubectl获取svc应用程序服务
我刚刚创建了一个GCE负载平衡器,并确认GCE targetPool对象也具有
sessionAffinity:CLIENT_IP
如https://github.com/kubernetes/kubernetes/issues/36415中的结论,仅当您将服务设为具有“保留客户端ip”的LoadBalanceer(即"service.beta.kubernetes.io/external-traffic": "OnlyLocal"
”)时,GCE上的sessionAffinity才可能起作用"service.beta.kubernetes.io/external-traffic": "OnlyLocal"
,然后设置sessionAffinity=ClientIP
。
Ingress可能是更好的选择。 我还没有验证这一点,但是Nginx Ingress会绕过服务,并且有一个“ sticky-ng”模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.