访问应用
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 示例
-
创建 Kubernetes deployment
kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0 -
创建 Kubernetes Service 类型 NodePort
kubectl expose deployment hello-minikube1 --type=NodePort --port=8080 -
检查 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 -
运行 service tunnel
minikube service hello-minikube1 --urlminikube 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 -
在浏览器中尝试
在浏览器中打开(确保没有设置代理)
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 示例
-
在单独的终端中运行 tunnel
它会要求输入密码。
minikube tunnelminikube 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 ... ... ... -
创建 Kubernetes deployment
kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0 -
创建类型为 LoadBalancer 的 Kubernetes Service
kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080 -
检查外部 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”。
-
在浏览器中尝试
在浏览器中打开(确保没有设置代理)
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