当前位置: 首页 > news >正文

使用Service发布应用程序

使用Service发布应用程序

文章目录

  • 使用Service发布应用程序
    • @[toc]
    • 一、什么是Service
    • 二、通过Endpoints理解Service的工作机制
      • 1.什么是Endpoints
      • 2.创建Service以验证Endpoints
    • 三、Service的负载均衡机制
    • 四、Service的服务发现机制
    • 五、定义Service
    • 六、Service类型
    • 七、无头Service
    • 八、多端口Service

一、什么是Service

Kubernetes 中的 Service 就像一个智能的“服务导航员”,它帮助用户和其他服务找到并访问一组动态变化的 Pod(容器组)。


  1. 为什么需要 Service?

想象你有一个餐厅,后厨有多个厨师(Pod)在做菜,但厨师可能随时请假或换班(Pod 被销毁或新建)。如果顾客每次都要记住每个厨师的名字和位置(Pod 的 IP 地址),那会非常麻烦。
Service 的作用就是充当餐厅的“前台”,顾客只需要找前台(Service)点餐,前台会自动分配顾客到可用的厨师那里,无论厨师怎么变动,顾客的体验始终流畅。


  1. Service 的核心功能
  • 稳定访问点:Service 会分配一个固定的“虚拟 IP”(ClusterIP),用户只需记住这个 IP 和端口,无需关心背后 Pod 的变化。
  • 负载均衡:如果后台有多个 Pod(比如 3 个处理请求的服务器),Service 会自动将流量平均分配给它们,避免某个 Pod 过载。
  • 动态感知:当 Pod 因故障重启或扩容时,Service 能自动更新后端列表,确保流量只发给健康的 Pod。

  1. Service 的工作原理
  • 标签匹配:创建 Service 时,你需要指定一个“标签选择器”(比如 app: nginx),Service 会自动找到所有带有这个标签的 Pod。
  • Endpoints 列表:Service 背后有一个动态更新的列表(Endpoints),记录所有符合条件的 Pod 的 IP 和端口。Pod 变化时,列表自动更新。
  • 流量转发:每个节点上的 kube-proxy 组件会监听 Service 的变化,并通过 iptables 或 IPVS 规则将流量从 Service 的虚拟 IP 转发到实际 Pod。

  1. Service 的常见类型
  • ClusterIP(默认):只能在集群内部访问,适合内部服务之间的通信(比如前端调用后端 API)。
  • NodePort:在每个节点上开一个固定端口(如 30080),外部用户通过 节点IP:端口 访问服务。
  • LoadBalancer:在云平台(如 AWS)自动创建负载均衡器,外部流量通过这个均衡器访问服务。
  • ExternalName:将 Service 映射到一个外部域名(如数据库服务),让集群内部像访问本地服务一样访问外部资源。

  1. 举个实际例子

假设你运行了 3 个 Nginx 容器(Pod),它们的 IP 可能随时变化。创建一个 ClusterIP 类型的 Service 后:

  1. Service 会分配一个固定 IP(如 10.96.148.206)。
  2. 用户访问 10.96.148.206:80,Service 自动将请求轮询转发到 3 个 Nginx Pod。
  3. 即使某个 Pod 崩溃,Service 会剔除它,并将流量导向剩余的健康 Pod。

Service 是 Kubernetes 中解决服务发现、负载均衡和稳定访问的核心机制。它像一座桥梁,连接了动态变化的 Pod 和需要稳定访问的用户或服务,让整个系统更健壮、更易管理。


二、通过Endpoints理解Service的工作机制

1.什么是Endpoints

Kubernetes 中的 Endpoints 可以理解为 Service 的“实时通讯录”,它动态记录了哪些 Pod 是真正在干活的后端实例,以及它们的具体位置(IP 和端口)。用生活中的例子来比喻:


  1. Endpoints 是什么?

