访问应用程序

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

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

  • NodePort
  • LoadBalancer

minikube 支持这两种方式。继续阅读!

NodePort 访问

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

使用 service 命令获取 NodePort

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

minikube service <service-name> --url

使用 minikube service 和隧道

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

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

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

NodePort 示例

  1. 创建 Kubernetes 部署

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

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

    $ 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. 运行服务隧道

    minikube service hello-minikube1 --url
    

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

    服务输出示例
     $ 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 隧道

    $ 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 服务是将服务公开到 Internet 的标准方法。通过这种方法,每个服务都有自己的 IP 地址。

使用 minikube tunnel

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

LoadBalancer 示例

  1. 在单独的终端中运行隧道

    它会要求输入密码。

    minikube tunnel
    

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

    隧道输出示例
     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 部署

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

    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,则隧道命令还允许从主机进行 Kubernetes 服务的 DNS 解析。

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

清理孤立路由

如果 minikube tunnel 以突然的方式关闭,则可能会在您的系统上留下孤立的网络路由。如果发生这种情况,~/.minikube/tunnels.json 文件将包含该隧道的条目。要删除孤立路由,请运行

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 客户端。您可以通过在具有管理员权限的命令提示符中运行以下命令,在 Windows 上安装最新版本的 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)