1. 应用访问
在 kubernetes 中主要有两类服务访问方式:
- NodePort
- LoadBalancer
minikube 这两种访问方式都支持。
1.1. NodePort 访问
NodePort 服务是将外部通信直接传递到服务的最基本方法。NodePort 顾名思义,打开一个特定的端口,任何发送到这个端口的流量都被转发到服务。
1.1.1. 使用 service 命令获取 NodePort
我们也有一个获取 minikube IP 和服务的 NodePort
的快捷方式
minikube service --url <service-name>
1.2. 使用 kubectl 获取 NodePort
minikube 虚拟机通过一个主机专用的 IP 地址暴露给主机系统,这个 IP 地址可以通过 minikube ip
命令获得。任何类型为 NodePort
的服务都可以通过该 IP 地址在 NodePort 上访问。
To determine the NodePort for your service, you can use a kubectl
command like this (note that nodePort
begins with lowercase n
in JSON output):
要确定你服务的 NodePort,你可以像这样使用 kubectl
命令(注意,在 JSON 输出中 nodePort
以小写 n
开头):
kubectl get service <service-name> --output='jsonpath="{.spec.ports[0].nodePort}"'
1.2.1. 增加 NodePort 范围
默认情况下,minikube 只公开 30000-32767 端口。如果这无法满足,你可以使用以下方法来调整范围:
minikube start --extra-config=apiserver.service-node-port-range=1-65535
此标志也接受用逗号分隔的端口列表和端口范围。
1.3. LoadBalancer 访问
LoadBalancer 服务是向 internet 公开服务的标准方式。使用这种方法,每个服务都获得自己的 IP 地址。
1.4. 使用 minikube tunnel
LoadBalancer 类型的服务可以通过 minikube tunnel
命令开放。它必须在一个单独的终端窗口中运行,以保持 LoadBalancer
运行。在终端中使用 Ctrl-C
可以终止该进程,此时网络路由将被清理。
1.5. 示例
在单独的终端中运行 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
...
...
...
创建一个 kubernetes deployment
kubectl create deployment hello-minikube1 --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.4
创建一个 LoadBalancer 类型的 kubernetes service
kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080
1.5.1. 确认 external IP
$ kubectl 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
[!NOTE|style:flat] 注意,如果没有 minikube 隧道,kubernetes 将显示外部IP为
pending
。
1.5.2. 在浏览器中尝试
在浏览器中打开(确保没有代理设置)
http://REPLACE_WITH_EXTERNAL_IP:8080
Each service will get its own external ip.
1.5.3. DNS 解析(实验特性)
如果您在 macOS 上,tunnel 命令还允许主机的 Kubernetes 服务的 DNS 解析。
[!NOTE|style:flat] 注意:docker 驱动不支持 DNS 解析方式
1.5.4. 清理无效路由
如果 minikube tunnel
突然关闭,它可能会在你的系统上留下孤立的网络路由。如果发生这种情况,~/.minikube/tunnels.json
文件将包含该隧道的条目。如果需要移除孤立路由,执行以下命令:
minikube tunnel --cleanup
[!NOTE|style:flat] 注意:
--cleanup
标记的默认值是true
。
1.5.5. 避免密码提示
添加路由需要用户的 root 权限,因此不同的操作系统在如何运行 minikube tunnel
上存在差异。如果你想避免输入 root 密码,可以考虑为 ip
和 route
命令设置 NOPASSWD:
https://superuser.com/questions/1328452/sudoers-nopasswd-for-single-executable-but-allowing-others
1.5.6. 在 Windows 上访问小于 1024 的端口需要 root 权限
如果你在 Windows 上使用 Docker 驱动,同时有一个旧版本的 SSH 客户端,你可能会得到一个错误,如 Privileged ports can only be forwarded by root
。
or you might not be able to access the service even after minikube tunnel
if the access port is less than 1024 but for ports greater than 1024 works fine.
为了解决这个问题,请确保您正在运行最新版本的SSH客户端。在Windows上安装最新版本的SSH客户端,您可以使用管理员权限(要求 chocolatey package manager)在命令提示符下运行以下命令。
choco install openssh
在 Windows 10 上默认可用的最新版本( OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
)不起作用。你可以在这里跟踪这个问题- https://github.com/PowerShell/Win32-OpenSSH/issues/1693