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 密码,可以考虑为 iproute 命令设置 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

Copyright © 温玉 2021 | 浙ICP备2020032454号 all right reserved,powered by Gitbook该文件修订时间: 2022-06-13 09:50:34

results matching ""

    No results matching ""