单一服务中的多个部署

Raj*_*oth 2 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

Fed*_*one 6

你的追求的确切答案是:今天这是不可能的。正如您在问题和问题正确看到的那样(两者都面临相同的情况),这可能是未来的实现。

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

假设您的部署是 5 个执行不同操作的不同应用程序(否则为什么是 5 个不同的部署而不是 1 个具有n副本的部署?)并假设它们是 http 应用程序,您可以使用入口资源将流量引导到正确的部署/服务(假设每个部署一项服务)。

如果您的 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

Run Code Online (Sandbox Code Playgroud)

或者,如果您的 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

Run Code Online (Sandbox Code Playgroud)
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

Run Code Online (Sandbox Code Playgroud)

等等....

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

这种方法适用于nginx 入口控制器,但只注意两件事

  • 路径匹配:与 nginx 控制器版本 > 0.22nginx.ingress.kubernetes.io/rewrite-target: /完全匹配。例如,如果您想从重定向/foo到保留( to )/之后的所有 uri,您的入口重写规则应如下所示:/foo/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
Run Code Online (Sandbox Code Playgroud)
  • 冲突路由:避免路由冲突,例如path: /foo/(.*)和路径:/foo/bar/(.*)其中的请求/foo/bar/something将匹配两个路径。这种行为可能很难预测,如果它按预期工作,它也不会稳定