我有一个小型nodejs应用程序正在运行复制,在两个节点的集群上有两个pod。
然而,似乎连接并不粘。我需要它是粘性的,因为我使用websocket。
sessionAffinity在GCE上不能与LoadBalancer一起使用吗?如果我能提供更多信息,请告诉我。感谢
最后我有时间进行更多实验:
如果在创建服务后删除并再次创建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)从负载均衡器ip中多次卷曲 - > pod名称应保持不变
4)删除rc并再次创建
5)多次卷曲 - >广告连播名称更改
如果有助于复制,请告诉我。请随意直接使用docker repository fibheap / printhostname
答案 0 :(得分:0)
亲和力应该有效。你能回读一下你的服务对象,看看亲和力是否被接受并妥善保存了?
kubectl获取svc app-service
我刚刚创建了一个GCE负载均衡器,我确认GCE targetPool对象也有
sessionAffinity:CLIENT_IP
答案 1 :(得分:0)
如https://github.com/kubernetes/kubernetes/issues/36415中所述,GCE上的sessionAffinity可能仅在您使用"保留客户端IP",即"service.beta.kubernetes.io/external-traffic": "OnlyLocal"
并且设置{{{}时将服务设为LoadBalanceer时才有效。 1}}。
Ingress可能是一个更好的选择。我还没有对此进行验证,但是Nginx Ingress会绕过服务而且还有一个" sticky-ng"模块。