【问题标题】:How can I expose a service on multiple ports over HTTP in ingress?如何在入口中通过 HTTP 在多个端口上公开服务?
【发布时间】:2019-08-19 10:43:30
【问题描述】:

我在 Kubernetes 中有一项服务,我必须通过 HTTP 在多个端口上公开该服务。 我使用 Nginx-Ingress 并且能够成功地通过端口 80 公开我的服务。(http://serviceA.example.com --> service-a:80)

但是我不能为 Http 使用不同的端口,然后是端口 80。 如何让 nginx-ingress 也监听 7049 端口。

我已经尝试在 nginx 服务上公开端口 7049,并将注解 nginx.org/listen-ports: "80,7049" 添加到 nginx 控制器。都不适合我。

我希望得到以下输出:

http://serviceA.example.com --> service-a:80

http://serviceA.example.com:7049 --> service-a:7049

入口服务.yml

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    protocol: TCP
    name: https
  selector:
    app: nginx-ingress

我的服务.yml

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: my-service
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    protocol: TCP
    name: https
  - port: 7049
    targetPort: 7049
    name: symbols
  selector:
    app: my-service

我的服务入口.yml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-service
spec:
  rules:
  - host: myservice.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: my-service
          servicePort: 80

【问题讨论】:

  • 你能分享你用于 serviceA 及其入口的 yaml 文件吗?也不要更改入口控制器中的内容。这很可能仅与您的入口有关。

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

Ingress 对象用于为 HTTP 和 HTTPS 流量公开应用程序。

在 Kubernetes v1.1 中添加的 Ingress 将来自集群外部的 HTTP 和 HTTPS 路由公开给集群内的服务。流量路由由 Ingress 资源上定义的规则控制。

what-is-ingress

您可以使用不同类型的路由,例如基于路径或基于主机名的路由,但 nginx 的端口号将是 80 或 443。

如果您想在 80 和 443 以外的端口上公开您的应用程序,则需要使用 LoadBalancer 类型服务

【讨论】:

  • 同意,标准 Ingress 仅适用于标准 HTTP 端口(80 和 443)。如果需要自定义端口,可以查看 Voyager 实现:appscode.com/products/voyager/8.0.1/guides/ingress/http/…
  • @RafałLeszko 感谢您的评论,很高兴知道我们可以暴露在不同的端口上,但我们仍然需要使用 HTTP 协议。对于非http,我们需要使用不同的解决方案。如果我错了,请纠正我
【解决方案2】:

如果您需要在非标准端口(即 80/443 以外)上公开入口,您可以为此使用 NodePort 类型的服务。默认情况下,NodePort 类型的服务会在节点上打开一个随机端口,范围为 30000 - 32767,服务可访问该端口。在这种情况下,您需要覆盖两件事:

1) 要覆盖默认节点端口范围,请在启动 apiserver 时使用以下标志:--service-node-port-range=7000-9000

2) 要在 NodePort 服务中强制分配具体端口,请在您的 .yaml 文件中使用以下服务部署

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: ingress-nginx
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  ports:
  - name: http
    nodePort: 7049
    protocol: TCP
    port: 80
  selector:
    k8s-app: ingress-nginx
  type: NodePort

【讨论】:

    【解决方案3】:

    如果您修改 Nginx 入口控制器的服务声明,这是可能的。在 Nginx deploy.yaml 你会发现:

    # Source: ingress-nginx/templates/controller-service.yaml
    apiVersion: v1
    kind: Service
    ...
    spec:
      type: LoadBalancer
      ports:
        - name: http
          port: 80
          protocol: TCP
          targetPort: http
        - name: https
          port: 443
          protocol: TCP
          targetPort: https
    

    添加以下 sn-p 以在端口 7049 上使用 HTTP:

        - name: http-symbols
          port: 7049
          protocol: TCP
          targetPort: http
    

    并使用 kubectl apply -f deploy.yaml 重新部署 Nginx 入口控制器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-12
      • 2020-05-05
      • 2020-01-23
      • 2023-03-29
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多