kubernetes - Kubernetes入口到在同一主机上运行的pod?
问题描述
我们刚刚开始使用 k8s(Ubuntu 20.04 上的裸机)。负载平衡服务的入口流量是否有可能到达主机上运行的 pod(如果可用)?
我们有一些应用程序使用客户端一致性哈希(使用客户 ID)来选择要调用的服务实例。服务实例是无状态的,但在内存中为每个客户维护 ML 模型。因此,将给定客户的重复请求转到相同的服务是有用的(但不是必需的)。然后我们可以使用 antiAffinity 让每个主机拥有一个 pod。
我们现有的服务发现机制让客户端可以找到服务的所有实例以及它们正在运行的节点。我们所有的 k8s 节点都在运行 Nginx 入口控制器。
解决方案
我终于弄明白了。这比 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 上运行的实例。
推荐阅读
- javascript - 在创建之前不适用于我的续集模型
- angular - 电子错误系统找不到指定的路径
- python - MariaDB:SELECT 命令被拒绝
- javascript - 如何读取文件并在其中搜索字符串
- kubernetes - 使用 kubeadm 创建 Kubernetes 集群时 kubeapi 服务器的负载均衡器
- google-cloud-platform - SSH 进入 GCP 计算引擎时不创建新用户
- django - 如何在 Django 模板中循环“添加”标签?
- java - SpringAmqp 拦截器中的处理程序方法名称
- ruby-on-rails - 仅获取具有特定角色的用户 - Rolify
- javascript - 如何用js打印json的所有元素