单一服务中的多个部署

时间:2019-08-02 10:44:22

标签: kubernetes amazon-eks eks

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

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

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

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

PS:我的要求与https://github.com/kubernetes/kubernetes/issues/24875不同 未回答类似问题:"Wire" multiple Deployments to one Service in Kubernetes

1 个答案:

答案 0 :(得分:2)

您的要求的确切答案是:今天不可能。 正如您在issuequestion(都面临相同的情况)中正确看到的那样,这可能是将来的实现。

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

假设您的部署是5个不同的应用程序,它们执行不同的操作(否则为什么5个不同的部署而不是n副本有1个?)并假定它们是http应用程序,则可以使用ingress resource来执行以下操作:将流量流向正确的部署/服务(假设每个部署提供一项服务)。

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

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上效果很好,但只注意两件事

  • 路径匹配:nginx控制器版本> 0.22 nginx.ingress.kubernetes.io/rewrite-target: /是完全匹配。例如,如果您想从/foo重定向到/,并保留/foo/foo/something?parameter=parameter_value/something?parameter=parameter_value)之后的所有uri,则您的入口重写规则应为像这样:
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/(.*)和路径:/foo/bar/(.*),其中对/foo/bar/something的请求将匹配两条路径。该行为可能难以预测,并且,如果按预期方式运行,则可能会不稳定