如何在入口中通过HTTP在多个端口上公开服务?

时间:2019-03-28 15:27:35

标签: nginx kubernetes kubernetes-ingress nginx-ingress

我在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

ingress-service.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

my-service.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

my-service-ingress.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

3 个答案:

答案 0 :(得分:2)

入口对象用于仅针对HTTP和HTTPS流量公开应用程序。

  

在Kubernetes v1.1中添加的Ingress公开了从集群外到集群内服务的HTTP和HTTPS路由。流量路由受Ingress资源上定义的规则控制。

what-is-ingress

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

如果要将应用程序公开在与80和443不同的端口上,则需要使用LoadBalancer类型的服务

答案 1 :(得分:1)

如果您需要在非标准端口(即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

答案 2 :(得分:0)

如果你修改了 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

添加以下代码段以在端口 7049 上也使用 HTTP:

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

并使用 kubectl apply -f deploy.yaml

重新部署 Nginx 入口控制器