Как я могу получить доступ к nginx ingress на моем локальном компьютере?

Я не могу подключиться к моему приложению, работающему с nginx ingress (Docker Desktop win 10).

Модуль контроллера nginx-ingress запущен, приложение исправно, и я создал входящий трафик. Однако, когда я пытаюсь подключиться к своему приложению на локальном хосте, я получаю сообщение «В соединении отказано».

В журнале вижу эту ошибку:

[14:13:13.028][VpnKit            ][Info   ] vpnkit.exe: Connected Ethernet interface f6:16:36:bc:f9:c6

[14:13:13.028][VpnKit            ][Info   ] vpnkit.exe: UDP interface connected on 10.96.181.150

[14:13:22.320][GoBackendProcess  ][Info   ] Adding vpnkit-k8s-controller tcp forward from 0.0.0.0:80 to 10.96.47.183:80
[14:13:22.323][ApiProxy          ][Error  ] time="2019-12-09T14:13:22-05:00" msg="Port 443 for service ingress-nginx is already opened by another service"

Я думаю, что порт 443 используется другим приложением, возможно, zscaler security или Skype. Выдержка из netstat -a -b:

 [svchost.exe]
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       16012
 [com.docker.backend.exe]
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       8220

Не знаю, как заставить работать вход. Пожалуйста помоги!

Мой вход:

$ kubectl describe ing kbvalues-deployment-dev-ingress
Name:             kbvalues-deployment-dev-ingress
Namespace:        default
Address:          localhost
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host       Path  Backends
  ----       ----  --------
  localhost
             /   kbvalues-deployment-dev-frontend:28000 (10.1.0.174:8080)
Annotations:
  kubernetes.io/ingress.class:                     nginx
  nginx.ingress.kubernetes.io/cors-allow-headers:  X-Forwarded-For, X-app123-XPTO
Events:
  Type    Reason  Age               From                      Message
  ----    ------  ----              ----                      -------
  Normal  CREATE  42m               nginx-ingress-controller  Ingress default/kbvalues-deployment-dev-ingress
  Normal  UPDATE  6s (x5 over 42m)  nginx-ingress-controller  Ingress default/kbvalues-deployment-dev-ingress

Моя служба:

$ kubectl describe svc kbvalues-deployment-dev-frontend
Name:              kbvalues-deployment-dev-frontend
Namespace:         default
Labels:            chart=tomcat-sidecar-war-1.0.4
                   environment=dev
                   name=kbvalues-frontend-dev
                   release=kbvalues-test
                   tier=frontend
Annotations:       <none>
Selector:          app=kbvalues-dev
Type:              ClusterIP
IP:                10.98.89.94
Port:              <unset>  28000/TCP
TargetPort:        8080/TCP
Endpoints:         10.1.0.174:8080
Session Affinity:  None
Events:            <none>

Я пытаюсь получить доступ к приложению по адресу: http://localhost:28000/health. Я подтвердил, что URL-адрес /health доступен локально в контейнере веб-сервера.

Я ценю любую помощь, которую вы можете предложить.

Изменить:

Я попытался изменить службу ingress-nginx для удаления HTTPS, как предлагается здесь: https://stackoverflow.com/a/56303330/166850 < / а>

Это избавило от ошибки 443 в журналах, но не исправило мою настройку (по-прежнему отказывалось соединение).

Изменить 2: вот определение Ingress YAML (kubectl get -o yaml):

$ kubectl get ing -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    creationTimestamp: "2019-12-09T18:47:33Z"
    generation: 5
    name: kbvalues-deployment-dev-ingress
    namespace: default
    resourceVersion: "20414"
    selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/kbvalues-deployment-dev-ingress
    uid: 5c34bf7f-1ab4-11ea-80e4-00155d169409
  spec:
    rules:
    - host: localhost
      http:
        paths:
        - backend:
            serviceName: kbvalues-deployment-dev-frontend
            servicePort: 28000
          path: /
  status:
    loadBalancer:
      ingress:
      - hostname: localhost
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

Изменить 3: Вывод kubectl get svc -A (только входящая линия):

ingress-nginx   ingress-nginx                      LoadBalancer   10.96.47.183     localhost     80:30470/TCP             21h

Изменить 4: Я попытался получить IP-адрес виртуальной машины из Windows HyperV, но кажется, что у виртуальной машины нет IP-адреса?

PS C:\> (Get-VMNetworkAdapter -VMName DockerDesktopVM)