想象你有一家快递公司(Service),客户打电话下单时,客服(Service)需要知道当前有哪些快递员(Pod)在值班,才能分配订单。
Endpoints 就是这个快递公司的“值班表”,实时记录所有在岗快递员的姓名、位置和联系方式(Pod 的 IP 和端口)。即使快递员轮班、请假或新增人手(Pod 扩缩容),值班表都会自动更新,确保客服永远知道该联系谁。


  1. Endpoints 的作用
  • 动态更新:当 Pod 被创建、销毁或故障时,Endpoints 会自动刷新列表,确保 Service 只将流量转发到健康的 Pod。
  • 负载均衡基础:Service 根据 Endpoints 中的列表,将请求平均分配给多个 Pod(比如轮询),避免某个 Pod 过载。
  • 服务发现:其他服务只需访问 Service 的固定地址(如 my-service:80),无需关心背后具体是哪些 Pod 在工作,Endpoints 会默默完成地址翻译。

  1. 举个具体例子

假设你运行了 3 个 Nginx 服务器(Pod),它们的 IP 可能是临时的。创建一个 Service 后:

  1. Endpoints 自动生成:Kubernetes 会生成一个与 Service 同名的 Endpoints,记录这 3 个 Pod 的 IP 和端口(如 10.1.2.3:80)。
  2. 流量分配:当用户访问 Service 时,请求会被转发到 Endpoints 列表中的任意一个 Pod。如果某个 Pod 崩溃,Endpoints 会立刻剔除它,确保用户不受影响。

  1. 手动管理的特殊场景

大多数情况下 Endpoints 是自动管理的,但有时需要手动维护:

  • 连接外部服务:比如使用非 Kubernetes 管理的数据库,可以手动创建一个 Endpoints,指定数据库的 IP 和端口,让 Service 像管理内部 Pod 一样代理外部服务。

Endpoints 是 Kubernetes 中默默支撑 Service 的“幕后英雄”。它像一张实时更新的地图,确保 Service 总能找到正确的 Pod,让整个系统在动态变化中保持稳定和高效。

2.创建Service以验证Endpoints

(1)编辑YAML文件

[root@master ~]# vi nginx-deploy.yaml 
[root@master ~]# cat nginx-deploy.yaml 
apiVersion: apps/v1                # 版本号
kind: Deployment                    # 类型为Deployment
metadata:                            # 元数据name: nginx-deploy          labels:                             # 标签app: nginx-deploy
spec:                                 # 详细信息replicas: 2                        # 副本数量selector:                          # 选择器,指定该控制器管理哪些PodmatchLabels:                     # 匹配规则app: nginx-podtemplate:                          # 定义模板,当副本数量不足时会根据模板定义创建Pod副本metadata:labels:app: nginx-pod               # Pod的标签spec:containers:                     # 容器列表(本例仅定义一个容器)- name: nginx                   # 容器的名称image: nginx:1.14.2          # 容器所用的镜像ports:- name: nginx-portcontainerPort: 80         # 容器需要暴露的端口
[root@master ~]# 

containerPort是Pod内部容器的端口,仅起到标记作用,并不能改变容器本身的端口,可以省略。

(2)基于配置文件创建Deployment

[root@master ~]# kubectl apply -f nginx-deploy.yaml 
deployment.apps/nginx-deploy created

(3)查看每个pod的IP

[root@master ~]# kubectl get pod -l app=nginx-pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-59c566bbbb-nbdrn   1/1     Running   0          17s   10.244.104.55    node2   <none>           <none>
nginx-deploy-59c566bbbb-tq9ts   1/1     Running   0          17s   10.244.166.131   node1   <none>           <none>

(4)测试pod的访问

[root@master ~]# curl 10.244.166.131
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

结果表示可正常访问

(5)创建service文件发布该应用程序

[root@master ~]# vim nginx-service.yaml
[root@master ~]# cat nginx-service.yaml 
apiVersion: v1
kind: Service
metadata:name: nginx-svc              # 为Service对象命名
spec:selector:app: nginx-pod             #指定Pod的标签ports:- port: 8080                 # Service绑定的端口targetPort: 80             # 目标Pod的端口

