Не удается получить доступ к службе minikube с помощью NodePort с хоста на Mac

#docker #kubernetes #minikube

#докер #кубернетес #мини-куб #docker #kubernetes #minikube

Вопрос:

Я пытаюсь развернуть одно веб-приложение в Minikube на моем Mac, а затем получить к нему доступ в браузере. Я пытаюсь использовать простейшие настройки, но это не работает, я просто получаю сообщение об ошибке «отказано в подключении» и не могу понять, почему.

Это то, что я пытаюсь:

 $ minikube start --insecure-registry=docker.example.com:5000
😄  minikube v1.12.3 on Darwin 10.14.6
  Using the docker driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🔄  Restarting existing docker container for "minikube" ...
🐳  Preparing Kubernetes v1.18.3 on Docker 19.03.8 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"

$ eval $(minikube -p minikube docker-env)

$ docker build -t web-test .
Sending build context to Docker daemon  16.66MB
Step 1/3 : FROM docker.example.com/library/openjdk:11-jdk-slim
11-jdk-slim: Pulling from library/openjdk
bf5952930446: Pull complete 
092c9b8e633f: Pull complete 
0b793152b850: Pull complete 
7900923f09cb: Pull complete 
Digest: sha256:b5d8f95b23481a9d9d7e73c108368de74abb9833c3fae80e6bdfa750663d1b97
Status: Downloaded newer image for docker.example.com/library/openjdk:11-jdk-slim
 ---> de8b1b4806af
Step 2/3 : COPY target/web-test-0.0.1-SNAPSHOT.jar app.jar
 ---> 6838e3db240a
Step 3/3 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
 ---> Running in 550bf762bf2d
Removing intermediate container 550bf762bf2d
 ---> ce1468d1ff10
Successfully built ce1468d1ff10
Successfully tagged web-test:latest

$ kubectl apply -f web-test-service.yaml 
service/web-test unchanged

$ kubectl apply -f web-test-deployment.yaml 
deployment.apps/web-test configured

$ kubectl get po -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
web-test-6bb45ffc54-8mxbc   1/1     Running   0          16m   172.18.0.2   minikube   <none>           <none>

$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          16m
web-test     NodePort    10.102.19.201   <none>        8080:31317/TCP   16m

$ minikube ip
127.0.0.1

$ curl http://127.0.0.1:31317
curl: (7) Failed to connect to 127.0.0.1 port 31317: Connection refused


$ kubectl logs web-test-6bb45ffc54-8mxbc

  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _    
( ( )___ | '_ | '_| | '_ / _` |    
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |___, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.3.RELEASE)

2020-08-26 14:45:32.692  INFO 1 --- [           main] com.example.web.WebTestApplication           : Starting WebTestApplication v0.0.1-SNAPSHOT on web-test-6bb45ffc54-8mxbc with PID 1 (/app.jar started by root in /)
2020-08-26 14:45:32.695  INFO 1 --- [           main] com.example.web.WebTestApplication           : No active profile set, falling back to default profiles: default
2020-08-26 14:45:34.041  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer      : Tomcat initialized with port(s): 8080 (http)
2020-08-26 14:45:34.053  INFO 1 --- [           main] o.apache.catalina.core.StandardService       : Starting service [Tomcat]
2020-08-26 14:45:34.053  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine      : Starting Servlet engine: [Apache Tomcat/9.0.37]
2020-08-26 14:45:34.135  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]           : Initializing Spring embedded WebApplicationContext
2020-08-26 14:45:34.135  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext     : Root WebApplicationContext: initialization completed in 1355 ms
2020-08-26 14:45:34.587  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor      : Initializing ExecutorService 'applicationTaskExecutor'
2020-08-26 14:45:34.797  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer      : Tomcat started on port(s): 8080 (http) with context path ''
2020-08-26 14:45:34.810  INFO 1 --- [           main] com.example.web.WebTestApplication           : Started WebTestApplication in 2.808 seconds (JVM running for 3.426)


$ minikube ssh
docker@minikube:~$ curl 10.102.19.201:8080
Up and Running
docker@minikube:~$
  

Как вы можете видеть, веб-приложение запущено, и я могу получить к нему доступ изнутри кластера, выполнив minikube ssh , но извне кластера оно не подключается. Это мои манифесты службы и развертывания:

web-test-service.yaml:

 apiVersion: v1
kind: Service
metadata:
  labels:
    app: web-test
  name: web-test
spec:
  type: NodePort
  ports:
  - nodePort: 31317
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-test
  

веб-тест-развертывание.yaml:

 apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web-test
  name: web-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-test
  strategy: {}
  template:
    metadata:
      labels:
        app: web-test
    spec:
      containers:
      - image: web-test
        imagePullPolicy: Never
        name: web-test
        ports:
        - containerPort: 8080
      restartPolicy: Always
status: {}
  

У кого-нибудь есть идеи, что я делаю не так? Или, возможно, как я мог бы попытаться диагностировать проблему дальше? Я разрешил попытку развертывания ingress, но это тоже не работает.

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

1. Можете ли вы попробовать minikube service web-test

2. Спасибо, Аргхья, похоже, это работает, спасибо. Тем не менее, я обеспокоен тем, почему стандартный подход не работает, и есть ли проблема, которая помешает мне выполнить развертывание в удаленном кластере, например, k3s.

3. В моем случае это то, что curl блокируется при доступе к адресу, выданному minikube service web-test --url , и вместо этого работает доступ к URL в браузере.

4. У меня такая же проблема в Windows 10 pro с docker desktop и minikube, для входа я использую команду в MINGW64 $ eval $(minikube -p minikube docker-env)

