Как использовать nginx ingress для маршрутизации трафика на основе порта

#kubernetes-ingress #minikube

#kubernetes-вход #minikube

Вопрос:

В настоящее время я работаю над развертыванием ELK stack в кластере kubernetes, я успешно смог использовать службу ClusterIP и nginx-ingress в minikube для маршрутизации входящего 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
  

Скручивание minikube ip на порту 80 по умолчанию возвращает допустимый ответ

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

Примечание: я бы не хотел использовать NodePort, но хотел бы знать, является ли nodeport единственным способом достижения вышеуказанного?

Комментарии:

1. Вы можете попробовать использовать несколько путей . Через некоторое время я подготовлю ответ с описанием.

Ответ №1:

Поскольку у вас уже есть мини-куб и minikube ingress addon включен:

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

Просто как напоминание:

targetPort : является ли порт, на который контейнер принимает трафик (порт, на котором приложение запускается внутри модуля).

port : является абстрагированным Service port , который может быть любым портом, используемым другими модулями для доступа к 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 Вход

Пожалуйста, имейте в виду, что скоро 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 конфигурация, вы также можете использовать перезапись. Также вы можете использовать default backend для перенаправления на определенную службу.

Более подробную информацию о доступе к Minikube вы можете найти в документации Minikube.

Это то, что вы искали, или что-то другое?