介绍
Kubernetes 中的 expose
命令是一个简单但功能强大的工具,用于使 Pod 或 Deployment 通过网络服务可访问。本实验将指导你完成启动 Kubernetes 集群、创建 Deployment、将其暴露为服务以及访问服务以验证功能的整个过程。通过本实验,你将清楚地了解如何在 Kubernetes 中暴露 Deployment 并处理服务。
Kubernetes 中的 expose
命令是一个简单但功能强大的工具,用于使 Pod 或 Deployment 通过网络服务可访问。本实验将指导你完成启动 Kubernetes 集群、创建 Deployment、将其暴露为服务以及访问服务以验证功能的整个过程。通过本实验,你将清楚地了解如何在 Kubernetes 中暴露 Deployment 并处理服务。
要在本地运行 Kubernetes,我们使用 Minikube,它会设置一个单节点的 Kubernetes 集群。在进行任何 Kubernetes 操作之前,请确保 Minikube 已启动并运行。
打开终端并使用以下命令启动 Minikube:
minikube start
这将初始化集群。如果需要,你可以使用 --cpus
和 --memory
等标志指定资源限制,以确保集群有足够的资源。
验证 Minikube 是否正在运行:
minikube status
你应该会看到集群及其组件正在成功运行。
启动 Minikube 可确保 Kubernetes 已准备好管理后续步骤中的部署和服务。
在 Kubernetes 中,Deployment 是一种资源对象,用于确保你的应用程序始终运行所需数量的副本。Deployment 管理 Pod 并帮助维护它们在集群中的状态。在此步骤中,你将创建一个运行 Nginx Web 服务器的 Deployment。
使用以下命令创建一个名为 hello-world
的 Deployment,并使用 nginx
镜像:
kubectl create deployment hello-world --image=nginx
此命令会创建一个运行 Nginx Web 服务器的单 Pod 的 Deployment。--image
标志指定了要使用的容器镜像。由于未显式设置副本数量,Kubernetes 默认会创建一个 Pod。
通过运行以下命令检查 Deployment 是否成功创建:
kubectl get deployments
此命令会列出当前命名空间中的所有 Deployment,显示它们的名称、所需副本数量和状态。
通过创建此 Deployment,你可以确保 Kubernetes 自动处理 Pod 的创建和重启,以维持所需的应用程序状态。
kubectl expose
命令kubectl expose
命令用于创建一个新的 Kubernetes 服务,以暴露现有的资源,例如 Pod、Deployment 或 Replication Controller。它通过基于提供的资源自动创建服务,简化了网络配置。
运行以下命令以查看 kubectl expose
的可用选项:
kubectl expose -h
你将看到以下输出:
将资源暴露为新的 Kubernetes 服务。
通过名称查找 Deployment、Service、Replica Set、Replication Controller 或 Pod,并使用该资源的选择器作为新服务的选择器,指定端口。只有当 Deployment 或 Replica Set 的选择器可以转换为服务支持的选择器时(即选择器仅包含 matchLabels 组件),才会将其暴露为服务。请注意,如果未通过 --port 指定端口且暴露的资源具有多个端口,则所有端口都将被新服务重用。此外,如果未指定标签,新服务将重用其暴露资源的标签。
可能的资源包括(不区分大小写):
pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs)
示例:
## 为复制的 nginx 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
kubectl expose rc nginx --port=80 --target-port=8000
## 为通过 "nginx-controller.yaml" 中指定的类型和名称标识的 Replication Controller 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000
## 为 Pod valid-pod 创建一个服务,该服务在端口 444 上提供服务,名称为 "frontend"
kubectl expose pod valid-pod --port=444 --name=frontend
## 基于上述服务创建第二个服务,将容器端口 8443 暴露为端口 443,名称为 "nginx-https"
kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https
## 为复制的流媒体应用程序创建一个服务,在端口 4100 上平衡 UDP 流量,名称为 'video-stream'
kubectl expose rc streamer --port=4100 --protocol=UDP --name=video-stream
## 为使用 Replica Set 复制的 nginx 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
kubectl expose rs nginx --port=80 --target-port=8000
## 为 nginx Deployment 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
kubectl expose deployment nginx --port=80 --target-port=8000
为了使 Deployment 可以从 Kubernetes 集群外部访问,你需要将其暴露为一个服务。Kubernetes 中的服务充当稳定的网络端点,即使底层 Pod 发生变化。
运行以下命令以创建一个名为 hello-service
的 NodePort 服务:
kubectl expose deployment hello-world --name=hello-service --port=80 --target-port=80 --type=NodePort
--port
标志指定服务将向外部客户端暴露的端口。--target-port
标志定义服务将流量路由到的容器端口。--type=NodePort
标志使服务可以在集群中每个节点的特定端口上访问。验证服务是否成功创建:
kubectl get services hello-service
此命令显示服务的详细信息,包括其类型和分配的 NodePort。
像 NodePort 这样的服务允许外部客户端通过将请求转发到正确的容器端口与 Kubernetes 集群中的 Pod 进行交互。
要访问暴露的服务,你需要获取分配给服务的 NodePort 以及集群中某个节点的内部 IP 地址。这些详细信息使外部客户端能够连接到你的应用程序。
通过运行以下命令获取分配给 hello-service
的 NodePort:
kubectl get service hello-service -o jsonpath='{.spec.ports[0].nodePort}'
此命令从服务定义中提取 NodePort 值。
使用以下命令获取集群中任意节点的内部 IP 地址:
kubectl get nodes -o wide
注意输出中的 INTERNAL-IP
字段。此 IP 地址表示节点的私有网络地址。
有了 NodePort 和 InternalIP,你现在具备了从外部访问服务所需的详细信息。
通过 NodePort 和节点的 IP 地址,你可以使用 curl
或浏览器等工具测试服务。
将 <NODE_IP>
和 <NODE_PORT>
替换为上一步中获取的值,然后运行:
curl <NODE_IP>:<NODE_PORT>
如果一切配置正确,你应该在终端中看到默认的 Nginx 欢迎页面。此输出确认服务正在运行并且可以从外部访问。
<!doctype html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
color-scheme: light dark;
}
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
</p>
<p>
For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br />
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.
</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
访问服务展示了 Kubernetes 如何处理客户端与适当容器端口之间的流量路由。
完成实验后,清理你创建的资源非常重要,以避免 Kubernetes 集群中不必要的资源消耗。
通过运行以下命令删除 hello-service
:
kubectl delete service hello-service
使用以下命令删除 hello-world
部署:
kubectl delete deployment hello-world
清理资源可确保你的集群保持干净状态,为未来的实验做好准备。
在本实验中,你学习了如何在 Kubernetes 中使用 expose
命令创建 NodePort 服务。你暴露了一个 Nginx 部署,通过 NodePort 访问它,并验证了其功能。此练习展示了 Kubernetes 服务的核心概念,以及它们如何为你的负载提供网络访问。