【问题标题】:Can't access minikube service using NodePort from host on Mac无法从 Mac 上的主机使用 NodePort 访问 minikube 服务
【发布时间】:2020-12-15 09:58:56
【问题描述】:

我正在尝试在我的 Mac 上将单个 Web 应用程序部署到 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 从集群内部访问它,但从集群外部,它不会连接。这些是我的服务和部署清单:

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

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
  • 谢谢 Arghya - 这似乎工作谢谢。但是,我担心为什么标准方法不起作用,以及是否存在阻止我部署到远程集群的问题,例如k3s.
  • 在我的情况下,是curl在访问minikube service web-test --url输出的地址时被阻止,而是访问浏览器中的url。

标签: docker kubernetes minikube


【解决方案1】:

当您使用返回127.0.0.1minikube ip 时,您主要面对this issue。如果您使用来自kubectl get node -o wide 而不是127.0.0.1 的内部IP,它应该可以工作。

官方参考docs 的一个更简单的方法是您可以使用minikube service web-test --url 获取网址并在浏览器中使用它,或者如果您使用minikube service web-test,它将直接在浏览器中打开网址。

您的部署 yaml 和其他一切看起来都不错,希望在部署到远程集群时不会出现任何问题。

【讨论】:

  • 知道了,minikube ip 正在返回错误的 IP 地址。很酷,这真的很有帮助,谢谢 Arghya。
  • hm 我有同样的问题,但对我来说 minikube 返回 192.168.49.2 这不起作用。 minikube 服务启动服务器并使用 127.0.0.1:53545 打开 Web 浏览器,这实际上可以工作,但 53545 不是我指定的端口。我不明白这是如何工作的:)
  • @kodlan 是的,我收到了与您相同的 IP (192.168.49.2)(又名路由器地址),这不起作用。但是,127.0.0.1 可以完美运行。也许有一些路由器级别的策略要求您声明传入端口以确保安全?
【解决方案2】:

这似乎与您启动 minikube 时使用的默认 docker 驱动程序有关。为了避免这些问题,您可以强制使用特定的驱动程序(例如“virtualbox”)。为此,请按照以下步骤操作:

删除旧的 minikube:

minikube delete

virtualbox驱动启动minikube:

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

运行minikube ip。您将看到类似192.168.99.100 的输出。 然后,再次创建 Pod 和服务,它应该可以正常工作。 我在这个问题中找到了这个信息:https://github.com/kubernetes/minikube/issues/7344#issuecomment-703225254

【讨论】:

    【解决方案3】:

    您可以使用 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 中的 NodePort。您可以将您的部署公开为服务,然后使用 minikube 服务service-name 创建route
    • 好的,我明白了,所以阅读你的 cmets 和 Arghya 的 cmets,我的方法似乎不适用于 Minikube,我需要使用通过 Minikube 公开服务的惯用方式。
    【解决方案4】:

    docker-desktop UI for Mac and Windows 提供了比 minikube 更简单的替代方案,您可以简单地使用activate the Kubernetes feature on your docker-desktop UI

    设置完成后,您可以右键单击 docker 桌面图标 > Kubernetes

    现在验证您的部署/服务是否正常工作:

    kubectl apply -f /file.yaml
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2021-06-27
      • 2020-11-05
      • 2018-06-02
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多