这里标签选择器设置的标签名称需要和Deployment中Pod模板中的标签名称保持一致才能匹配。

(6)创建service

[root@master ~]# kubectl apply -f nginx-service.yaml 
service/nginx-svc created

(7)查看该service的ClusterIP地址和绑定端口

[root@master ~]# kubectl get service nginx-svc
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
nginx-svc   ClusterIP   10.111.142.214   <none>        8080/TCP   18s

ClusterIP地址就是集群的IP地址,由K8S管理和分配给Service的虚拟IP地址。只能在集群内部访问,既不会分配给Pod,也不会分配给节点主机,不具备网络通信能力,无法被ping通,因为没有一个实体网络对象会相应它。

(8)测试通过集群IP地址和service端口访问后端Pod承载的应用程序

[root@master ~]# curl 10.111.142.214:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

(9)查看service详细信息

[root@master ~]# kubectl describe service nginx-svc
Name:              nginx-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.111.142.214		# ClusterIP地址
IPs:               10.111.142.214
Port:              <unset>  8080/TCP	# Service端口
TargetPort:        80/TCP
Endpoints:         10.244.104.55:80,10.244.166.131:80
Session Affinity:  None
Events:            <none>

Service生成的Endpoints是一组由后端Pod的IP地址和容器端口组成的端点集合。

(10)进一步查看Endpoints的列表

[root@master ~]# kubectl get endpoints
NAME         ENDPOINTS                            AGE
kubernetes   192.168.10.30:6443                   26d
nginx-svc    10.244.104.55:80,10.244.166.131:80   6m18s

K8S自动创建与service同名的Endpoints

接下来考察pod副本的变更对Endpoints的影响

(11)扩容deployment副本数至3

[root@master ~]# kubectl scale deployment nginx-deploy --replicas=3
deployment.apps/nginx-deploy scaled

(12)再次查看service详细信息,可以发现ClusterIP和端口没有改变,新增加的pod副本的IP地址自动加入Endpoints中,目前为3个pod

[root@master ~]# kubectl describe service nginx-svc
Name:              nginx-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.111.142.214
IPs:               10.111.142.214
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.104.55:80,10.244.104.56:80,10.244.166.131:80
Session Affinity:  None
Events:            <none>

(13)将pod副本减少到1,查看service详细信息,可以发现被终止的pod副本自动从Endpoints中移除

[root@master ~]# kubectl scale deployment nginx-deploy --replicas=1
deployment.apps/nginx-deploy scaled
[root@master ~]# kubectl describe service nginx-svc
Name:              nginx-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.111.142.214
IPs:               10.111.142.214
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.166.131:80
Session Affinity:  None
Events:            <none>

(14)依次删除service和deployment

[root@master ~]# kubectl delete -f nginx-service.yaml 
service "nginx-svc" deleted
[root@master ~]# kubectl delete -f nginx-deploy.yaml 
deployment.apps "nginx-deploy" deleted

简单的Service也可以使用kubectl expose命令创建,本例基于配置文件创建Service的等价命令为kubectl expose deploy nginx-deploy --port=8080 --target-port=80 --name=nginx-svc。也可以将Deployment配置文件与Service配置文件合并为一个多文档的YAML配置文件,基于该配置文件一次性创建Deployment和Service。


三、Service的负载均衡机制

Kubernetes 中的 Service 负载均衡机制,可以想象成一个“智能调度中心”,它负责将用户请求合理分配给后端的多个 Pod(容器实例),确保流量均匀分发且不遗漏任何一个实例。


  1. Service 的核心作用

Service 是 Kubernetes 的“流量调度员”,它通过以下方式实现负载均衡:

  • 稳定入口:为动态变化的 Pod 提供一个固定的虚拟 IP(ClusterIP)或外部访问地址(如 NodePort、LoadBalancer),用户无需关心 Pod 的具体位置。
  • 动态感知:通过标签(Label)自动筛选出符合条件的 Pod,并实时更新这些 Pod 的地址列表(Endpoints)。
  • 流量分发:将请求按规则(如轮询、随机)转发到健康的 Pod,避免某些 Pod 过载。

  1. 负载均衡的实现过程

