繁体   English   中英

sessionAffinity是否无法在GCE上与LoadBalancer一起使用

[英]Is sessionAffinity not working with LoadBalancer on GCE

我有一个运行在两个节点集群上的两个Pod复制的小型nodejs应用程序。

但是,似乎连接不是粘性的。 我需要保持粘性,因为我使用的是websocket。

sessionAffinity是否不能在GCE上与LoadBalancer一起使用? 让我知道是否可以提供更多信息。 谢谢


最后,我有时间进行更多实验:

如果创建服务后删除rc并再次创建rc,则sessionAffinity似乎停止工作。

重现步骤:

  • 1)使用以下文件:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM