kubernetes - 单个服务中的多个部署

标签 kubernetes amazon-eks

我的后端有 5 个不同的部署,每个部署都在特定端口处理请求。

前端服务使用必要的详细信息联系后端服务。后端服务应该能够决定所需的 pod(来自 5 个部署之一)来满足请求。

不是创建 5 个不同的服务,是否可以将单个服务链接到多个部署?

Kubernetes 版本:1.12 使用的云:Amazon EKS

PS:我的要求和https://github.com/kubernetes/kubernetes/issues/24875不一样 类似的问题没有答案:"Wire" multiple Deployments to one Service in Kubernetes

最佳答案

您的问题的确切答案是:今天不可能。 正如您在 issue 中正确看到的那样在question (都面临同样的情况)这可能是 future 的实现。

一个可能的解决方案/解决方法是将问题委托(delegate)给上层,但这基本上取决于情况,并且总是需要不同的服务。

假设您的部署是 5 个不同的应用程序,它们做不同的事情(否则为什么是 5 个不同的部署而不是 1 个具有 n 副本?)并假设它们是 http 应用程序,您可以使用 ingress resource将流量路由到正确的部署/服务(假设每个部署一项服务)。

如果您的 5 个部署是一起创建/更新/管理的(例如:都在同一个 helm 部署中),您可以创建一个扇出入口:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: service1
          servicePort: 4200
      - path: /bar
        backend:
          serviceName: service2
          servicePort: 8080
      - path: /aaaa
        backend:
          serviceName: service3
          servicePort: 4200
      - path: /bbbbb
        backend:
          serviceName: service4
          servicePort: 8080
      - path: /ccc
        backend:
          serviceName: service5
          servicePort: 8080

或者,如果您的 5 个部署是分开的,您可以使用相同的想法创建 5 个不同的入口服务:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-for-app-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: service1
          servicePort: 4200

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-for-app-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /bar
        backend:
          serviceName: service2
          servicePort: 8080

等等....

创建 5 个入口或 1 个扇出应该产生相同的结果。

此方法适用于 nginx ingress controller但只注意两件事

  • path match: with the nginx controller version > 0.22 nginx.ingress.kubernetes.io/rewrite-target:/为精确匹配。例如,如果您想从 /foo 重定向到 / 保留 /foo 之后的所有 uri (/foo/something ?parameter=parameter_value/something?parameter=parameter_value)你的入口重写规则应该是这样的:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-for-app-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo/(.*)
        backend:
          serviceName: service1
          servicePort: 4200
  • 冲突路由:避免路由冲突,例如 path:/foo/(.*) 和 path: /foo/bar/(.*) 其中请求/foo/bar/something 将匹配这两个路径。该行为可能难以预测,如果它按预期工作,它也不会稳定

关于kubernetes - 单个服务中的多个部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57324932/

相关文章:

docker - fio:对于数据集, block 大小太大

spring-boot - 如何在 Helm 中将 liquibase 作为预安装 Hook 运行?

kubernetes - Spring Boot、Horizo​​ntal Pod Autoscaler 和 readinessProbe

amazon-web-services - eks 错误 : certificate-authority-data and certificate-authority are both specified for kubernetes

aws-lambda - 如何在 CloudFormation 中设置集群创建者以在 lambda 中重用它?

kubernetes - 通过 REST 调用启动 Argo 工作流

kubernetes - 创建部署时将 pod-template-hash 添加到副本集名称的确切原因是什么?

amazon-web-services - AWS EKS Fargate Ingress 没有地址

amazon-emr - 如何在 EKS 上为 EMR 进行日志记录(即 emr 容器)

kubernetes - 使用 Kubernetes 时是否需要管理节点级操作系统更新?