(1)匹配 Pod:标签选择器

Service 通过标签(例如 app: nginx)找到所有对应的 Pod,就像快递公司通过“区域编号”筛选出所有负责某片区域的快递员。

(2)维护实时列表:Endpoints

Service 背后有一个动态更新的“值班表”(Endpoints),记录所有可用 Pod 的 IP 和端口。当 Pod 发生扩缩容或故障时,列表自动更新,确保流量只发给健康的实例。

(3)转发规则:kube-proxy 的作用

每个节点上的 kube-proxy 组件是实际的“调度员”:

  • 监听变化:实时监控 Service 和 Pod 的状态变化。

  • 设置规则

    :通过 iptables 或 IPVS(高效的内核级负载均衡工具)创建转发规则。例如:

    • 轮询:依次将请求分给每个 Pod,像轮流给快递员分配订单。
    • 随机:随机选一个 Pod 处理请求,避免顺序固定导致负载不均。
    • 最少连接:优先选择当前任务最少的 Pod,类似给最闲的快递员派单。

  1. 不同 Service 类型的负载均衡
  • ClusterIP(内部访问):默认类型,通过虚拟 IP 在集群内部转发流量,适合微服务间的通信。
  • NodePort(外部访问):在每个节点上开一个固定端口(如 30080),外部用户通过节点 IP 和端口访问,流量最终由 Service 分发给 Pod。
  • LoadBalancer(云环境):自动调用云平台(如 AWS、阿里云)的负载均衡器,将外部流量均匀分发到集群内的 Pod。

  1. 举个生活例子

假设你开了一家网红奶茶店,有 3 台奶茶机(Pod)制作饮品:

  1. Service 的作用:顾客只需记住店铺地址(Service 的 ClusterIP),不用知道每台奶茶机的位置。
  2. 负载均衡:前台(kube-proxy)根据订单量,轮流将顾客请求分给不同的奶茶机。如果某台机器坏了,前台自动跳过它,确保其他机器继续工作。
  3. 动态扩展:高峰期新增 2 台奶茶机,前台立即将它们加入“可用列表”,顾客无感知。

Service 的负载均衡机制就像一个“智能调度系统”,通过动态感知 Pod、维护实时列表、按规则分发请求,确保流量高效、稳定地分配到后端实例。无论是内部微服务还是外部用户请求,Service 都能灵活应对动态变化。


四、Service的服务发现机制

Kubernetes 中的 Service 服务发现机制就像一个“智能电话簿”,它帮助应用程序在动态变化的集群环境中快速找到其他服务的位置,无需手动记录或更新地址


  1. 为什么需要服务发现?

想象你住在一个小区里,邻居们经常搬家(Pod 动态扩缩容)。如果每次想找邻居借东西,都要挨家挨户敲门询问地址(Pod 的 IP),效率会很低。
服务发现的作用就是自动维护一个“邻居通讯录”(Service),你只需记住邻居的名字(服务名称),就能随时找到他们的最新住址(Pod 的 IP)。


  1. 服务发现的核心机制

(1)静态“电话簿”:环境变量

当一个新的住户(Pod)搬进小区时,物业(Kubernetes)会给他一本“通讯录”(环境变量),里面记录了所有邻居(Service)的固定电话(ClusterIP)和门牌号(端口)。例如:

MY_SERVICE_SERVICE_HOST=10.96.148.206
MY_SERVICE_SERVICE_PORT=80

这本通讯录的问题是:如果邻居搬家(Pod 重启或更换),电话簿不会自动更新,只能重新找物业要一本(重启 Pod)。

(2)动态“查询系统”:DNS 解析

Kubernetes 还提供了一个“智能查询热线”(DNS)。你只需记住邻居的名字(服务名称),比如 my-service.default.svc.cluster.local,拨通这条热线(发起 DNS 查询),它会告诉你邻居的最新电话(Service 的 ClusterIP)和门牌号(端口)。
即使邻居频繁搬家,热线总能提供最新地址。例如,curl my-service:80 就能访问后端 Pod。

