访问应用
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
NodePort 示例
-
创建 Kubernetes 部署
kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0
-
创建 Kubernetes 类型为 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
-
运行服务隧道
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
-
在浏览器中尝试
在浏览器中打开(确保未设置代理)
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 示例
-
在单独的终端中运行隧道
它将要求输入密码。
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 ... ... ...
-
创建 Kubernetes 部署
kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0
-
创建类型为 LoadBalancer 的 Kubernetes 服务
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 隧道,Kubernetes 会将外部 IP 显示为“pending”(待定)。
-
在浏览器中尝试
在浏览器中打开(确保未设置代理)
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