@ erotavlas as Mafor предоставил ответ, который поможет вам решить вашу проблему, примите его ответ.
Я публикую расширенный ответ, который может помочь кому-то еще.
Root причина этой проблемы была с selector/labels
.
В first-service
, spec.selector
было установлено на key: app1
, однако в развертывании spec.selector.matchLabels
было установлено на run: app1
.
Для правильной работы необходимо иметь одинаковые селекторы. Таким образом, вам потребуется изменить службу, указав c .selector на run: app1
или изменить развертывание spec.selector.matchLabels
на key: app1
. Та же ситуация с second-service
и second-deployment
. Более подробную информацию можно найти здесь .
Я пытался использовать Ingress на Minikube на основе официальных документов и ваших YAML.
Как дополнение , для использования Ingress
на Minikube
, Ingress addon
должно быть включено.
$ minikube addons list | grep ingress
- ingress: disabled
Если оно отключено, его необходимо включить.
$ minikube addons enable ingress
✅ ingress was successfully enabled
targetPort:
порт, который контейнер принимает в качестве traffi c on / port, где приложение запускается внутри модуля
port:
, является абстрактным портом Service
, который может быть любым портом, используемым другими модулями для доступа к Сервису.
OP использовал собственные образы, где приложение работало на портах 5050
и 5000
, для этого примера я буду использовать GCP hello world на порту 8080
. Метки / matchLabels были изменены, чтобы иметь значение sam в развертывании и обслуживании.
Первая служба
apiVersion: v1
kind: Service
metadata:
name: first-service
spec:
selector:
key: app1
ports:
- port: 81
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: first-deployment
spec:
replicas: 1
selector:
matchLabels:
key: app1
template:
metadata:
labels:
key: app1
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
service/first-service created
deployment.apps/first-deployment created
Вторая служба
apiVersion: v1
kind: Service
metadata:
name: second-service
spec:
selector:
key: app2
ports:
- port: 82
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: second-deployment
spec:
replicas: 1
selector:
matchLabels:
key: app2
template:
metadata:
labels:
key: app2
spec:
containers:
- name: hello2
image: gcr.io/google-samples/hello-app:2.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
service/second-service created
deployment.apps/second-deployment created
Он создал службы типа ClusterIP
. При необходимости вы можете использовать NodePort
, но это не обязательно.
Apply Ingress
Введенного запроса достаточно для тестирования.
Как уже упоминалось в официальных документах . Вы должны добавить ip minikube в файл хоста.
Примечание. Если вы используете Minikube локально, используйте minikube ip для получения внешнего IP-адреса. IP-адрес, отображаемый во входном списке, будет внутренним IP-адресом.
В ОС Ubuntu это /etc/hosts
(для редактирования необходимо использовать sudo). В Windows ОС проверьте эту статью
Для моего кластера (с использованием GCE):
$ minikube ip
10.132.15.208
Добавлено в hosts
значение файла:
10.132.15.208 demo.local
Ниже ответов.
$ curl demo.local/ocr
Hello, world!
Version: 1.0.0
Hostname: first-deployment-85b75bf4f9-qlzrp
$ curl demo.local/ner
Hello, world!
Version: 2.0.0
Hostname: second-deployment-5b5bbb7f4-9sbqr
Однако версия с rewrite
, предоставленная Mafor, более универсальна.
Кроме того, вы также можете рассмотреть возможность использования LoadBalancer
на Minikube
. Более подробную информацию можно найти в Minikube docs .