首页 > 解决方案 > Kubernetes入口到在同一主机上运行的pod?

问题描述

我们刚刚开始使用 k8s(Ubuntu 20.04 上的裸机)。负载平衡服务的入口流量是否有可能到达主机上运行的 pod(如果可用)?

我们有一些应用程序使用客户端一致性哈希(使用客户 ID)来选择要调用的服务实例。服务实例是无状态的,但在内存中为每个客户维护 ML 模型。因此,将给定客户的重复请求转到相同的服务是有用的(但不是必需的)。然后我们可以使用 antiAffinity 让每个主机拥有一个 pod。

我们现有的服务发现机制让客户端可以找到服务的所有实例以及它们正在运行的节点。我们所有的 k8s 节点都在运行 Nginx 入口控制器。

标签: kuberneteskubernetes-ingress

解决方案


我终于弄明白了。这比 IMO 更难!更新:它不起作用。流量经常流向错误的 pod。

服务需求externalTrafficPolicy: Local(参见文档)。

apiVersion: v1
kind: Service
metadata:
  name: starterservice
spec:
  type: LoadBalancer
  selector:
    app: starterservice
  ports:
    - port: 8168
  externalTrafficPolicy: Local

Ingress 需要nginx.ingress.kubernetes.io/service-upstream: "true"服务上游文档)。

nginx.ingress.kubernetes.io/server-alias: "~^starterservice-[a-z0-9]+\\.example\\.com"一点是因为我们的服务发现更新了 DNS,因此每个服务实例都在其 DNS 名称中包含了它正在运行的主机的名称。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: starterservice
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/server-alias: "~^starterservice-[a-z0-9]+\\.example\\.com"
    nginx.ingress.kubernetes.io/service-upstream: "true"
spec:
  rules:
    - host:  starterservice.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: starterservice
                port:
                  number: 8168

所以现在调用https://starterservice-foo.example.com将转到在 k8s 主机 foo 上运行的实例。


推荐阅读