如何在 Kubernetes 中查找服务的 URL

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
接下来,我们验证 pod 是否已创建并且处于健康状态:

$ 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
在这里,我们可以观察到两个 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
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
在输出中,第一列显示服务名称。在我们的例子中,它是redis-dev。

现在,让我们执行部署在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
在这里,我们可以看到 Redis 服务器响应了PONG消息。

最后,我们执行exit命令退出pod。

3、从另一个命名空间使用ClusterIP服务的 URL 让我们检查一下ClusterIP服务 URL的格式:

..: 在上一个示例中,我们没有使用命名空间和集群名称,因为我们从相同的命名空间和集群执行命令。除此之外,我们还跳过了service-port,因为服务是使用默认的 Redis 端口6379公开的。

但是,我们需要指定一个命名空间名称才能使用另一个命名空间的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
现在,让我们执行部署在dev命名空间中的 Redis pod ,使用redis-stg.stg 作为主机名连接到 Redis 服务器,并执行PING命令:

$ kubectl exec -it redis-dev-7b647c797c-c2mmg -n dev -- sh
/data # redis-cli -h redis-stg.stg PING
PONG
/data # exit
在此示例中,我们可以看到 Redis 服务器发送了PONG回复。

需要注意的重要一点是,我们使用了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
在这里,我们可以看到Service类型是NodePort。在倒数第二列中,它显示 Kubernetes 节点的端口30243映射到 pod 的端口6379。

现在,我们可以从集群外部使用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
在这里,我们可以看到 Redis 服务器响应了一条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