首页 > 解决方案 > 如何对 Kubernetes Pod 进行动态代理?

问题描述

我想创建一个可以对 Kubernetes Pod 进行某种动态代理的服务。基本上我会有数百个 K8s Pod 运行相同的应用程序,这些应用程序映射到主机上的随机端口(如10456)。但是,每个 Pod 都是唯一的,我希望流量根据主机名定向到特定的 Pod。因此,当对 的请求进入时abc123.app.com,我将有一个代理层在数据库中进行查找以查找该域正在运行的主机和端口(如10.0.0.5:10456),然后将请求转发到那里。有支持这个的服务吗?我以前使用过很多 Nginx,但我不清楚它是否可以支持这种查找功能。

以前有人建过这样的东西吗?构建可以进行此类查找的代理层的最佳方法是什么?当 pod 从一台主机移动到另一台主机时,我将如何更新数据库?

提前致谢!

编辑:

我应该第一次把它放在那里,但是流向这些 pod 的流量类型是 RPC 流量和点对点流量

标签: dockerhttpnginxkubernetesproxy

解决方案


您描述的内容与 kubernetes入口定义对 http 流量所做的非常相似。

入口定义将入口控制器配置为指向服务的主机名请求。该服务通过标签选择器选择端点(pod)。当 pod 移动时,kubernetes 会自动更新服务。

您的工作只是通过其中一个API 客户端将配置更改从您的数据库推送到 kubernetes,而不是指导代理。如果您的环境非常动态,需要一直重新配置,或者您需要对流量的去向做出动态决策,您可能需要继续查看自定义代理或istioopenresty

听起来您已经有独特的部署到 kubernetes,因此除此之外还包括服务和入口定义。

一个简单的例子,包括一个 pod 上的标签,一个使用该标签的服务。然后是使用服务的入口定义。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: host-abc123
spec:
  containers:
  - name: host-abc123
    image: me/my-app:1.2.1
    ports:
    - containerPort: 10456
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: host-abc123
spec:
  rules:
  - host: abc123.bar.com
    http:
      paths:
      - backend:
          serviceName: host-abc123
          servicePort: 80
apiVersion: v1
kind: Service
metadata:
  name: host-abc123
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 10456

单个入口定义可以包括所有主机,但我不确定 kubernetes 和入口控制器将如何定期替换它。

也有基于nginx的入口控制器。您最终会得到server每个入口/主机定义的 nginx 配置。


推荐阅读