(3)自动维护的“值班表”:Endpoints

Service 背后有一个“实时值班表”(Endpoints),记录所有当前在岗的邻居(健康 Pod)的地址和联系方式(IP:端口)。当邻居请假(Pod 下线)或新邻居加入(扩容 Pod),值班表会自动更新。Service 通过这张表确保请求只会发给在岗的邻居。

(4)精准匹配的“标签系统”

每个邻居(Pod)都会在门口贴标签(如 app=nginx),Service 像一个“管家”,负责收集所有符合标签的邻居信息(通过标签选择器筛选 Pod)。例如,只要贴有 app=nginx 标签的 Pod 都能被 Service 发现并加入通讯录。


  1. 服务发现的实际流程

  2. 创建 Service:通过标签选择器(如 app=nginx)关联一组 Pod。

  3. 生成 Endpoints:Kubernetes 自动维护这些 Pod 的地址列表(Endpoints)。

  4. DNS 注册:Service 的名称和 ClusterIP 被注册到集群的 DNS 系统中(如 CoreDNS)。

  5. 流量转发:当请求到达 Service 的 ClusterIP 时,kube-proxy 根据 Endpoints 列表,通过 iptables 或 IPVS 规则将流量转发到具体 Pod。


  1. 特殊场景:无头服务(Headless Service)

如果不需要统一的入口(如数据库集群),可以创建一个“无头服务”(Headless Service)。它会直接返回所有 Pod 的 IP 列表,让调用方自行决定如何访问(比如按需选择主节点)。


Service 的服务发现机制通过 动态维护地址列表(Endpoints)DNS 自动解析标签匹配,解决了集群中服务地址动态变化的问题。它就像一个全能的“社区管家”,让应用程序无需关心后端实例的变化,只需记住服务名称,即可稳定通信。


五、定义Service

apiVersion: v1  			# Kubernetes API 版本
kind: Service   			# 资源类型为 Service
metadata:name: my-service  		# Service 名称
spec:selector:         		# 标签选择器,用于关联 Podapp: my-app     		# 选择具有标签 app=my-app 的 Podports:- protocol: TCP   		# 协议类型(TCP/UDP)port: 80        		# Service 对外暴露的端口targetPort: 9376  	# Pod 实际监听的端口(如容器端口)type: ClusterIP     		# Service 类型(默认为 ClusterIP)

六、Service类型

Kubernetes 的 Service 类型 可以理解为不同的“服务入口模式”,决定了如何让用户或应用访问到后端的 Pod。


  1. ClusterIP(默认类型)

通俗比喻:就像公司内部的“分机电话”,只能在内网使用。

  • 作用:为集群内部提供一个固定的虚拟 IP(VIP),其他服务(如前端调用后端 API)通过这个 IP 访问 Pod。

  • 特点:无法从集群外直接访问,适合内部服务通信。

  • 示例

    type: ClusterIP  # 默认类型,可省略
    

  1. NodePort

通俗比喻:在每栋大楼(节点)上挂一个“统一门牌号”,外人都能通过这个门牌号找到入口。

  • 作用:在每个节点上开放一个固定端口(如 30000-32767),外部用户通过 <节点IP>:<端口> 访问服务。

  • 特点:可从集群外访问,适合开发测试或简单的外部访问需求。

  • 示例

    type: NodePort
    ports:- nodePort: 31000  # 手动指定端口(可选)
    

  1. LoadBalancer

通俗比喻:雇佣一个“云平台快递员”,自动把外部流量分发到多个节点。

  • 作用:在云平台(如 AWS、阿里云)自动创建负载均衡器,将外部流量均匀分发到集群内的 Pod。

  • 特点:提供高可用性和扩展性,适合生产环境对外暴露服务。

  • 示例

    type: LoadBalancer
    

  1. ExternalName

