#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
с помощью службы minikubeservice-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:
после настройки вы можете щелкнуть правой кнопкой мыши значок на рабочем столе 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.