模块 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。