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 的代理服务来实现,具体命令如下:
$ kubectl proxy --port=8080
我们通过上述命令创建了一个代理服务(将 localhost:8080 映射到 Kubernetes 集群),接下来就可以通过以下 URL 访问服务了:
http://localhost:8080/api/v1/namespaces/[namespace]/services/[service-name]:[port-name]/proxy/
其中,[namespace] 是服务所在的命名空间(如果不指定,默认为 default),[service-name] 是服务的名字,[port-name] 是服务的端口名(如果没有使用端口名的话,则直接是端口号)。例如,在上述样例中,访问服务的 URL 应该是:
http://localhost:8080/api/v1/namespaces/default/services/myservice:80/proxy/
除了使用 k8s 代理服务来访问 NodePort 类型服务,我们还可以通过使用节点 IP + NodePort 的方式来访问。具体操作步骤如下:
首先,我们需要获取集群中所有节点的 IP 地址,可以通过以下命令来获取:
$ kubectl get nodes -o wide
输出结果如下:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-node-1 Ready <none> 9m15s v1.21.0 172.16.0.2 <none> Ubuntu 20.04 4.4.0-141-generic docker://20.10.6 k8s-node-2 Ready <none> 9m9s v1.21.0 172.16.0.3 <none> Ubuntu 20.04 4.4.0-141-generic docker://20.10.6 k8s-node-3 Ready <none> 9m13s v1.21.0 172.16.0.4 <none> Ubuntu 20.04 4.4.0-141-generic docker://20.10.6
在上述输出结果中,我们可以看到节点的 IP 地址为 INTERNAL-IP 字段。
然后,我们可以通过任意一个节点的 IP 地址和 NodePort 来访问该服务,例如:
http://172.16.0.2:30000/
在上述 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 地址:
$ kubectl get services mysql
输出结果如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql LoadBalancer 10.97.104.230 203.0.113.11 3306:31234/TCP 7s
在上述输出结果中,我们可以看到 LoadBalancer 类型服务的 IP 地址为 EXTERNAL-IP 字段。用户可以通过该 IP 地址来访问该服务。
总结
本文介绍了在 k8s 中如何使用 NodePort 和 LoadBalancer 类型服务来实现外部服务访问的方法。在实际应用中,根据业务需求和实际情况来选择不同类型的服务非常重要。同时,我们还介绍了不同方式访问 NodePort 类型服务的方法,以及访问 LoadBalancer 类型服务的方法。希望本文可以帮助读者更好地理解和应用 k8s 中的外部服务访问技术。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c8763968c7c53b0b7dc1f