在本实践教程中,我们将讨论如何查找并使用 Kubernetes 服务的 URL 作为可靠的网络端点。
我们需要创建一些 Kubernetes 对象作为示例。首先,让我们创建命名空间对象。
1、创建 Kubernetes 命名空间
Kubernetes 命名空间允许我们隔离同一集群内的资源。因此,让我们使用create命令创建两个命名空间 - dev和stg:
$ kubectl create ns dev |
2、创建 Kubernetes 部署
在上一步中,我们创建了两个命名空间。现在,让我们将Redis pod 部署到这些命名空间:
$ kubectl create deploy redis-dev --image=redis:alpine -n dev |
接下来,我们验证 pod 是否已创建并且处于健康状态:
$ kubectl get pods -n dev |
在这里,我们可以观察到两个 Pod 的状态都是Running。
现在,所需的设置已准备就绪。在接下来的部分中,我们将创建一些Service对象来与这些 pod 建立通信。
查找ClusterIP服务的URL
在 Kubernetes 中,默认的服务类型是ClusterIP。对于ClusterIP服务,我们可以使用服务名称或其 IP 地址作为其 URL。这允许我们将通信限制为仅在集群内。让我们通过一个简单的例子来理解这一点。
1、创建ClusterIP服务
首先,我们在两个命名空间中创建ClusterIP Service对象:
$ kubectl expose deploy redis-dev --port 6379 --type ClusterIP -n dev |
在此示例中,我们使用公开命令来创建服务对象。公开命令使用部署对象的选择器并使用相同的选择器创建服务。
在以下部分中,我们将讨论如何查找这些服务的名称并将其用作 URL。
2、 在同一命名空间中使用ClusterIP服务的 URL
首先,我们使用get命令从dev命名空间中查找服务名称:
$ kubectl get svc -n dev |
在输出中,第一列显示服务名称。在我们的例子中,它是redis-dev。
现在,让我们执行部署在dev命名空间中的 Redis pod ,使用redis-dev作为主机名连接到 Redis 服务器,并执行PING命令:
$ kubectl exec -it redis-dev-7b647c797c-c2mmg -n dev -- sh |
在这里,我们可以看到 Redis 服务器响应了PONG消息。
最后,我们执行exit命令退出pod。
3、从另一个命名空间使用ClusterIP服务的 URL
让我们检查一下ClusterIP服务 URL的格式:
在上一个示例中,我们没有使用命名空间和集群名称,因为我们从相同的命名空间和集群执行命令。除此之外,我们还跳过了service-port,因为服务是使用默认的 Redis 端口6379公开的。
但是,我们需要指定一个命名空间名称才能使用另一个命名空间的ClusterIP服务。让我们通过一个例子来理解这一点。
首先,让我们找出stg命名空间中的服务名称:
$ kubectl get svc -n stg |
现在,让我们执行部署在dev命名空间中的 Redis pod ,使用redis-stg.stg 作为主机名连接到 Redis 服务器,并执行PING命令:
$ kubectl exec -it redis-dev-7b647c797c-c2mmg -n dev -- sh |
在此示例中,我们可以看到 Redis 服务器发送了PONG回复。
需要注意的重要一点是,我们使用了redis-stg.stg作为主机名,其中redis-stg是服务名称,stg是创建Service对象的命名空间名称。
最后:
在前面的示例中,我们了解了如何使用服务名称作为 URL。
现在,让我们使用删除命令来清理dev和stg命名空间中的服务:
$ kubectl delete svc redis-dev -n dev |
查找NodePort服务的URL
NodePort服务允许使用 Kubernetes 节点的 IP 地址和端口与应用程序进行外部连接。让我们通过创建NodePort服务来理解这一点。
1. 创建NodePort服务
首先,让我们使用公开命令创建类型为NodePort 的服务:
$ kubectl expose deploy redis-dev --port 6379 --type NodePort -n dev |
接下来,我们验证Service是否已创建:
$ kubectl get svc -n dev |
在这里,我们可以看到Service类型是NodePort。在倒数第二列中,它显示 Kubernetes 节点的端口30243映射到 pod 的端口6379。
现在,我们可以从集群外部使用Kubernetes节点的IP地址和端口30243来访问Redis服务器。让我们看看实际情况。
2. 使用NodePort服务的 URL
首先,我们找到 Kubernetes 节点的 IP 地址:
$ kubectl get nodes -o wide |
在这里,我们将-o Wide选项与Node对象一起使用来显示附加字段。
在上面的输出中,标题为INTERNAL-IP 的列显示 Kubernetes 节点的 IP 地址。
现在,从外部计算机,使用192.168.49.2作为主机名,30243作为端口号连接到 Redis 服务器,并执行PING命令:
$ redis-cli -h 192.168.49.2 -p 30243 PING |
在这里,我们可以看到 Redis 服务器响应了一条PONG消息。
3. 清理
在下一节中,我们将看到LoadBalancer服务的用法。但在此之前,让我们从dev命名空间中清理NodePort服务:
$ kubectl delete svc redis-dev -n dev |
查找LoadBalancer服务的URL
就像NodePort服务一样,LoadBalancer服务也允许使用负载均衡器的 IP 地址与应用程序进行外部连接。为了理解这一点,让我们创建一个LoadBalancer服务:
1. 创建负载均衡器服务
让我们使用暴露命令在dev命名空间中创建一个LoadBalancer服务:
$ kubectl expose deploy redis-dev --port 6379 --type LoadBalancer -n dev
service/redis-dev exposed
2. 使用LoadBalancer服务的 URL
接下来,我们使用get命令查找负载均衡器的 IP 地址:
$ kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-dev LoadBalancer 10.111.167.249 192.168.49.10 6379:32637/TCP 7s
在此示例中,标题为EXTERNAL-IP 的列表示LoadBalancer服务的 IP 地址。
在我们的示例中,负载均衡器的 IP 地址是192.168.49.10。
现在,从外部计算机,使用192.168.49.10作为主机名连接到 Redis 服务器并执行PING命令:
$ redis-cli -h 192.168.49.10 PING
PONG
在输出中,我们可以看到 Redis 服务器回复了一条PONG消息。
清理
删除所有不需要的对象来整理集群是一个很好的做法。这有助于我们通过减少硬件消耗来降低成本。
因此,让我们使用删除命令来删除dev和stg命名空间:
$ kubectl delete ns dev |
此命令删除命名空间本身以及该命名空间中存在的所有对象。
在这里,我们直接删除了命名空间,因为这是测试设置。但是,我们在生产环境中执行删除操作时应该非常小心。
结论
在本文中,我们讨论了如何在 Kubernetes 中查找和使用服务的 URL。
首先,我们了解了如何使用ClusterIP服务名称作为来自同一命名空间和另一个命名空间的 URL。然后,我们讨论了如何查找和使用NodePort服务的 URL