我有一个小型 nodejs 应用程序运行,在具有两个节点的集群上使用两个 pod 进行复制。
但是,似乎连接不粘。我需要它是粘性的,因为我使用 websocket。
sessionAffinity 不能在 GCE 上与 LoadBalancer 一起使用吗?让我知道我是否可以提供更多信息。谢谢
最后我有时间做更多的实验:
如果在创建服务后删除并再次创建 rc,则 sessionAffinity 似乎停止工作。
重现步骤:
- 1)使用以下文件:
服务器名称.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
服务器名称Sv.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 多次 curl -> pod 名称应该保持不变
4)删除rc并重新创建
5) 再次卷曲多次 -> pod 名称更改
请让我知道这是否有助于复制。请随意使用 docker repository fibheap/printhostname 直接