通俗比喻:给外部服务贴一个“内部别名”,像通讯录里的快捷方式。

  • 作用:将 Service 映射到外部服务的 DNS 名称(如数据库),集群内部通过 Service 名称访问外部资源。

  • 特点:不代理流量,仅通过 DNS 别名简化访问,适合集成外部服务(如云数据库)。

  • 示例

    type: ExternalName
    externalName: my-database.example.com  # 外部服务地址
    

如何选择类型?

  • 内部通信:用 ClusterIP(默认)。
  • 临时外部访问:用 NodePort(如测试环境)。
  • 生产环境外部访问:用 LoadBalancer(需云平台支持)。
  • 访问外部服务:用 ExternalName(如对接旧系统或数据库)。

Service 类型是 Kubernetes 中控制服务访问范围的“开关”,通过不同模式灵活应对内部通信、外部访问或跨平台集成等需求。

七、无头Service

Kubernetes 中的 无头 Service(Headless Service) 就像一个“没有统一前台”的服务入口,它的设计目的是让客户端绕过负载均衡,直接访问具体的 Pod 实例


  1. 无头 Service 的特点
  • 没有固定 IP:普通 Service 会分配一个虚拟 IP(ClusterIP)作为统一入口,而无头 Service 直接跳过这一步,不分配 ClusterIP,就像快递公司没有总机电话,客户需要直接联系快递员。
  • 直连 Pod:客户端通过 DNS 查询无头 Service 的名称时,会拿到所有关联 Pod 的真实 IP 列表,而不是一个虚拟 IP。这类似于快递公司直接给你所有快递员的联系方式,你可以自行选择联系谁。

  1. 工作原理
  • 动态 DNS 列表:当创建一个无头 Service 时,Kubernetes 会为每个 Pod 生成一条 DNS 记录(例如 web-0.my-service.default.svc.cluster.local),客户端查询服务名称时,会返回所有 Pod 的 IP 地址列表。
  • 无负载均衡:流量不经过 kube-proxy 转发,也没有负载均衡规则,客户端需要自己决定如何分配请求(比如轮询、随机选择 Pod)。

  1. 适用场景
  • 有状态应用:比如数据库集群(如 MySQL、MongoDB),每个 Pod 需要稳定的网络身份,便于其他节点通过固定名称访问主节点或副本。
  • 分布式系统:如分布式缓存(Redis Cluster)、消息队列(Kafka),需要节点间直接通信,而不是通过统一的代理。
  • 调试与测试:直接访问特定 Pod 的 IP 进行问题排查,无需经过中间层。

  1. 如何创建无头 Service

在 YAML 文件中设置 clusterIP: None,并关联 Pod 的标签:

apiVersion: v1
kind: Service
metadata:name: my-headless-service
spec:clusterIP: None  # 关键配置selector:app: my-app    # 关联的 Pod 标签ports:- port: 80targetPort: 8080

此时,查询 my-headless-service 的 DNS 会返回所有匹配 Pod 的 IP(如 10.0.0.1, 10.0.0.2)。


  1. 对比普通 Service
普通 Service无头 Service
有 ClusterIP,统一入口无 ClusterIP,直接暴露 Pod IP
自动负载均衡到 Pod客户端自行处理负载均衡
适用于无状态应用(如 Web 服务)适用于有状态应用(如数据库集群)

无头 Service 是 Kubernetes 中一种“去中心化”的服务发现机制,适合需要直接访问 Pod 或维护稳定网络身份的场景。它通过放弃负载均衡和统一入口,换取了更高的灵活性和对分布式系统的支持。

八、多端口Service

Kubernetes 中的 多端口 Service 就像一个“多功能插座”,允许通过一个服务入口同时暴露多个端口,每个端口对应不同的功能或协议


  1. 为什么需要多端口 Service?

