K8S 基础 - Service 的作用

文摘   2025-01-09 16:34   安徽  

Service 的基本定义

Service 是 Kubernetes 中用于定义 Pod 网络访问接口的资源。它允许你以一种稳定的方式访问一组 Pod,而无需关心这些 Pod 的具体位置和数量的变化。Service 提供了一个固定的网络接口,使得对 Pod 的访问更加可靠和灵活。

Service 的主要作用

  • 稳定访问:Service 为一组 Pod 提供一个稳定的 IP 地址和端口,即使 Pod 的数量和 IP 地址发生变化,Service 的访问地址保持不变。

  • 负载均衡:Service 可以将进入的流量均匀地分发到后端的 Pod 上,实现负载均衡,提高应用的可用性和扩展性。

  • 服务发现:Service 为应用提供了服务发现机制,使得应用之间可以通过 DNS 名称或 IP 地址相互访问。

  • 跨命名空间访问:Service 可以将不同命名空间中的 Pod 组合成一个逻辑服务,实现跨命名空间的访问。

  • 使用网络策略:通过配置 Service 的网络策略,可以限制访问 Service 的客户端的 IP 范围或来源等条件,增强安全性。

Service 的类型

  • ClusterIP:默认类型,只在集群内部可用,用于集群内部的通信。

  • NodePort:在每个节点上开放一个端口,允许外部访问集群内的服务。

  • LoadBalancer:在云平台上创建一个负载均衡器,提供一个外部可访问的 IP 地址。

  • ExternalName:通过 CNAME 记录将服务映射到外部服务的地址,通常用于访问集群外部的服务。

类型使用场景访问范围特点
ClusterIP集群内部通信、内部负载均衡集群内部自动分配虚拟 IP,仅在集群内部可用,简单高效
NodePort小型集群、测试环境、简单外部访问集群外部在每个节点上开放端口,外部通过 <NodeIP>:<NodePort> 访问
LoadBalancer生产环境、复杂外部访问需求集群外部自动创建负载均衡器和外部 IP,高可用性和可扩展性
ExternalName访问外部服务、服务发现集群内部将外部服务映射为 DNS 名称,不与 Pod 通信,简化服务发现

Service 的 YAML 字段解析

以下是一个典型的 Service YAML 配置文件的结构及其字段解析:

type: ClusterIP 类型的 Service (所有类型都可以)也可以通过服务的主机名(DNS 名称)在集群内部进行访问。Kubernetes 会为每个 Service 自动创建一个 DNS 名称,通常格式为 ..svc.cluster.local。你可以通过这个 DNS 名称来访问 Service,而不需要知道其具体的 IP 地址。

以上的service在集群内部的主机名则是:

my-service.default.svc.cluster.local

在上一节的 Pod 部分中,我们编写并部署了一个 Nginx Pod,并通过端口转发的方式进行了访问。

kubectl port-forward pod/nginx-pod 8080:80

这种方法仅适用于临时或测试场景,因为它依赖于特定的端口和 Pod 的 IP 地址,不利于长期的生产环境使用。接下来,我们可以创建一个 type: NodePort 的 Service,这样就可以通过集群中任意节点的 IP 地址和指定的端口来访问我们的服务。

访问的方式如下:

http://k8s-node1:30007

如果不指定nodePort: 30007的具体端口号,则会在范围内自动随机一个端口。我们可以使用下面的命令来查看Service的端口和对应的Pod。

kubectl get service -n default

对于 LoadBalancer 和 ExternalName 类型的 Service 本篇文章暂时不适合深入,当遇到合适的场景后才会补充这部分内容。

欢迎大家关注我的公众号,将会为大家推荐更优质的内容!

青檬小栈
科长技术小栈,分享各种技术文章和教程集合。欢迎大家的关注!
 最新文章