Kubernetes 入口相同路径多个端口

Kubernetes ingress same path multiple ports

经过多次谷歌搜索和搜索(甚至在这里),我无法找到我的问题的明确答案。所以我希望这里有人可以为我指明正确的方向。

我有一个已经为我工作的 Kube 服务定义,但现在我只是用 LoadBalancer 公开了它。这是我当前的服务 yaml:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: namespace1
  labels:
    app: my-service
spec:
  type: LoadBalancer
  selector:
    app: my-service
    tier: web
  ports:
  - name: proxy-port
    port: 8080
    targetPort: 8080
  - name: metrics-port
    port: 8082
    targetPort: 8082
  - name: admin-port
    port: 8092
    targetPort: 8092
  - name: grpc-port
    port: 50051
    targetPort: 50051

这显然只是 TCP 负载平衡。我想做的是使用 Mutual TLS 来保护它,这样服务器将只接受来自我的客户端的具有授权证书的连接。

据我所知,在 Kube 领域,我需要做的是 Ingress 定义。我一直在研究我可以在 kind:Ingress 上找到的所有文档,但我似乎找不到任何允许我创建一个 Ingress 多个端口的地方路径!

我是不是漏掉了什么?有没有办法创建一个与上述服务定义具有相同功能的 K8s Ingress

据我所知,您不能为由入口控制器(例如 NGINX HTTP(S) 代理)支持的 HTTPS LoadBalancer 使用自定义端口(例如 8080),因为 目前 Ingress 的端口对于 http 隐式为 :80,对于 https 隐式为 :443,正如 IngressRule 的官方 doc reference 所解释的那样。

我认为解决方法是为每个服务使用不同的主机,就像这个 Ingress 资源示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: proxy.foo.com
    http:
      paths:
      - backend:
          serviceName: proxy-svc
          servicePort: 8080
  - host: metrics.foo.com
    http:
      paths:
      - backend:
          serviceName: metrics-svc
          servicePort: 8082
  - host: admin.foo.com
    http:
      paths:
      - backend:
          serviceName: admin-svc
          servicePort: 8092
  - host: grpc.foo.com
    http:
      paths:
      - backend:
          serviceName: grpc-svc
          servicePort: 50051

我遇到了同样的情况,我们必须在同一台主机上公开端口 80,443 和 50051。在K3S上使用traefik v2+,我是这样解决的:

应用此文件修改traefik配置;这是K3S。如果你直接用图表安装了traefik,添加一个与下面配置相同的值文件。

apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
   ports:
      grpc:
        port: 50051
        protocol: TCP
        expose: true
        exposedPort: 50051

完成后,观察使用新配置更新 traefik 服务。 如果它不起作用,请确保您设置的端口是空闲的并且未被其他服务使用。

完成后,您可以创建 IngressRoute 对象。在这里我得到了一个用于 grpc (50051) 和一个用于网络 (80/443)。

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: db
spec:
  entryPoints:
    - web
    - websecure
  routes:
    - kind: Rule
      match: Host(`lc1.nebula.global`)
      services:
        - name: db
          port: 80
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: db-grpc
spec:
  entryPoints:
    - grpc
  routes:
    - kind: Rule
      match: Host(`lc1.nebula.global`)
      services:
        - name: db-grpc
          port: 50051