深入kubernetes掌握核心概念--Service

一、概念

Service主要用于提供网络服务,通过Service的定义,能够为客户端
应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽
后端Endpoint的变化,它是Kubernetes实现微服务的核心资源。

本章对Service的概念、负载均衡机制、多端口号、外部服务、暴露到集群外、
支持的网络协议、服务发现机制、Headless Service、端点分片和服务拓
扑等内容进行认识学习。

简单来说,这篇文章重点讲负载均衡在service中的实现

二、什么是service?

Service 是一种抽象概念,用于定义一组 Pod 的访问入口。它就像一个虚拟的代理,将来自外部的请求转发到后端 Pod 的集合中。

再理解一遍:Service是一个抽象层,它定义了一种访问和暴露一组运行在Pods中的应用的方法。Service能够提供负载均衡和服务发现,让客户端无需关心后端Pod的复杂性。

三、Service 的核心功能

服务发现与负载均衡

  • Kubernetes Service 为一组具有相同标签(label)的 Pod 提供了一个稳定的网络入口点。通过定义 Service,Kubernetes 会在集群内部为 Service 分配一个固定的 ClusterIP,客户端只需通过这个 IP 地址就可以访问到背后的所有 Pod。
  • Service 提供了一种抽象层,可以实现负载均衡,将客户端请求均匀地分布到后端关联的多个 Pod 上,从而提高系统的可靠性和性能。

服务抽象

  • Service 将一组具有相同功能的 Pod 抽象成一个单一的服务实体,隐藏了底层的 Pod 实例变化,如 Pod 的创建、销毁、扩容、缩容等操作都不会影响客户端对服务的访问。
    网络代理:

  • Kubernetes 通过 iptables 规则或者 kube-proxy 组件实现代理功能,透明地将到达 Service ClusterIP 的流量转发到后端的 Pod 上。

多类型暴露

  • Kubernetes Service 支持多种类型的暴露方式,如 ClusterIP(仅集群内部访问)、NodePort(通过节点端口暴露到集群外部)、LoadBalancer(借助云提供商的负载均衡器暴露到公网)以及 ExternalName(将 Service 映射到外部 DNS 名称)。

健康检查与自动摘除

  • 当 Service 与 Endpoint Controller 结合使用时,能够自动跟踪后端 Pod 的健康状态,并将不健康的 Pod 从服务负载均衡列表中移除,直到其恢复正常。
    Session Affinity(会话保持):

  • 对于部分需要会话一致性的应用,Service 支持客户端 IP 会话保持,确保来自同一客户端的请求始终路由到相同的后端 Pod。

DNS 解析

  • Kubernetes 为每个 Service 自动生成 DNS 记录,使得集群内部的其他 Pod 或 Service 可以通过域名而非 IP 地址来访问它。

四、Service 类型

Kubernetes 提供了四种类型的 Service:

ClusterIP: 默认的服务类型,将 Service 暴露在集群内部,只能在集群内部访问。
NodePort: 将 Service 暴露在所有节点的指定端口上,可以通过节点 IP 地址访问。
LoadBalancer: 创建一个外部负载均衡器,将 Service 暴露到外部网络。
ExternalName: 将 Service 映射到外部 DNS 名称上,无需创建负载均衡器。

Service 类型 特性 示例 应用场景
ClusterIP - 默认类型
- 只能在集群内部访问
- Kubernetes 分配一个唯一的集群内部 IP 地址
type: ClusterIP - 内部服务间通信
- 不需要外部访问的中间件或后台服务
NodePort - 在每个节点上打开一个静态端口
- 可通过 <NodeIP>:<NodePort> 从集群外部访问
type: NodePort
spec.ports[0].nodePort: 30080
- 开发和测试环境下的简单外部访问
- 不需要复杂负载均衡配置的小规模应用
LoadBalancer - 创建一个外部负载均衡器(如 AWS ELB、GCP Load Balancer)
- 自动分配公网 IP 地址
- 负载均衡到后端 Pods
type: LoadBalancer
spec.loadBalancerIP: X.X.X.X(可选固定公网 IP)
- 需要公开访问的生产环境应用
- 高可用和负载均衡要求较高的大规模服务
ExternalName - 不创建任何代理或端口映射
- 服务名解析为指定的外部 DNS 名称
type: ExternalName
spec.externalName: some.externaldns.name
- 与集群外部服务集成
- 使用外部服务作为内部服务的一部分

示例代码:

  1. ClusterIP 示例:
apiVersion: v1
kind: Service
metadata:
  name: internal-service
spec:
  type: ClusterIP
  selector:
    app: MyApp
  ports:
  - name: http
    port: 80
    targetPort: 8080
  1. NodePort 示例:
apiVersion: v1
kind: Ser
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达分奇先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值