如何使用nginx ingress基于端口路由流量

问题描述 投票:0回答:1

我目前正在 kubernetes 集群上部署 ELK 堆栈,我成功地能够在 minikube 上使用 ClusterIP 服务和 nginx-ingress 将入站 http 流量路由到 kibana(5601 端口),需要输入有关如何根据以下内容路由流量的信息入站端口而不是路径?

使用下面的 Ingress 对象声明,我成功连接到我的 kibana 部署,但如何访问不同端口(9200、5044、9600)上公开的其他工具堆栈?

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: ingress-service
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: kibana-service
          servicePort: 5601

CUrl'ing

minikube ip
在默认 80 端口上返回有效响应

# curl http://<minikube-ip>/api/status
{"name":"kibana",....}

注意:我不想使用 NodePort,但想知道 NodePort 是否是我们实现上述目标的唯一方法?

kubernetes-ingress minikube
1个回答
1
投票

由于您已经启用了 minikube

minikube ingress addon

$ minikube addons list | grep ingress
| ingress                     | minikube | enabled ✅   |
| ingress-dns                 | minikube | enabled ✅   |

正如提醒:

targetPort
:是容器接受流量的端口(应用程序在 Pod 内运行的端口)。

port
:是抽象的
Service port
,可以是其他 pod 用于访问
Service
的任何端口。

请记住,如果您的容器不是

targetPort
中指定的侦听端口,您将无法连接到 Pod。 另请记住防火墙配置以允许流量。

例如我使用过这个yamls:

apiVersion: v1
kind: Service
metadata:
  name: service-one
spec:
  selector:
    key: application-1
  ports:
    - port: 81
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  replicas: 1
  selector:
    matchLabels:
      key: application-1
  template:
    metadata:
      labels:
        key: application-1
    spec:
      containers:
      - name: hello1
        image: gcr.io/google-samples/hello-app:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: service-two
spec:
  selector:
    key: application-2
  ports:
    - port: 82
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  replicas: 1
  selector:
    matchLabels:
      key: application-2
  template:
    metadata:
      labels:
        key: application-2
    spec:
      containers:
      - name: hello2
        image: gcr.io/google-samples/hello-app:2.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
      - path: /hello
        backend:
          serviceName: service-one
          servicePort: 81
      - path: /hello2
        backend:
          serviceName: service-two
          servicePort: 82

service/service-one created
deployment.apps/deployment-1 created
service/service-two created
deployment.apps/deployment-2 created
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/ingress created

警告:networking.k8s.io/v1beta1 Ingress 在 v1.19+ 中已弃用,在 v1.22+ 中不可用;使用networking.k8s.io/v1 Ingress

请记住,Minikube 很快就会根据上面的警告进行更改

apiVersion

此配置的输出如下:

$ curl http://172.17.0.3/hello
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-2l4cp
minikube-ubuntu18:~$ curl http://172.17.0.3/hello2
Hello, world!
Version: 2.0.0
Hostname: deployment-2-fb984955c-5dvbx

您可以使用:

      paths:
      - path: /elasticsearch
        backend:
          serviceName: elasticsearch-service
          servicePort: 100
      - path: /anotherservice
        backend:
          serviceName: another-service
          servicePort: 101

服务看起来像:

  name: elasticsearch-service
  ...
  ports:
    - port: 100
      targetPort: 9200
  ---
  name: another-service
  ...
  ports:
    - port: 101
      targetPort: 5044

但是,如果您需要更高级的

path
配置,您也可以使用rewrite。您也可以使用
default backend
重定向到特定服务。

有关访问 Minikube 的更多信息,您可以在 Minikube 文档中找到。

这是您想要的还是不同的东西?

© www.soinside.com 2019 - 2024. All rights reserved.