Kubernetes 中的外部服务访问

阅读时长 7 分钟读完

Kubernetes(简称 k8s)已经成为了云原生应用的标准管理平台之一,尤其是在分布式微服务的场景中,它可以帮助开发者自动化部署、扩缩容、负载均衡等操作,极大地简化了应用的管理。但是在实际应用中,我们经常需要访问外部服务,比如数据库、缓存、邮件服务器等等。那么在 k8s 中,如何实现外部服务访问呢?本文将详细介绍。

Kubernetes 中的服务类型

在 k8s 中,服务(Service)是一个非常重要的概念,它可以将一组运行在多个 Pod 中的应用程序提供的服务封装成一个单一的抽象。在使用 k8s 时,我们通常将服务分为三种类型:ClusterIP、NodePort 和 LoadBalancer。

  • ClusterIP 类型:该类型的服务只在集群内部可见,不会分配一个外部 IP,只分配一个 ClusterIP。一般来说,这种类型的服务用于提供应用内部的服务发现和负载均衡。
  • NodePort 类型:该类型的服务会在所有节点上分配一个固定端口(NodePort),内部生成的 ClusterIP 以及端口会被映射到 NodePort 上,可以提供外部访问服务的能力。一般来说,这种类型的服务用于提供较为简单的扩展性要求,并且需要外部访问的场景。
  • LoadBalancer 类型:该类型的服务是外部服务访问 k8s 内部服务的最主要方式,它可以创建一个云服务商提供的负载均衡器,并分配一个唯一的外部 IP 地址来访问当前服务。一般来说,对于涉及到外部访问和高可用性的应用来说,这种类型的服务是最合适的。

NodePort 类型服务的使用

在 k8s 中,我们可以通过 NodePort 类型服务来实现外部访问。下面我们将详细介绍 NodePort 类型服务的使用方法。

创建 NodePort 类型服务

下面是一个创建 NodePort 类型服务的样例:

-- -------------------- ---- -------
----------- --
----- -------
---------
  ----- ---------
-----
  ----- --------
  ---------
    ---- -----
  ------
    - --------- ---
      ----- --
      ----------- ----

在上述样例中,我们定义了一个 NodePort 类型的服务,名称为 myservice,选择器为 app=myapp,端口为 80。port 和 targetPort 的含义分别如下:

  • port:是 service 的端口,即外部可以访问的端口。
  • targetPort:是转发到 container 内部的端口。

访问 NodePort 类型服务

在 k8s 中,我们可以通过两种方式来访问 NodePort 类型服务:

  • 使用集群 IP + NodePort 的方式访问
  • 使用节点 IP + NodePort 的方式访问

其中,使用集群 IP + NodePort 的方式访问,需要通过 k8s 的代理服务来实现,具体命令如下:

我们通过上述命令创建了一个代理服务(将 localhost:8080 映射到 Kubernetes 集群),接下来就可以通过以下 URL 访问服务了:

其中,[namespace] 是服务所在的命名空间(如果不指定,默认为 default),[service-name] 是服务的名字,[port-name] 是服务的端口名(如果没有使用端口名的话,则直接是端口号)。例如,在上述样例中,访问服务的 URL 应该是:

除了使用 k8s 代理服务来访问 NodePort 类型服务,我们还可以通过使用节点 IP + NodePort 的方式来访问。具体操作步骤如下:

  1. 首先,我们需要获取集群中所有节点的 IP 地址,可以通过以下命令来获取:

    输出结果如下:

    在上述输出结果中,我们可以看到节点的 IP 地址为 INTERNAL-IP 字段。

  2. 然后,我们可以通过任意一个节点的 IP 地址和 NodePort 来访问该服务,例如:

    在上述 URL 中,172.16.0.2 表示任意一个节点的 IP 地址,30000 则是 NodePort。

LoadBalancer 类型服务的使用

对于需要外部访问和高可用性的应用来说,LoadBalancer 类型服务是最合适的。下面我们将详细介绍如何使用 LoadBalancer 类型服务。

创建 LoadBalancer 类型服务

在 k8s 中,我们可以通过如下样例来创建一个 LoadBalancer 类型的服务:

-- -------------------- ---- -------
----------- --
----- -------
---------
  ----- ---------
-----
  ----- ------------
  ---------
    ---- -----
  ------
    - --------- ---
      ----- --
      ----------- ----

在上述样例中,我们定义了一个 LoadBalancer 类型的服务,名称为 myservice,选择器为 app=myapp,端口为 80。其中,port 和 targetPort 的含义和 NodePort 类型服务相同。

访问 LoadBalancer 类型服务

在创建 LoadBalancer 类型服务时,k8s 将会自动创建一个外部负载均衡器,并为该服务分配一个唯一的 IP 地址。用户可以通过该 IP 地址来访问服务。

例如,在创建一个名为 mysql 的 LoadBalancer 类型服务后,可以通过以下命令查看该服务的 IP 地址:

输出结果如下:

在上述输出结果中,我们可以看到 LoadBalancer 类型服务的 IP 地址为 EXTERNAL-IP 字段。用户可以通过该 IP 地址来访问该服务。

总结

本文介绍了在 k8s 中如何使用 NodePort 和 LoadBalancer 类型服务来实现外部服务访问的方法。在实际应用中,根据业务需求和实际情况来选择不同类型的服务非常重要。同时,我们还介绍了不同方式访问 NodePort 类型服务的方法,以及访问 LoadBalancer 类型服务的方法。希望本文可以帮助读者更好地理解和应用 k8s 中的外部服务访问技术。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c8763968c7c53b0b7dc1f

纠错
反馈