Kubernetes反向代理Pod用于特定于节点的服务?

时间:2018-10-30 21:19:13

标签: kubernetes reverse-proxy

在Kubernetes集群中,我部署了每个节点的HTTP特定于节点的服务(使用DaemonSet)。该服务返回特定于节点的数据(否则将无法通过集群/远程API获得)。我无法使用Kubernetes服务,因为这将导致某种服务轮盘赌,因为客户端无法控制要连接(转发HTTP请求)的确切节点。由于服务需要返回特定于节点的数据,因此这将导致针对随机节点而不是客户端所需的节点返回数据。

我的怀疑是,我需要一个反向代理,该代理使用其自身URL路径的一部分将确定性的传入HTTP请求中继到客户端指示的确切节点。然后,客户端可以使用群集/远程API服务代理功能来访问此代理。

  • http://myservice/node1/..-> http://node1:myservice/...
  • http://myservice/node2/...-> http://node2:myservice/...
  • ...

是否有可用的现成的Pod(或Helm图表)可将在所有群集节点上运行的服务映射到单个代理URL,并且某些路径组件指定了要中继其服务实例的节点?有什么方法可以限制反向代理仅中继到定义我的每节点服务的pod规范的DaemonSet中指定的那些节点?

另外,是否有一些现成的“集线器页面”可用于反向代理列表/仅链接到我的服务当前正在运行的那些节点?

或者这是我需要专门创建自己的反向代理设置的地方吗?两者之间是否有整合? Nginx和Kubernetes?

1 个答案:

答案 0 :(得分:0)

如果使用DaemonSet,几乎是不可能的,因为您不能在DaemonSet中为Pod添加唯一的标签。如果您需要为每个节点分配一个Pod,则可以将podaffinity.StatefulSetDeployments.

一起使用

然后为每个节点创建一个服务:

kind: Service
apiVersion: v1
metadata:
  name: svc-for-node1
spec:
  selector:
    nodename: unique-label-for-pod-on-node
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

最终设置Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /svc-for-node1
        backend:
          serviceName: svc-for-node1
          servicePort: 80
      - path: /svc-for-node2
        backend:
          serviceName: svc-for-node2
          servicePort: 80