Name            IsManagementOs VMName          SwitchName MacAddress   Status IPAddresses
----            -------------- ------          ---------- ----------   ------ -----------
Network Adapter False          DockerDesktopVM DockerNAT  00155D169409 {Ok}   {}

Изменить 5:

Вывод netstat -a -n -o -b для порта 80:

  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4
 Can not obtain ownership information

person RMorrisey    schedule 09.12.2019    source источник
comment
Можете ли вы получить доступ к сервису без Ingress? Вроде прямое попадание в сервисный IP и порт работает?   -  person Shubham    schedule 09.12.2019
comment
Вы должны попробовать сделать kubectl exec -it <your nginx pod> /bin/bash, запустить команду curl, предложенную Шубхэмом, и проверить свои результаты.   -  person randominstanceOfLivingThing    schedule 09.12.2019
comment
Каков результат kubectl get svc -A (только вставка входной строки)? Я подозреваю, что ваш входящий сервис настроен неправильно. Для облачных сред я бы ожидал, что Тип будет LoadBalancer, однако для вашего случая, я думаю, вам может потребоваться настроить его для использования NodePort, где вы будете получать доступ к своему входу через порт (например, localhost: 30252 / myapp).   -  person leeman24    schedule 09.12.2019
comment
@Shubham @randominstanceOfLivingThing Мне удалось получить доступ к службе, используя: kubectl port-forward svc/kbvalues-deployment-dev-frontend 28000 и нажав: http://localhost:28000/health   -  person RMorrisey    schedule 10.12.2019
comment
@RMorrisey, если ваш комментарий решил вашу проблему, ответьте на свой пост и примите его для использования в будущем.   -  person Dawid Kruk    schedule 10.12.2019
comment
@DawidKruk Извините за недоразумение - моя проблема все еще не решена. Приведенная выше команда - это только обходной путь; он не исправляет входящие функции, как описано в OP.   -  person RMorrisey    schedule 10.12.2019
comment
Отвечает ли это на ваш вопрос? Включить контроллер Ingress на Docker Desktop с WLS2   -  person Michael Freidgeim    schedule 06.03.2021


Ответы (4)


Мне удалось создать ресурс Ingress в Kubernetes на Docker в Windows.

Действия по воспроизведению:

  • Включить Hyper-V
  • Установите Docker для Windows и включите Kubernetes
  • Подключить kubectl
  • Включить Ingress
  • Создать развертывание
  • Создать сервис
  • Создать входящий ресурс
  • Добавить хост в файл локальных хостов
  • Тестовое задание

Включите Hyper-V < / а>

Из Powershell с правами администратора выполните следующую команду:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

Система может попросить вас перезагрузить компьютер.

Установите Docker для Windows и включите Kubernetes

Установите приложение Docker со всеми параметрами по умолчанию и включите Kubernetes

Подключить kubectl

Установите kubectl.

Включить Ingress

Выполните эти команды:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

Изменить: убедитесь, что никакая другая служба не использует порт 80.

Перезагрузите вашу машину. В командной строке cmd, запущенной от имени администратора, выполните: net stop http Остановите перечисленные службы, используя services.msc

Используйте: netstat -a -n -o -b и проверьте, не прослушивают ли другие процессы порт 80.

Создать развертывание

Ниже показано простое развертывание с модулями, которые будут отвечать на запросы:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      version: 2.0.0
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        version: 2.0.0
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"

Примените его, выполнив команду:

$ kubectl apply -f file_name.yaml

Создать сервис

Чтобы поды могли общаться с ними, вам необходимо создать службу.

Пример ниже:

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    app: hello
    version: 2.0.0
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 50001

Примените это определение службы, выполнив команду:

$ kubectl apply -f file_name.yaml

Создать ресурс Ingress

Ниже представлен простой ресурс Ingress, использующий созданный выше сервис:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-ingress 
spec:
  rules:
  - host: kubernetes.docker.internal
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-service 
          servicePort: http

Взгляни на:

spec:
  rules:
  - host: hello-test.internal 

hello-test.internal будет использоваться как hostname для подключения к вашим модулям.

Примените свой ресурс Ingress, вызвав команду:

$ kubectl apply -f file_name.yaml

Добавить хост в файл локальных хостов

Я нашел эту ссылку Github, которая позволит вам подключиться к вашему ресурсу Ingress с помощью hostname .

Для этого добавьте строку 127.0.0.1 hello-test.internal в ваш C:\Windows\System32\drivers\etc\hosts файл и сохраните ее. Для этого вам потребуются права администратора.

Изменить: новейшая версия Docker Desktop для Windows уже добавляет запись в файле hosts: 127.0.0.1 kubernetes.docker.internal

