【问题标题】:Do services send traffic to local pods first?服务是否首先将流量发送到本地 pod?
【发布时间】:2020-07-31 11:40:09
【问题描述】:

我有一个带有指向它的服务的 DaemonSet。 当一个 pod 访问 my service 的 ClusterIP 时,它会获取本地 pod 运行在同一个节点还是服务中的任何 pod?

有什么方法可以实现吗?我的理解是,它与externaltrafficpolicy: local 相同,但用于内部流量。

【问题讨论】:

    标签: kubernetes kubernetes-service kubernetes-networking


    【解决方案1】:

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

    您需要使用: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 将在 hostPort: 55555 上暴露容器端口 80 - 如果这些 Pod 有 DaemonSet - 那么你可以确定它们将在每个节点上运行并且每个请求都将在收到它的节点。

    但是,请小心使用它并阅读以下内容:Configuration Best Practices

    【讨论】:

    • 谢谢。我会接受这个答案,因为它似乎是唯一的解决方案。不幸的是,我正在运行 1.15
    • 也许如果您描述您要解决的问题,社区可以为您提供一些见解。
    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 2020-11-18
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多