服务是否首先将流量发送到本地Pod?

时间:2020-07-31 11:40:09

标签: kubernetes kubernetes-service kubernetes-networking

我有一个DaemonSet,其中有一个指向它的服务。 当Pod访问我的服务的ClusterIP时,它将使本地Pod运行在同一节点或服务中的任何Pod上吗?

有什么办法可以做到这一点?我的理解是,与内部流量相比,它与externaltrafficpolicy: local是同一件事。

1 个答案:

答案 0 :(得分:0)

默认情况下,发送到ClusterIP或NodePort服务的流量可以路由到该服务的任何后端地址。从Kubernetes 1.7开始,可以将“外部”流量路由到在接收流量的节点上运行的Pod,但是ClusterIP Services不支持此功能,并且更复杂的拓扑(如分区路由)是不可能的。服务拓扑功能通过允许服务创建者基于原始节点和目标节点的节点标签定义用于路由流量的策略来解决此问题。

您需要使用:Service topology

首选本地Pod的示例服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  topologyKeys:
    - "kubernetes.io/hostname"
    - "*"

UPD 1:

还有另一种方法可以确保发送到某个特定节点的端口的请求将在同一节点上处理-hostPort

一个例子:

kind: Pod
apiVersion: v1
metadata:
  name: test-api
  labels:
    app: test-api
spec:
  containers:
  - name: testapicontainer
    image: myprivaterepo/testapi:latest
    ports:
    - name: web
      hostPort: 55555
      containerPort: 80      
      protocol: TCP

上面的Pod将在80上暴露容器端口hostPort: 55555-如果这些Pod具有DaemonSet-那么可以确定的是,它们将在每个节点上运行,并且每个请求都将在收到请求的节点上进行处理。

但是,请谨慎使用并阅读:Configuration Best Practices