Тестовое задание

Отобразите информацию о ресурсах Ingress, вызвав команду: kubectl get ingress

Он должен показать:

NAME            HOSTS                 ADDRESS     PORTS   AGE
hello-ingress   hello-test.internal   localhost   80      6m2s

Теперь вы можете получить доступ к своему ресурсу Ingress, открыв веб-браузер и набрав

http://kubernetes.docker.internal/

Браузер должен вывести:

Hello, world!
Version: 2.0.0
Hostname: hello-84d554cbdf-2lr76

Hostname: hello-84d554cbdf-2lr76 - это имя пода, который ответил.

Если это решение не работает, проверьте соединения с помощью команды: netstat -a -n -o (с правами администратора), если что-то не использует порт 80.

person Dawid Kruk    schedule 10.12.2019
comment
Спасибо за подробный отзыв! Я попробую выполнить эти действия завтра утром и доложу - person RMorrisey; 11.12.2019
comment
Извините! Я привык обойти это с помощью прокси kubectl и забыл! Сейчас попробую. - person RMorrisey; 18.12.2019
comment
Выполнение описанных выше шагов сломало мой контекст kubectl. Теперь он говорит: `` kubectl get ing Невозможно подключиться к серверу: набрать tcp: lookup kubernetes.docker.internal: нет такого хоста '' - person RMorrisey; 18.12.2019
comment
Позвольте мне найти, где установлен kubernetes.docker.internal - person RMorrisey; 18.12.2019
comment
Я изменил настройки кластера в своем конфигурационном файле .kube, но теперь получаю: Unable to connect to the server: x509: certificate is valid for docker-for-desktop, kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local, kubernetes.docker.internal, vm.docker.internal, localhost, not hello-test.internal - person RMorrisey; 18.12.2019
comment
Попытка поменять все, от hello-test.internal до kubernetes.docker.internal - person RMorrisey; 18.12.2019
comment
Я попробовал следующие изменения: -Изменена конфигурация кластера обратно на прежнюю -Изменены хосты, чтобы сказать: 127.0.0.1 kubernetes.docker.internal -Изменено правило входа на: - хост: kubernetes.docker.internal - person RMorrisey; 18.12.2019
comment
Теперь я снова могу использовать kubectl, но я получил страницу с ошибкой 404 от веб-сервера: http://kubernetes.docker.internal/ - person RMorrisey; 18.12.2019
comment
kubectl get ing показывает: hello-ingress kubernetes.docker.internal localhost 80 5 мин. 14 сек. - person RMorrisey; 18.12.2019
comment
Я уменьшил развертывание до одного модуля для отладки, повторил свой тестовый запрос и проверил журналы. Нет записи о моем HTTP-запросе: 2019/12/18 19:36:17 Сервер прослушивает порт 50001 - person RMorrisey; 18.12.2019
comment
Чтобы было ясно, все вышеперечисленные шаги работали до шага файла hosts - это то, что сломало мой kubectl - person RMorrisey; 18.12.2019
comment
В файле hosts была запись: 127.0.0.1 kubernetes.docker.internal Я изменил эту запись на hello-test.internal, и это сломало ее. - person RMorrisey; 18.12.2019
comment
Я пробовал несколько разных вариантов (с обеими записями: 127.0.0.1 kubernetes.docker.internal 127.0.0.1 hello-test.internal) (оба элемента в одной строке: 127.0.0.1 kubernetes.docker.internal hello-test.internal ). В обоих этих конфигурациях kubectl работал, но я все равно получил 404. - person RMorrisey; 18.12.2019
comment
Netstat -a -n -o -b сообщает, что невозможно получить информацию о владельце порта 80 - person RMorrisey; 18.12.2019
comment
Страница 404 имеет следующий ярлык: openresty / 1.15.8.2. - person RMorrisey; 18.12.2019
comment
Перезагрузил мой компьютер и остановил несколько служб с помощью net stop http. Служба HTTP не остановится, но я дошел до того, что получаю отказ в соединении при доступе к localhost: 80. Запустил рабочий стол docker и запустил локальный кластер kubernetes. Теперь я вернулся на страницу 404 (от openresty). - person RMorrisey; 18.12.2019
comment
У меня все заработало! Огромное спасибо! Решение было: - person RMorrisey; 19.12.2019
comment
1) Перезагрузите мой компьютер и остановите все службы, используя HTTP (используйте net stop http, чтобы узнать, какие из них) - person RMorrisey; 19.12.2019
comment
2) Запустите рабочий стол докера и кубернетес - person RMorrisey; 19.12.2019
comment
3) Измените файл hosts и вход, чтобы использовать kubernetes.docker.internal - person RMorrisey; 19.12.2019
comment
4) Исправьте приведенный выше пример службы и входа, чтобы они отображались на порт 80 (входящий - ›servicePort: http) (служба -› порты: - имя: протокол http: TCP-порт: 80 targetPort: 50001) - person RMorrisey; 19.12.2019
comment
Я столкнулся с аналогичной проблемой при развертывании контроллера ingress-nginx с использованием ручных шагов, упомянутых для узла bareMetal по адресу (kubernetes.github.io/ingress-nginx/deploy), однако столкнулся с проблемой, однако ссылался на ссылку (github.com/docker/for-win/issues/1901), упомянутый RMorrisey, который упомянул об установке ingress-nginx с использованием шагов, упомянутых для Mac, и он работал без внесения каких-либо изменений в файл хоста и т. д. - person Mayur; 18.09.2020
comment
Спасибо, я потратил часы, чтобы выяснить, в чем проблема, все, что мне нужно было сделать, это использовать kubernetes.docker.internal URL, который вы написали в последнем разделе. Это должно быть в документации на этой странице kubernetes.github.io/ingress-nginx/deploy но там нет раздела Docker Desktop для Windows :( - person zsolt; 30.11.2020
comment
Небольшое обновление моего предыдущего комментария. Я переустановил все, что связано с k8s, чтобы пошагово записать, что нужно сделать для запуска моих модулей. Итак, чтобы использовать URL-адрес kubernetes.docker.internal в Docker Desktop для WINDOWS, вам также необходимо установить этот контроллер входящего трафика: kubernetes.github.io/ingress-nginx/deploy/#docker- for-mac Да, вам это нужно, версия Docker для Mac, сегодня она отлично работает в Windows, Docker Desktop 2.5.0.1 (49550) - person zsolt; 01.12.2020
comment
Я использую win 10 home там, где нет Hyper v. Так что я должен делать ? - person yogihosting; 19.02.2021
comment
@yogihosting У меня нет доступа к компьютеру с Windows 10 Home, но я считаю, что вы можете использовать Docker Desktop с wsl2 бэкэндом. Также вы можете поискать другие решения, например minikube с драйвером virtualbox. Настройка доступа к входящему трафику на вашем компьютере localhost будет немного отличаться, но это также будет возможно. - person Dawid Kruk; 19.02.2021

В Windows кластер Kubernetes работает на виртуальной машине. Попытайтесь получить доступ к входящему трафику с IP-адреса этой виртуальной машины вместо localhost.

person Dávid Molnár    schedule 10.12.2019
comment
Спасибо за ответ. Как я могу узнать IP-адрес виртуальной машины? - person RMorrisey; 10.12.2019
comment
С minikube я мог бы использовать minikube ip, но Docker Desktop, похоже, работает по-другому ... не знаю, как его получить. - person RMorrisey; 10.12.2019
comment
Я не мог понять, как получить IP от HyperV. Похоже, виртуальной машине не назначен IP? - person RMorrisey; 10.12.2019
comment
Подожди. Я пытаюсь настроить Kubernetes с Docker в Windows 10, тогда я копаю глубже. - person Dávid Molnár; 10.12.2019
comment
К сожалению, мне не удалось его настроить. Пробовал на двух машинах. Те же ошибки. Можете ли вы попробовать перечислить kubectl get nodes и kubectl describe node и опубликовать результат? - person Dávid Molnár; 10.12.2019
comment
Может лучше было бы использовать minikube. - person Dávid Molnár; 10.12.2019
comment
Minikube проблематичен в моей среде, потому что он не использует встроенную сеть Windows. У него проблемы с zscaler и нашим VPN. - person RMorrisey; 11.12.2019

Я столкнулся с аналогичной проблемой при развертывании контроллера ingress-nginx с использованием ручных шагов, упомянутых для узла bareMetal на ingress -nginx-deploy, однако, столкнулся с проблемой, однако ссылка на ссылку Github ссылка, упомянутая @RMorrisey, которая ведет к другим потокам, где они упомянули об установке ingress-nginx, используя шаги, упомянутые для Mac, и она работала без внесения изменений в файл хоста и т. д.

person Mayur    schedule 18.09.2020

Проблема в том, что у вашей службы есть тип ClusterIP, который недоступен извне. Он должен быть типа NodePort, что и делается в инструкциях Давида Крука.

person Patrick Farry    schedule 29.12.2020