Ответ №1:

В основном вы сталкиваетесь с этой проблемой при использовании minikube ip который возвращает 127.0.0.1 . Это должно сработать, если вы используете внутренний ip от kubectl get node -o wide вместо 127.0.0.1 .

Гораздо более простой подход из официальных справочных документов заключается в том, что вы можете получить URL-адрес с помощью minikube service web-test --url и использовать его в браузере, или, если вы используете minikube service web-test , он откроет URL-адрес напрямую в браузере.

Ваши yamls развертывания и все остальное выглядят хорошо, и, надеюсь, не должно возникнуть никаких проблем при развертывании в удаленном кластере.

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

1. Понял, minikube ip возвращает неправильный IP-адрес. Круто, это действительно полезно, спасибо, Аргья.

2. хм, у меня такая же проблема, но для меня minikube возвращает 192.168.49.2, который не работает. служба minikube запускает сервер и открывает веб-браузер с 127.0.0.1: 53545 , который действительно работает, за исключением того, что 53545 не является указанным мной портом. Я не понимаю, как это работает 🙂

3. @kodlan да, я получаю тот же IP, что и вы (192.168.49.2) (он же. адрес маршрутизатора), который не работает. однако 127.0.0.1 работает отлично. возможно, существует какая-то политика на уровне маршрутизатора, которая требует, чтобы вы объявляли входящие порты для безопасности?

4. У меня сработало открытие его непосредственно в браузере. Печать одного URL-адреса не привела к каким-либо необходимым внутренним подключениям.

Ответ №2:

Похоже, это связано с драйвером docker по умолчанию, используемым при запуске minikube. Чтобы избежать этих проблем, вы можете принудительно установить определенный драйвер (например, «virtualbox»). Для этого выполните следующие шаги:

Удалите старый minikube с помощью:

 minikube delete
  

Запустите minikube с virtualbox драйвером:

 minikube start --memory=4096 --driver=virtualbox
  

Выполнить minikube ip . Вы увидите вывод, подобный 192.168.99.100 .
Затем снова создайте модули и службу, и она должна работать должным образом.
Я нашел эту информацию в этом выпуске:https://github.com/kubernetes/minikube/issues/7344#issuecomment-703225254

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

1. Это решение работает на компьютерах Mac на базе Intel, я использовал его на своем последнем Macbook. Однако с новым чипом M1 virtualbox не поддерживается. Знаете ли вы какие-либо альтернативы этому решению для нового M1 Mac? Единственный реальный вариант, который я вижу, — это использование parallels, поскольку vmware также не поддерживается, но я его еще не пробовал.

Ответ №3:

Вы можете экспортировать службу из minikube с помощью minikube service web-test

https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-service

Редактировать:

Если у вас есть развертывание, вы можете экспортировать это развертывание с помощью следующей команды kubectl.

minikube kubectl -- expose deployment your-deployment --port 80 --type=LoadBalancer

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

1. Хорошо, значит, я использовал неправильный подход?

2. Это не так, но вам не нужен порт узла в Minikube. Вы можете представить свое развертывание как службу, а затем создать route с помощью службы minikube service-name

3. Хорошо, я понимаю, поэтому, читая ваши комментарии и комментарии от Arghya, кажется, что мой подход не будет работать с Minikube и что мне нужно использовать этот идиоматический способ предоставления услуг через Minikube.

Ответ №4:

На всякий случай, если вы еще не наткнулись на более широкую концепцию доступа к службе nodeport, которая применяется в целом по сравнению с проприетарными конструкциями minikube:

$ k получить службу -ТИП ИМЕНИ ПРОСТРАНСТВА ИМЕН CLUSTER-IP EXTERNAL-IP
по умолчанию nginx LoadBalancer 10.43.228.207 172.22.0.240 80:30467 / TCP 11h

$ kubectl переадресация порта —служба адреса 0.0.0.0/ nginx 8082:80

Затем с другого хоста в моей сети я делаю: curl [хост, на котором запущен minikube]: 8082

Перенаправление с 0.0.0.0: 8082 -> 80 Обработка соединения для 8082

Затем вы также можете подключиться с другого хоста.

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

1. Поскольку на silicon Mac нет поддержки virtualbox или драйвера hyperkit, это лучший обходной путь. Используя это, я, наконец, могу получить доступ к службам внутри локального кластера minikube. Спасибо!

Ответ №5:

docker-desktop UI for Mac and Windows предоставляет более простую альтернативу по сравнению с minikube, которую вы можете просто активировать с помощью функции Kubernetes в пользовательском интерфейсе docker-desktop:

включить -kubernetes

после настройки вы можете щелкнуть правой кнопкой мыши значок на рабочем столе docker > Kubernetes докер-рабочий стол

Чтобы убедиться, что ваше развертывание / служба работает должным образом:

 kubectl apply -f /file.yaml
  

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

1. Хорошо, тогда что? Как подключиться к службе Nodeport, какой URL-адрес?

2. Я использую localhost

Ответ №6:

Мы должны помнить об одной контрольной точке для портов.

Целевой порт: 80

Принадлежит порту, который мы предоставили в нашем (Dockerfile или Docker-compose file). Если порт не соответствует, вы не сможете получить к нему доступ.

Ответ №7:

Ответ — никогда не используйте Minikube. Это не позволяет вам использовать подключения к Nodeport. Вы всегда будете получать отказ от использования minikube, несмотря ни на что. Просто используйте docker desktop контекст, отключите minikube, а затем повторно примените свои службы. Minikube существует только для того, чтобы еще больше запутать людей, которые изучают Kubernetes.

измените контекст здесь, чтобы использовать docker desktop