Kubernetes Service允许我们向外部世界公开网络应用程序。然而,要访问它,我们必须知道它的 URL。 在本实践教程中,我们将讨论如何查找并使用 Kubernetes 服务的 URL 作为可靠的网络端点。
我们需要创建一些 Kubernetes 对象作为示例。首先,让我们创建命名空间对象。
1、创建 Kubernetes 命名空间 Kubernetes 命名空间允许我们隔离同一集群内的资源。因此,让我们使用create命令创建两个命名空间 - dev和stg:
$ kubectl create ns dev namespace/dev created $ kubectl create ns stg namespace/stg created |
2、创建 Kubernetes 部署 在上一步中,我们创建了两个命名空间。现在,让我们将Redis pod 部署到这些命名空间:
$ kubectl create deploy redis-dev --image=redis:alpine -n dev deployment.apps/redis-dev created $ kubectl create deploy redis-stg --image=redis:alpine -n stg deployment.apps/redis-stg created |
$ kubectl get pods -n dev NAME READY STATUS RESTARTS AGE redis-dev-7b647c797c-c2mmg 1/1 Running 0 16s $ kubectl get pods -n stg NAME READY STATUS RESTARTS AGE redis-stg-d66978466-plfpv 1/1 Running 0 9s |
现在,所需的设置已准备就绪。在接下来的部分中,我们将创建一些Service对象来与这些 pod 建立通信。
查找ClusterIP服务的URL 在 Kubernetes 中,默认的服务类型是ClusterIP。对于ClusterIP服务,我们可以使用服务名称或其 IP 地址作为其 URL。这允许我们将通信限制为仅在集群内。让我们通过一个简单的例子来理解这一点。
1、创建ClusterIP服务 首先,我们在两个命名空间中创建ClusterIP Service对象:
$ kubectl expose deploy redis-dev --port 6379 --type ClusterIP -n dev service/redis-dev exposed $ kubectl expose deploy redis-stg --port 6379 --type ClusterIP -n stg service/redis-stg exposed |
在以下部分中,我们将讨论如何查找这些服务的名称并将其用作 URL。
2、 在同一命名空间中使用ClusterIP服务的 URL 首先,我们使用get命令从dev命名空间中查找服务名称:
$ kubectl get svc -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-dev ClusterIP 10.100.18.154 <none> 6379/TCP 9s |
现在,让我们执行部署在dev命名空间中的 Redis pod ,使用redis-dev作为主机名连接到 Redis 服务器,并执行PING命令:
$ kubectl exec -it redis-dev-7b647c797c-c2mmg -n dev -- sh /data # redis-cli -h redis-dev PING PONG /data # exit |
最后,我们执行exit命令退出pod。
3、从另一个命名空间使用ClusterIP服务的 URL 让我们检查一下ClusterIP服务 URL的格式:
但是,我们需要指定一个命名空间名称才能使用另一个命名空间的ClusterIP服务。让我们通过一个例子来理解这一点。
首先,让我们找出stg命名空间中的服务名称:
$ kubectl get svc -n stg NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-stg ClusterIP 10.110.213.51 <none> 6379/TCP 9s |
$ kubectl exec -it redis-dev-7b647c797c-c2mmg -n dev -- sh /data # redis-cli -h redis-stg.stg PING PONG /data # exit |
需要注意的重要一点是,我们使用了redis-stg.stg作为主机名,其中redis-stg是服务名称,stg是创建Service对象的命名空间名称。
最后: 在前面的示例中,我们了解了如何使用服务名称作为 URL。
现在,让我们使用删除命令来清理dev和stg命名空间中的服务:
$ kubectl delete svc redis-dev -n dev service "redis-dev" deleted $ kubectl delete svc redis-stg -n stg service "redis-stg" deleted |
查找NodePort服务的URL NodePort服务允许使用 Kubernetes 节点的 IP 地址和端口与应用程序进行外部连接。让我们通过创建NodePort服务来理解这一点。
1. 创建NodePort服务 首先,让我们使用公开命令创建类型为NodePort 的服务:
$ kubectl expose deploy redis-dev --port 6379 --type NodePort -n dev service/redis-dev exposed |
接下来,我们验证Service是否已创建:
$ kubectl get svc -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-dev NodePort 10.111.147.176 <none> 6379:30243/TCP 2s |
现在,我们可以从集群外部使用Kubernetes节点的IP地址和端口30243来访问Redis服务器。让我们看看实际情况。
2. 使用NodePort服务的 URL 首先,我们找到 Kubernetes 节点的 IP 地址:
$ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME baeldung Ready control-plane 24h v1.28.3 192.168.49.2 <none> Ubuntu 22.04.3 LTS 5.15.0-41-generic docker://24.0.7 |
在这里,我们将-o Wide选项与Node对象一起使用来显示附加字段。
在上面的输出中,标题为INTERNAL-IP 的列显示 Kubernetes 节点的 IP 地址。
现在,从外部计算机,使用192.168.49.2作为主机名,30243作为端口号连接到 Redis 服务器,并执行PING命令:
$ redis-cli -h 192.168.49.2 -p 30243 PING PONG |
3. 清理 在下一节中,我们将看到LoadBalancer服务的用法。但在此之前,让我们从dev命名空间中清理NodePort服务:
$ kubectl delete svc redis-dev -n dev service "redis-dev" deleted |
查找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 namespace "dev" deleted $ kubectl delete ns stg namespace "stg" deleted |
在这里,我们直接删除了命名空间,因为这是测试设置。但是,我们在生产环境中执行删除操作时应该非常小心。
结论 在本文中,我们讨论了如何在 Kubernetes 中查找和使用服务的 URL。
首先,我们了解了如何使用ClusterIP服务名称作为来自同一命名空间和另一个命名空间的 URL。然后,我们讨论了如何查找和使用NodePort服务的 URL