1

我有一个小型 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 直接

4

2 回答 2

0

亲和力应该起作用。你能读回你的服务对象并看到亲和力被接受并正确保存吗?

kubectl 获取 svc 应用服务

我刚刚创建了一个 GCE 负载均衡器,我确认 GCE targetPool 对象也有

sessionAffinity: CLIENT_IP

于 2015-08-07T22:23:53.347 回答
0

正如https://github.com/kubernetes/kubernetes/issues/36415中总结的那样,GCE 上的 sessionAffinity 可能仅在您将服务设置为具有“保留客户端 ip”的 LoadBalanceer 时才有效, "service.beta.kubernetes.io/external-traffic": "OnlyLocal"sessionAffinity=ClientIP.

Ingress 可能是一个更好的选择。我还没有验证这一点,但是 Nginx Ingress 会绕过服务并且有一个“sticky-ng”模块。

于 2017-03-25T14:32:02.660 回答