簡體   English   中英

無法從 Mac 上的主機使用 NodePort 訪問 minikube 服務

[英]Can't access minikube service using NodePort from host on Mac

我正在嘗試在我的 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從集群內部訪問它,但從集群外部,它不會連接。 這些是我的服務和部署清單:

網絡測試服務.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: {}

有人知道我做錯了什么嗎? 或者也許我可以嘗試進一步診斷問題? 我允許嘗試部署入口,但這也不起作用。

當您使用返回127.0.0.1minikube ip時,您通常會遇到這個問題 如果您使用來自kubectl get node -o wide而不是127.0.0.1的內部 ip,它應該可以工作。

官方參考文檔中更簡單的方法是您可以使用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的輸出。 然后,再次創建 Pod 和服務,它應該可以正常工作。 我在這個問題中找到了這個信息: https ://github.com/kubernetes/minikube/issues/7344#issuecomment-703225254

您可以使用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 構造:

$k get service -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP
默認 nginx LoadBalancer 10.43.228.207 172.22.0.240 80:30467/TCP 11h

$ kubectl 端口轉發 --address 0.0.0.0 服務/nginx 8082:80

然后從我網絡上的另一台主機上,我這樣做: curl [運行 minikube 的主機]:8082

從 0.0.0.0:8082 轉發 -> 80 處理 8082 的連接

然后你也可以從不同的主機連接。

與 minikube 相比, Mac and Windows的 docker docker-desktop UI提供了一種更簡單的替代方案,您只需在 docker-desktop UI 上激活 Kubernetes 功能即可:

啟用 Kubernetes

設置完成后,您可以右鍵單擊 docker 桌面圖標 > Kubernetes碼頭工人桌面

現在驗證您的部署/服務是否正常工作:

kubectl apply -f /file.yaml

對於端口,我們應該牢記一個檢查點。

目標端口:80

屬於我們在(Dockerfile 或 Docker-compose 文件)中公開的端口。 如果端口不匹配,您將無法訪問它。

答案是永遠不要使用 Minikube。 它不允許您使用 Nodeport 連接。 無論如何,您將始終使用 minikube 獲得 ECONNREFUSED。 只需使用 docker docker desktop上下文,殺死 minikube,然后重新應用您的服務。 Minikube 只是為了進一步混淆正在學習 Kubernetes 的人。

在此處更改上下文以使用 docker 桌面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM