访问应用

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

Kubernetes 中的服务主要分为两类

  • NodePort
  • LoadBalancer

minikube 支持这两种类型。请继续阅读!

NodePort 访问

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

使用 service 命令获取 NodePort

我们还提供了一个获取 minikube IP 和服务 `NodePort` 的快捷方式

minikube service <service-name> --url

使用带有隧道的 `minikube service`

如果在 Darwin、Windows 或 WSL 上使用 Docker 驱动,则网络受限,Node IP 无法直接访问。

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

类型为 `NodePort` 的服务可以通过 `minikube service --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. 检查 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. 运行服务隧道

    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 虚拟机通过仅主机 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. 在单独的终端中运行隧道

    它将要求输入密码。

    minikube tunnel
    

    minikube tunnel 作为进程运行,在主机上创建一个网络路由,将集群的服务 CIDR 使用集群的 IP 地址作为网关。该隧道命令将外部 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 隧道,Kubernetes 会将外部 IP 显示为“pending”(待定)。

  5. 在浏览器中尝试

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

    http://REPLACE_WITH_EXTERNAL_IP:8080
    

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


DNS 解析(实验性)

如果您使用的是 macOS,tunnel 命令还允许从主机对 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)