访问应用

如何访问运行在 minikube 中的应用程序

Kubernetes 中主要有两种类别的服务

  • NodePort
  • LoadBalancer

minikube 支持两者。请继续阅读!

NodePort 访问

NodePort 服务是将外部流量直接导向你的服务的最基本方式。顾名思义,NodePort 会打开一个特定端口,发送到该端口的任何流量都会被转发到服务。

使用 service 命令获取 NodePort

我们还有一个用于获取 minikube IP 和服务 NodePort 的快捷方式

minikube service <service-name> --url

使用 minikube service 和 tunnel

如果使用 Darwin、Windows 或 WSL 上的 Docker 驱动程序,网络会受到限制,并且 Node IP 无法直接访问。

在 Linux 上使用 Docker 驱动程序运行 minikube 将不会创建 tunnel。

类型为 NodePort 的服务可以通过 minikube service <service-name> --url 命令暴露。它必须在单独的终端窗口中运行,以保持 tunnel 开放。终端中的 Ctrl-C 可用于终止进程,届时网络路由将被清理。

NodePort 示例

  1. 创建 Kubernetes deployment

    kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0
    
  2. 创建 Kubernetes Service 类型 NodePort

    kubectl expose deployment hello-minikube1 --type=NodePort --port=8080
    
  3. 检查 Node Port

    $ kubectl get svc
    NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    hello-minikube1   NodePort    10.100.238.34   <none>        8080:31389/TCP   3s
    
  4. 运行 service tunnel

    minikube service hello-minikube1 --url
    

    minikube service hello-minikube1 --url 作为进程运行,创建了一个到集群的 tunnel。该命令将服务直接暴露给运行在宿主操作系统上的任何程序。

    service 输出示例
     $ minikube service hello-minikube1 --url
     http://127.0.0.1:57123
     ❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
     

    在另一个终端检查 ssh tunnel

    $ ps -ef | grep docker@127.0.0.1
    ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -N docker@127.0.0.1 -p 55972 -i /Users/FOO/.minikube/machines/minikube/id_rsa -L TUNNEL_PORT:CLUSTER_IP:TARGET_PORT
    
  5. 在浏览器中尝试

    在浏览器中打开(确保没有设置代理)

    http://127.0.0.1:TUNNEL_PORT
    

使用 kubectl 获取 NodePort

minikube VM 通过一个主机专属 IP 地址暴露给宿主系统,该地址可以通过 minikube ip 命令获取。类型为 NodePort 的任何服务都可以通过该 IP 地址的 NodePort 进行访问。

要确定你服务的 NodePort,你可以使用类似这样的 kubectl 命令(请注意,在 JSON 输出中,nodePort 以小写 n 开头)

kubectl get service <service-name> --output='jsonpath="{.spec.ports[0].nodePort}"'

增加 NodePort 范围

默认情况下,minikube 只暴露端口 30000-32767。如果这不适合你,你可以通过以下方式调整范围:

minikube start --extra-config=apiserver.service-node-port-range=1-65535

此标志也接受逗号分隔的端口和端口范围列表。


LoadBalancer 访问

LoadBalancer 服务是将服务暴露给互联网的标准方式。通过此方法,每个服务都有自己的 IP 地址。

使用 minikube tunnel

类型为 LoadBalancer 的服务可以通过 minikube tunnel 命令暴露。它必须在单独的终端窗口中运行,以保持 LoadBalancer 运行。终端中的 Ctrl-C 可用于终止进程,届时网络路由将被清理。

LoadBalancer 示例

  1. 在单独的终端中运行 tunnel

    它会要求输入密码。

    minikube tunnel
    

    minikube tunnel 作为进程运行,通过使用集群的 IP 地址作为网关,在宿主系统上创建一个到集群服务 CIDR 的网络路由。tunnel 命令将外部 IP 直接暴露给运行在宿主操作系统上的任何程序。

    tunnel 输出示例
     Password:
     Status:
     machine: minikube
     pid: 39087
     route: 10.96.0.0/12 -> 192.168.64.194
     minikube: Running
     services: [hello-minikube]
         errors:
       minikube: no errors
       router: no errors
       loadbalancer emulator: no errors
     ...
     ...
     ...
     
  2. 创建 Kubernetes deployment

    kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0
    
  3. 创建类型为 LoadBalancer 的 Kubernetes Service

    kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080
    
  4. 检查外部 IP

    kubectl get svc
    
     $ kc get svc
     NAME              TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
     hello-minikube1   LoadBalancer   10.96.184.178   10.96.184.178   8080:30791/TCP   40s
     

    请注意,如果没有 minikube tunnel,Kubernetes 将显示外部 IP 为“pending”。

  5. 在浏览器中尝试

    在浏览器中打开(确保没有设置代理)

    http://REPLACE_WITH_EXTERNAL_IP:8080
    

    每个服务都会获得自己的外部 IP。


DNS 解析(实验性)

如果你使用的是 macOS,tunnel 命令还允许从宿主系统解析 Kubernetes 服务的 DNS。

注意:docker 驱动程序不支持 DNS 解析

清理孤立的路由

如果 minikube tunnel 异常关闭,可能会在你的系统上留下孤立的网络路由。如果发生这种情况,~/.minikube/tunnels.json 文件将包含该 tunnel 的条目。要删除孤立的路由,请运行:

minikube tunnel --cleanup

注意:--cleanup 标志的默认值为 true

避免密码提示

添加路由需要用户拥有 root 权限,因此运行 minikube tunnel 的方式会因操作系统而异。如果你想避免输入 root 密码,可以考虑为“ip”和“route”命令设置 NOPASSWD

https://superuser.com/questions/1328452/sudoers-nopasswd-for-single-executable-but-allowing-others

在 Windows 上访问 <1024 端口需要 root 权限

如果你在 Windows 上使用 Docker 驱动程序,可能会遇到旧版本的 SSH 客户端,你可能会收到类似 Privileged ports can only be forwarded by root. 的错误,或者在 minikube tunnel 之后,即使端口小于 1024,也无法访问服务,但大于 1024 的端口可以正常工作。

为了解决这个问题,请确保你运行的是最新版本的 SSH 客户端。你可以在以管理员权限运行的命令提示符中运行以下命令来安装最新版本的 SSH 客户端:(需要 chocolatey 包管理器)

choco install openssh

Windows 10 上默认可用的最新版本 (OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5) 不起作用。你可以在这里跟踪此问题 - https://github.com/PowerShell/Win32-OpenSSH/issues/1693


最后修改于 2022 年 12 月 28 日:更新 echo-server 镜像并添加 ingress 步骤 (428a55fc5)