无法从 Mac 上的主机使用 NodePort 访问 minikube 服务
Can't access minikube service using NodePort from host on Mac
我正在尝试将单个 Web 应用程序部署到我 Mac 上的 Minikube,然后在浏览器中访问它。我正在尝试使用最简单的设置,但它不起作用,我只是收到“连接被拒绝”错误,我不明白为什么。
这就是我正在尝试的:
$ 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:~$
如您所见,Web 应用已启动 运行,我可以通过执行 minikube ssh
从集群内部访问它,但从集群外部无法访问它连接。这些是我的服务和部署清单:
网络测试-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
网络测试-deployment.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: {}
有人知道我做错了什么吗?或者我如何尝试进一步诊断问题?我允许尝试部署入口,但这也不起作用。
您可以使用 minikube service web-test
从 minikube 导出服务
https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-service
编辑:
如果您有部署,则可以使用以下 kubectl 命令导出该部署。
minikube kubectl -- expose deployment your-deployment --port 80 --type=LoadBalancer
当你使用 minikube ip
而 returns 127.0.0.1
时,你主要面对 this issue。如果您使用来自 kubectl get node -o wide
而不是 127.0.0.1
.
的内部 ip,它应该可以工作
官方参考 docs 中的一种更简单的方法是您可以使用 minikube service web-test --url
获取 url 并在浏览器中使用它,或者如果您使用 minikube service web-test
它将直接在浏览器中打开url。
您的部署 yaml 和其他一切看起来都不错,希望在部署到远程集群时不会有任何问题。
这似乎与启动 minikube 时使用的默认 docker 驱动程序有关。为避免这些问题,您可以强制使用特定的驱动程序(例如“virtualbox”)。为此,请按照以下步骤操作:
删除旧的 minikube:
minikube delete
使用 virtualbox
驱动启动 minikube:
minikube start --memory=4096 --driver=virtualbox
运行minikube ip
。您会看到类似 192.168.99.100
的输出。
然后,再次创建 Pods 和服务,它应该可以正常工作。
我在本期中找到了以下信息:https://github.com/kubernetes/minikube/issues/7344#issuecomment-703225254
与 minikube 相比,docker-desktop UI
for Mac and Windows
提供了一个更简单的替代方案,您可以简单地 activate the Kubernetes feature on your docker-desktop UI:
设置完成后,您可以右键单击 docker 桌面图标 > Kubernetes
现在验证您的 deployement/service 是否正常工作:
kubectl apply -f /file.yaml
答案是永远不要使用 Minikube。它不允许您使用 Nodeport 连接。无论如何,你总是会得到 minikube 的 ECONNREFUSED。只需使用 docker desktop
上下文,终止 minikube,然后 re-apply 您的服务。 Minikube 只是为了让学习 Kubernetes 的人更加困惑。
以防万一您还没有偶然发现访问一般适用于专有 minikube 结构的节点端口服务的更广泛概念:
$ k 获取服务-A
命名空间名称类型 CLUSTER-IP EXTERNAL-IP
默认 nginx 负载均衡器 10.43.228.207 172.22.0.240 80:30467/TCP 11h
$ kubectl port-forward --地址 0.0.0.0 service/nginx 8082:80
然后从我网络上的另一个主机,我做:curl [主机 [=29=] minikube]:8082
从 0.0.0.0:8082 转发 -> 80
处理 8082
的连接
然后您也可以从其他主机连接。
我正在尝试将单个 Web 应用程序部署到我 Mac 上的 Minikube,然后在浏览器中访问它。我正在尝试使用最简单的设置,但它不起作用,我只是收到“连接被拒绝”错误,我不明白为什么。
这就是我正在尝试的:
$ 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:~$
如您所见,Web 应用已启动 运行,我可以通过执行 minikube ssh
从集群内部访问它,但从集群外部无法访问它连接。这些是我的服务和部署清单:
网络测试-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
网络测试-deployment.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: {}
有人知道我做错了什么吗?或者我如何尝试进一步诊断问题?我允许尝试部署入口,但这也不起作用。
您可以使用 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
当你使用 minikube ip
而 returns 127.0.0.1
时,你主要面对 this issue。如果您使用来自 kubectl get node -o wide
而不是 127.0.0.1
.
官方参考 docs 中的一种更简单的方法是您可以使用 minikube service web-test --url
获取 url 并在浏览器中使用它,或者如果您使用 minikube service web-test
它将直接在浏览器中打开url。
您的部署 yaml 和其他一切看起来都不错,希望在部署到远程集群时不会有任何问题。
这似乎与启动 minikube 时使用的默认 docker 驱动程序有关。为避免这些问题,您可以强制使用特定的驱动程序(例如“virtualbox”)。为此,请按照以下步骤操作:
删除旧的 minikube:
minikube delete
使用 virtualbox
驱动启动 minikube:
minikube start --memory=4096 --driver=virtualbox
运行minikube ip
。您会看到类似 192.168.99.100
的输出。
然后,再次创建 Pods 和服务,它应该可以正常工作。
我在本期中找到了以下信息:https://github.com/kubernetes/minikube/issues/7344#issuecomment-703225254
docker-desktop UI
for Mac and Windows
提供了一个更简单的替代方案,您可以简单地 activate the Kubernetes feature on your docker-desktop UI:
设置完成后,您可以右键单击 docker 桌面图标 > Kubernetes
现在验证您的 deployement/service 是否正常工作:
kubectl apply -f /file.yaml
答案是永远不要使用 Minikube。它不允许您使用 Nodeport 连接。无论如何,你总是会得到 minikube 的 ECONNREFUSED。只需使用 docker desktop
上下文,终止 minikube,然后 re-apply 您的服务。 Minikube 只是为了让学习 Kubernetes 的人更加困惑。
以防万一您还没有偶然发现访问一般适用于专有 minikube 结构的节点端口服务的更广泛概念:
$ k 获取服务-A
命名空间名称类型 CLUSTER-IP EXTERNAL-IP
默认 nginx 负载均衡器 10.43.228.207 172.22.0.240 80:30467/TCP 11h
$ kubectl port-forward --地址 0.0.0.0 service/nginx 8082:80
然后从我网络上的另一个主机,我做:curl [主机 [=29=] minikube]:8082
从 0.0.0.0:8082 转发 -> 80 处理 8082
的连接然后您也可以从其他主机连接。