Как мне открыть доступ к моей локальной машине? (миникуб на windows) - PullRequest
0 голосов
/ 31 января 2020

У меня есть два развертывания

развертывание 1

apiVersion: v1
kind: Service
metadata:
  name: first-service
spec:
  selector:
    key: app1
  ports:
    - port: 81
      targetPort: 5050

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: first-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: app1
  template:
    metadata:
      labels:
        run: app1
    spec:
      containers:
      - name: ocr
        image: ocr_app
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5050

развертывание 2

apiVersion: v1
kind: Service
metadata:
  name: second-service
spec:
  selector:
    key: app2
  ports:
    - port: 82
      targetPort: 5000

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: second-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: app2
  template:
    metadata:
      labels:
        run: app2
    spec:
      containers:
      - name: ner
        image: ner_app
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5000

После включения входа на миникуб я применил ingess

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: demo.local
    http:
      paths:
      - path: /ocr
        backend:
          serviceName: first-service
          servicePort: 81
      - path: /ner
        backend:
          serviceName: second-service
          servicePort: 82

В моем файле hosts у меня есть

192.168.177.71  demo.local

Где 192.168.177.71 - мой текущий ip мини-куба

Затем я выполнил эту команду

kubectl port-forward nginx-ingress-controller-6fc5bcc8c9-p6mvj 3000:80 --namespace kube-system

И в консоли это выходные данные

Forwarding from 127.0.0.1:3000 -> 80
Forwarding from [::1]:3000 -> 80

Но когда я делаю запрос к demo.local:3000/ocr с помощью почтальона, нет ответа

Не удалось получить ответ Произошла ошибка при подключении к demo.local : 3000.

РЕДАКТИРОВАТЬ: использование minikube service first-service дает этот вывод

PS D:\docker> minikube service first-service
|-----------|---------------|-------------|--------------|
| NAMESPACE |     NAME      | TARGET PORT |     URL      |
|-----------|---------------|-------------|--------------|
| default   | first-service |             | No node port |
|-----------|---------------|-------------|--------------|
* service default/first-service has no node port

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

@ 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 .

1 голос
/ 31 января 2020

Во-первых, вам не нужно kubectl port-forward. Вход на ваш ip миникуба, порт 80.

Во-вторых, возможно, вам нужны некоторые правила перезаписи в конфигурации входа. По умолчанию входящие запросы пересылаются «как есть», то есть demo.local:3000/ocr пересылается на first-service:81/ocr. Возможно, это не то, что вам нужно, если только первая служба не развернута в /ocr контексте.

Полагаю, вам нужно что-то вроде этого:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: demo.local
    http:
      paths:
      - path: /ocr(/|$)(.*)
        backend:
          serviceName: first-service
          servicePort: 81
      - path: /ner(/|$)(.*)
        backend:
          serviceName: second-service
          servicePort: 82

См. https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rewrite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...