假设你有一个快递柜(Pod),既能收快递(HTTP 端口 80),又能发快递(HTTPS 端口 443),或者还需要监控快递状态(管理端口 8080)。
如果每次新增功能都要单独开一个快递柜(Service),管理会变得复杂。
多端口 Service 的作用就是在一个服务中定义多个端口,统一管理这些不同功能。


  1. 核心机制
  • 多端口定义:在 Service 的配置中,通过 ports 字段定义多个端口,每个端口需有唯一名称(如 httphttps),避免歧义。

  • 端口映射

    :每个端口需指定三个关键参数:

    • port:Service 对外暴露的端口(用户访问的入口)。
    • targetPort:Pod 内实际监听的端口(容器端口)。
    • protocol:协议类型(如 TCP 或 UDP)。

示例配置

apiVersion: v1
kind: Service
metadata:name: web-service
spec:selector:app: webports:- name: http      # 端口名称protocol: TCPport: 80        # 用户访问的端口targetPort: 80  # Pod 实际端口- name: httpsprotocol: TCPport: 443targetPort: 443

  1. 实际应用场景

(1)混合协议服务

  • 例如,一个服务同时处理 HTTP(端口 80)和 WebSocket(端口 8080),通过多端口 Service 统一暴露。

(2)分层功能管理

  • 比如 Web 服务器(端口 80)和监控接口(端口 8080)共用同一组 Pod,但通过不同端口区分功能。

(3)外部访问优化

  • 若使用 NodePort 类型,可为每个端口分配不同的节点端口(如 30001 和 30002),避免单端口过载。

  1. 注意事项
  • 端口命名必须唯一:避免配置冲突(如两个端口都叫 http)。
  • 协议一致性:不同端口可使用不同协议(如 TCP 和 UDP),但需确保后端 Pod 支持。
  • 负载均衡独立:每个端口的流量会独立进行负载均衡,互不影响。

  1. 对比单端口 Service
单端口 Service多端口 Service
一个功能对应一个 Service多个功能共享一个 Service
配置简单,适合单一场景配置稍复杂,适合多功能聚合场景
管理多个 Service 需更多资源统一管理,减少资源开销

多端口 Service 是 Kubernetes 中简化服务管理的利器,通过一个入口支持多种功能,既节省资源又提升灵活性。就像一台支持 USB、HDMI、电源的多接口扩展坞,让复杂需求变得简洁高效。

相关文章:

  • 探索C++中的数据结构:栈(Stack)的奥秘
  • 数据类型相关问题导致的索引失效 | OceanBase SQL 优化实践
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第二模块·语法迁移篇 —— 第六章 函数革命:从过程到方法的重生
  • 决战浏览器渲染:减少重绘(Repaint)与重排(Reflow)的性能优化策略
  • 在服务器上安装redis
  • vLLM V1:性能优化与集群扩展的深度解析
  • 数据结构基本概念
  • k8s低版本1.15安装prometheus+grafana进行Spring boot数据采集
  • test ssl java
  • Java 序列化与反序列化终极解析
  • pointnet pointnet++论文笔记
  • 麒麟操作系统漏洞修复保姆级教程弱(一)算法漏洞修复
  • Vue3 + TypeScript中provide和inject的用法示例
  • 基于ubuntu24.10安装NACOS2.5.1的简介
  • 第18周:对于ResNeXt-50算法的思考
  • 51单片机实验一:点亮led灯
  • 2025妈妈杯Mathorcup数学建模竞赛选题建议+初步分析
  • 路由交换网络专题 | 第五章 | ISIS | RIP | 路由引入 | 策略路由
  • Crawl4AI:重塑大语言模型数据供给的开源革命者
  • Vue Teleport 及其在 SSR 中的潜在问题
  • 如何应对国际贸易形势变化?长三角四省市主要领导密集部署
  • 绝境逆转晋级世界杯四强,王楚钦再爆金句:能抽死我就给你了
  • 辽宁一季度GDP为7606.9亿元,同比增长5.2%
  • 恒大汽车接获港交所复牌指引,还未披露公司2024年年报
  • “珍爱网门店关闭后服务被转线上”续:平台称送一个月服务,当事人坚持退款
  • 市监总局:清理整治各种忽悠人的广告乱象,确保群众放心消费