sessionAffinity是否与GCE上的LoadBalancer无关

时间:2015-08-05 16:09:14

标签: kubernetes google-kubernetes-engine

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

然而,似乎连接并不粘。我需要它是粘性的,因为我使用websocket。

sessionAffinity在GCE上不能与LoadBalancer一起使用吗?如果我能提供更多信息,请告诉我。感谢

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

如果在创建服务后删除并再次创建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)从负载均衡器ip中多次卷曲 - > pod名称应保持不变

  • 4)删除rc并再次创建

  • 5)多次卷曲 - >广告连播名称更改

如果有助于复制,请告诉我。请随意直接使用docker repository fibheap / printhostname

2 个答案:

答案 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"模块。