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

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

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

步骤 1 - 创建新服务

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

kubectl get pods

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

kubectl get services

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

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 的正在运行的服务。在这里我们看到该服务获得了一个唯一的 cluster-IP、一个内部端口和一个 external-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 列表。我们将使用 kubectl get pods 命令,带上 -l 参数,后跟标签值

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。


最后修改于 2023 年 10 月 16 日: tutorials/kubernetes_101: fix typo in module 4 (2b342a98a)