【问题标题】:k8s: Is it possible to have two identical deployments but route different traffic to them?k8s:是否可以有两个相同的部署但将不同的流量路由到它们?
【发布时间】:2022-01-20 08:32:15
【问题描述】:

这是我的用例:

我有一个微服务,它通过入口网关实时和批处理发送流量。我想做的是能够在概念上定义一个 deployment 并让它创建两组 pod:

  • 一组实时请求
  • 另一个用于批处理。

部署新版本的微服务时,更新 k8s 部署,实时和批量使用新版本。

这在 k8s 中是否可行,还是我需要创建两个部署并分别管理它们?

【问题讨论】:

  • 您可以将多个容器添加到一个 pod。
  • 如果 pod 都是相同的,部署如何知道哪些请求指向哪些 pod?大概这些 pod 需要不同的设置或连接字符串?
  • Pod 是相同的。我要防止的是过多的批处理请求妨碍了实时请求。
  • 无论如何,它似乎不可能如你所愿 - 在一个部署下运行一些 Pod 集。部署是一种更高的抽象,它管理一个或多个副本集以提供新版本的受控推出。 “PodTemplate 是创建 Pod 的规范,包含在 Deployment、Jobs 和 DaemonSets 等工作负载资源中。工作负载资源的每个控制器都使用工作负载对象内部的 PodTemplate 来制作实际的 Pod。PodTemplate 是所需状态的一部分您用于运行应用程序的任何工作负载资源。”只需一个 PodTemplate 即可部署。
  • 这听起来像是 Istio 可以提供的帮助。如果服务定义为 VirtualService,您可以根据标头值(或其他条件)路由到不同的 DestinationRule 对象。

标签: kubernetes kubernetes-deployment


【解决方案1】:

这是为提高可见性而发布的社区 wiki 答案。随意扩展它。

由于我们不了解所用架构的完整信息,未来可以参考cmets的以下建议来解决问题。

1.使用部署、服务、选择器

您可以拥有两个相同的部署并将不同的流量路由到它们。 可以通过Services实现:

在 Kubernetes 中,Service 是一种抽象,它定义了一个逻辑集 Pod 的数量和访问它们的策略(有时这种模式 称为微服务)。 Service 所针对的 Pod 集是 通常由selector 确定。

这种方法有一些优点。

  • 默认情况下,如果您使用iptables proxy mode,流量将以随机方式路由到端点。当您尝试将流量发送到同一部署所涵盖的特定 Pod 时,CPU and Memory usage 可能会发生很大差异,从而导致资源耗尽或浪费资源。
  • 将更容易管理服务版本控制、CPU 和内存分配和部署。

2。使用 Istio

来自David M. Karr

如果服务定义为VirtualService,您可以路由到 不同的 DestinationRule 对象取决于标头值(或其他 资格)。

另外

如果需要部署新版本的微服务,可以选择不同的strategies,更适合你的需求。 Kubernetes deployment strategies:

  • 重新创建:终止旧版本并发布新版本
  • ramped:以滚动更新的方式发布新版本,一个接一个
  • 蓝/绿:与旧版本一起发布新版本,然后切换流量
  • 金丝雀:向部分用户发布新版本,然后继续全面推出
  • a/b 测试:以精确的方式(HTTP 标头、cookie、权重等)向部分用户发布新版本。 A/B 测试是 确实是一种基于统计数据做出商业决策的技术 但我们将简要描述该过程。这不是从 与 Kubernetes 一起使用,这意味着需要额外的工作来设置更高级的 基础设施(IstioLinkerdTraefik、自定义 nginx/haproxy 等)。

【讨论】:

  • 你好@Mat。这是answer你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多