模块 4 - 公开暴露你的应用

难度: 初级 预计时间: 10 分钟

在本场景中,你将学习如何使用 kubectl expose 命令将 Kubernetes 应用程序暴露到集群外部。你还将学习如何使用 kubectl label 命令查看和应用标签到对象。

步骤 1 - 创建新服务

让我们验证一下应用程序是否正在运行。我们将使用 kubectl get 命令并查找现有的 Pod。

kubectl get pods

接下来,让我们列出集群中当前的服务。

kubectl get services

我们有一个名为 Kubernetes 的服务,它是当 minikube 启动集群时默认创建的。要创建新服务并将其暴露给外部流量,我们将使用带有 NodePort 参数的 expose 命令。

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

让我们再次运行 get services 命令。

kubectl get services

Docker Desktop 用户注意事项: 由于 Docker Desktop 网络限制,默认情况下你无法从主机直接访问 Pod。运行 minikube service kubernetes-bootcamp,这将创建一个从 Pod 到你的主机的 SSH 隧道,并在默认浏览器中打开一个连接到该服务的窗口。可以通过按 control-C 终止隧道,然后继续执行步骤 2。

我们现在有一个名为 kubernetes-bootcamp 的正在运行的服务。在这里,我们看到该服务接收到一个唯一的集群 IP、一个内部端口和一个外部 IP(节点的 IP)。

要找出外部(通过 NodePort 选项)打开了哪个端口,我们将运行 describe service 命令。

kubectl describe services/kubernetes-bootcamp

创建一个名为 NODE_PORT 的环境变量,其值为分配的节点端口。

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT

现在我们可以使用 curl、节点的 IP 和外部暴露的端口来测试该应用是否暴露在集群外部。

curl $(minikube ip):$NODE_PORT

我们收到了来自服务器的响应。该服务已暴露。

步骤 2 - 使用标签

Deployment 为我们的 Pod 自动创建了一个标签。使用 describe deployment 命令,你可以看到标签的名称。

kubectl describe deployment

让我们使用这个标签来查询我们的 Pod 列表。我们将使用带有 -l 参数的 kubectl get pods 命令,后跟标签值。

kubectl get pods -l app=kubernetes-bootcamp

你可以执行相同的操作来列出现有的服务。

kubectl get services -l app=kubernetes-bootcamp

获取 Pod 的名称并将其存储在 POD_NAME 环境变量中。

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

要应用新标签,我们使用 label 命令,后跟对象类型、对象名称和新标签。

kubectl label pods $POD_NAME version=v1

这会将新标签应用于我们的 Pod(我们将应用程序版本固定到 Pod),我们可以使用 describe pod 命令检查它。

kubectl describe pods $POD_NAME

我们在这里看到,该标签已附加到我们的 Pod 上。现在,我们可以使用新标签查询 Pod 列表。

kubectl get pods -l version=v1

我们看到了 Pod。

步骤 3 - 删除服务

要删除服务,可以使用 delete service 命令。标签也可以在这里使用。

kubectl delete service -l app=kubernetes-bootcamp

确认该服务已删除。

kubectl get services

这确认了我们的服务已被删除。要确认路由不再暴露,你可以 curl 之前暴露的 IP 和端口。

curl $(minikube ip):$NODE_PORT

这证明了该应用不再可以从集群外部访问。你可以在 Pod 内使用 curl 确认该应用仍在运行。

kubectl exec -ti $POD_NAME -- curl localhost:8080

我们在这里看到该应用程序已启动。这是因为 Deployment 正在管理该应用程序。要关闭该应用程序,还需要删除 Deployment。