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