"minikube ip 返回 127.0.0.1 | Kubernetes NodePort 服务无法访问"

10

我有两个Kubernetes对象,

apiVersion: v1
kind: Pod
metadata:
  name: client-pod
  labels:
    component: web
spec:
  containers:
  - name: client
    image: stephengrider/multi-client
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 3000

apiVersion: v1
kind: Service
metadata:
  name: client-node-port
spec:
  type: NodePort
  selector:
    component: web
  ports:
  - port: 3050
    targetPort: 3000
    nodePort: 31515

我使用 kubectl apply -f <file_name> 命令应用了两者,这是输出结果:


kubectl get services
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
client-node-port      NodePort    10.100.230.224   <none>        3050:31515/TCP   30m

Pod 输出

NAME                                  READY   STATUS    RESTARTS   AGE
client-pod                            1/1     Running   0          28m

但是当我运行 minikube ip 命令时,返回的是 127.0.0.1, 我正在使用 docker 驱动器的 minikube。

在遵循此问题https://github.com/kubernetes/minikube/issues/7344后, 我使用以下命令获取了节点 IP:

kubectl get node -o json |
        jq --raw-output \
          '.items[0].status.addresses[]
            | select(.type == "InternalIP")
              .address
          '

但即使如此我仍然无法访问该服务。经过更多搜索,我发现

minikube service --url client-node-port
  Starting tunnel for service client-node-port.
|-----------|------------------|-------------|------------------------|
| NAMESPACE |       NAME       | TARGET PORT |          URL           |
|-----------|------------------|-------------|------------------------|
| default   | client-node-port |             | http://127.0.0.1:52694 |
|-----------|------------------|-------------|------------------------|
http://127.0.0.1:52694
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

我可以使用minikube service来访问该服务。

问题:

  1. 但我想知道为什么暴露的nodePort没有起作用?
  2. 为什么我要使用这种变通方法来访问应用程序。

更多信息:


minikube version
minikube version: v1.10.1
commit: 63ab801ac27e5742ae442ce36dff7877dcccb278

docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:48:36Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
如果您需要更多信息,我很愿意提供。 minikube ssh
docker@minikube:~$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
       valid_lft forever preferred_lft forever
945: eth0@if946: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default  link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

@DavidMaze 应用程序在容器内的端口3000上运行,containerPort为3000,port为3050,targetPort为3000,nodePort为31515,我正在尝试访问我的应用程序的基本URL,即http://<ip_address>:<port>/,例如:http://minikube_ip:31515/。 - Sathish
@mario 感谢您的回复。我已经在帖子中添加了 ip -4 a 的响应,请查看一下。 - Sathish
是的。@mario。你在推特或其他平台上吗?我能和你聊天吗?只是为了理解这个 bug。我猜我缺乏基本的网络概念或其他什么东西。 - Sathish
其实我不是专业人士,但你可以在这里问尽可能多的问题 :) 如果需要的话,我们也可以将这个对话转移到聊天中。然而,看到你发布的 GitHub 问题,似乎 minikube ip 返回 127.0.0.1 不是一个错误,如此处所述:_"这是一个设计决策(针对 docker 驱动程序),并不是真正的 bug。"_ - mario
那么,你们是如何获取 IP 地址的?我尝试查看了 #7344,但没有找到解决方案。 - Ashish Bansal
显示剩余3条评论
3个回答

17

我遇到了同样的问题。问题不在于IP 127.0.0.1。问题在于我在调用YAML文件中为NodePort定义的端口。看起来minikube会为外部访问分配一个不同的端口。

我这样做:

  • 以漂亮格式列出所有服务:
  • $minikube service list 
    
  • 显示IP地址和外部端口:
  • $minikube service Type-Your-Service-Name
    

如果您这样做,minikube 将打开浏览器并运行您的应用程序。


2
这个命令能够提供帮助。
minikube service --url $SERVICE

服务中定义的端口与minikube暴露的端口不一致。在服务中我定义了30007端口,而上述命令返回41975端口,这是正确的端口(可用)。 - Adrian

1

我也遇到了同样的问题。

  • 下载并安装VirtualBox(VirtualBox.org)

  • 安装minikube

  • 如果已经安装,请使用brew reinstall minikube重新安装

  • minikube start --vm-driver=virtualbox

  • minikube ip (这将返回IP地址)

可以在浏览器中打开该IP地址,从而运行您的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接