当前位置: 首页 > 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、电源的多接口扩展坞,让复杂需求变得简洁高效。

相关文章:

使用Service发布应用程序

使用Service发布应用程序 文章目录 使用Service发布应用程序[toc]一、什么是Service二、通过Endpoints理解Service的工作机制1.什么是Endpoints2.创建Service以验证Endpoints 三、Service的负载均衡机制四、Service的服务发现机制五、定义Service六、Service类型七、无头Servic…...

美家市场2025电视版分享码-美家市场电视直播软件分享码免费获取

美家市场2025电视版作为一款备受欢迎的应用市场&#xff0c;为用户提供了海量的电视直播软件&#xff0c;而分享码则是免费获取这些资源的重要途径。与此同时&#xff0c;乐看家桌面也是一款在智能电视领域极具特色的软件&#xff0c;它能与美家市场搭配使用&#xff0c;为用户…...

动手学深度学习:手语视频在NiN模型中的测试

前言 NiN模型是在LeNet的基础上修改&#xff0c;提出了1x1卷积层和全局平均池化层的概念&#xff0c;减少了全连接所带来的参数量很多的问题。本篇在之前代码的基础上添加了模型保存&#xff0c;loss和acc记录以及记录模型时间等功能&#xff0c;所以模型后面的代码会重新记录…...

医院数据中心智能化数据上报与调数机制设计

针对医院数据中心的智能化数据上报与调数机制设计,需兼顾数据安全性、效率性、合规性及智能化能力。以下为系统性设计方案,分为核心模块、技术架构和关键流程三部分: 一、核心模块设计 1. 数据上报模块 子模块功能描述多源接入层对接HIS/LIS/PACS/EMR等异构系统,支持API/E…...

Ubuntu命令速查

当你在Ubuntu系统中需要快速查询常用命令时&#xff0c;可以使用以下速查表&#xff1a; 列出文件和目录&#xff1a; ls切换目录&#xff1a; cd [目录路径]显示当前工作目录的绝对路径&#xff1a; pwd创建新目录&#xff1a; mkdir [目录名]删除文件或目录&#xff1a; rm […...

一次制作参考网杂志的阅读书源的实操经验总结(附书源)

文章目录 一、背景介绍二、书源文件三、详解制作书源&#xff08;一&#xff09;打开Web服务&#xff08;二&#xff09;参考网结构解释&#xff08;三&#xff09;阅读书源 基础&#xff08;四&#xff09;阅读书源 发现&#xff08;五&#xff09;阅读书源 详细&#xff08;六…...

python抓取HTML页面数据+可视化数据分析(投资者数量趋势)

本文所展示的代码是一个完整的数据采集、处理与可视化工具&#xff0c;主要用于从指定网站下载Excel文件&#xff0c;解析其中的数据&#xff0c;并生成投资者数量的趋势图表。以下是代码的主要功能模块及其作用&#xff1a; 1.网页数据获取 使用fetch_html_page函数从目标网…...

下拉框select标签类型

在我们很多页面里有下拉框的选择&#xff0c;这种元素怎么定位呢&#xff1f;下拉框分为两种类型&#xff1a;我们分别针对这两种元素进行定位和操作 select标签 &#xff1a; 通过select类处理。 非select标签 1、针对下拉框元素&#xff0c;如果是Select标签类型&#xff0c;…...

嵌入式C语言位操作的几种常见用法

作为一名老单片机工程师&#xff0c;我承认&#xff0c;当年刚入行的时候&#xff0c;最怕的就是看那些密密麻麻的寄存器定义&#xff0c;以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器&#xff0c;硬件就是不听话”的情况&#xff0c;简直想把示波器砸了&am…...

数据库原理及应用mysql版陈业斌实验四

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表&#xff08;学生表&…...

【免登录ORACLE,jdk8安装包下载】jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe有什么区别

jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe主要有以下区别&#xff1a; 我用夸克网盘分享了「jdk」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/c72666843e2b 适用系统架构&#xff1a; jdk-8u441-windows-i586.exe适用于32位的Windows操作系统&#x…...

Oracle日志系统之附加日志

Oracle日志系统之附加日志 在 Oracle 数据库中&#xff0c;附加日志&#xff08;Supplemental Log&#xff09;是一种增强日志记录的机制&#xff0c;用于在数据库的 redo log 中记录更多的变更信息&#xff0c;尤其是在进行数据迁移、复制和同步等任务时&#xff0c;能够确保…...

从零到一:管理系统设计新手如何快速上手?

管理系统设计是一项复杂而富有挑战性的任务&#xff0c;它要求设计者具备多方面的知识和技能&#xff0c;包括需求分析、架构设计、数据管理、用户界面设计等。对于初次接触这一领域的新手而言&#xff0c;如何快速上手并成为一名合格的管理系统设计者呢&#xff1f;本文将从管…...

Web 前端包管理工具深度解析:npm、yarn、pnpm 全面对比与实战建议

引言: 在现代web前端开发中,包管理工具的重要性不言而喻,无论是构建项目脚手架,安装ui库,管理依赖版本,还是实现monorepo项目结构,一个高效稳定的包管理工具都会大幅提升开发体验和协作效率 作为一名前端工程师,深入了解这些工具背后的机制与差异,对于提升项目可维护性和团队…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(六)

一、具有多示例抗别名示例访问权限的 UAV Direct3D 11 允许光栅化到无序访问视图&#xff0c; (UAV) 没有呈现目标视图 (RTV) /DSV 绑定。 即使 UAV 可以具有任意大小&#xff0c;实现也可以使用视区/剪刀矩形的像素尺寸来操作光栅器。 DirectX 11 硬件的示例模式仅为单个示例…...

Jenkins 多分支流水线: 如何创建用于 Jenkins 状态检查的 GitHub 应用

使用 Jenkins 多分支流水线时&#xff0c;您可以将状态检查与 GitHub 拉取请求集成。 以下是状态检查的示例 要实现这些类型的状态检查&#xff0c;您需要创建一个与 Jenkins 主实例集成的 GitHub 应用。 在本博客中&#xff0c;我们将介绍如何创建一个 GitHub 应用&#xff…...

LeeCode912. 排序数组

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2…...

Maven 简介(图文)

Maven 简介 Maven 是一个Java 项目管理和构建的工具。可以定义项目结构、项目依赖&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是Java 项目不可缺少的工具。 Maven 的作用 提供标准化的项目结构&#xff1a;以前不同的开发工具创建的项目结构是不一样的&#xf…...

深入规划 Elasticsearch 索引:策略与实践

一、Elasticsearch 索引概述 &#xff08;一&#xff09;索引基本概念 Elasticsearch 是一个分布式、高性能的全文搜索引擎&#xff0c;其核心概念之一便是索引。索引本质上是一个存储文档的逻辑容器&#xff0c;它使得数据能够在高效的检索机制下被查询到。当我们对文档进行…...

基于X86/RK/全志+FPGA+AI工业一体机在电力接地系统中的应用方案

随着电力技术的发展和需求增加&#xff0c;智能电网建设受到全球关注。电力五防系统建设是确保我国电力安全的核心任务&#xff0c;接地管理系统是其中的关键部分&#xff0c;对电力系统的安全、稳定和高效运行至关重要。工业一体机&#xff0c;凭借其卓越的性能、稳定性和环境…...

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey https://arxiv.org/pdf/2407.18369 https://www.doubao.com/chat/3262156521106434 速览 研究动机&#x…...

JVM对象创建全过程

JVM对象创建全过程深度解析 1. 对象创建的整体流程 JVM创建对象的过程可以分为7个关键步骤&#xff0c;从类检查到内存分配&#xff0c;再到对象初始化&#xff1a; 类加载检查 → 内存分配 → 内存空间初始化 → 对象头设置 → 构造函数执行 → 栈帧引用建立 → 对象使用2.…...

ubuntu 22.04 使用ssh-keygen创建ssh互信账户

现有两台ubuntu 22.04服务器&#xff0c;ip分别为192.168.66.88和192.168.88.66。需要将两台服务器创建新用户并将新用户做互信。 创建账户 adduser user1 # 如果此用户不想使用密码&#xff0c;直接一直回车就行&#xff0c;创建的用户是没法使用用户密码进行登陆的 su - …...

蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)

1.背景 蓝牙这个系列已经很久很久没有更新了&#xff0c;感慨良多。 现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题&#xff0c;想了一些办法&#xff0c;一一克服了&#xff0c;看看对其他做蓝牙的同学有没有启发。 同时也安利一个叫做HACKRF的设备…...

从零构建 Vue3 登录页:结合 Vant 组件与 Axios 实现完整登录功能

在 Web 开发的世界里&#xff0c;登录页是用户与应用交互的第一道门槛&#xff0c;它的体验好坏直接影响着用户对整个应用的印象。本文将详细记录如何使用 Vue3、Vant 组件库和 Axios 构建一个兼具美观与实用的登录页面&#xff0c;并实现完整的登录逻辑与数据验证&#xff0c;…...

AutoSAR从概念到实践系列之MCAL篇(一)——MCAL架构及其模块详解

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 老规矩,…...

多线程编程的简单案例——单例模式[多线程编程篇(3)]

目录 前言 1.wati() 和 notify() wait() 和 notify() 的产生原因 如何使用wait()和notify()? 案例一:单例模式 饿汉式写法: 懒汉式写法 对于它的优化 再次优化 结尾 前言 如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_eclipse查看线程-CSDN博客 浅谈Thread类…...

万物互联时代,AWS IoT Core如何构建企业级物联网中枢平台?

在智能制造、智慧城市、车联网等场景爆发的今天&#xff0c;全球物联网设备数量已突破150亿台。企业如何高效管理海量设备并挖掘数据价值&#xff1f;AWS IoT Core作为亚马逊云科技推出的全托管物联网平台&#xff0c;正在为数千家企业提供设备连接、数据采集、实时分析的一站式…...

论文阅读:2023 arxiv Safe RLHF: Safe Reinforcement Learning from Human Feedback

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe-rlhf 速览 研究动机&#xff…...

链表相关算法题

小细节 初始化问题 我们这样子new一个ListNode 它里面的默认值是0&#xff0c;所以我们不能这样 如果我们为空&#xff0c;我们要返回null 节点结束条件判断&#xff08;多创建节点问题&#xff09; 参考示例3217 解析&#xff1a; 我的答案是多了一个无用节点 这是因为我每…...

招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!

近日&#xff0c;“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布&#xff0c;原点安全申报的《招商信诺&#xff1a;数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…...

实战篇|多总线网关搭建与量产验证(5000 字深度指南)

引言 1. 环境准备与硬件选型 1.1 项目需求分析 1.2 SoC 与开发板选型 1.3 物理接口与 PCB 设计 1.4 电源与供电保护 2. 软件架构与协议栈移植 2.1 分层架构详解 2.2 协议栈移植步骤 2.3 高可用驱动设计 2.4 映射逻辑与 API 定义 3. 开发流程与实践 3.1 敏捷迭代与里程碑 3.2 核…...

Jenkins 简易使用记录

一、Jenkins 核心功能与适用场景 核心功能&#xff1a; 持续集成&#xff08;CI&#xff09;&#xff1a;自动构建代码、运行单元测试。持续交付&#xff08;CD&#xff09;&#xff1a;自动化部署到测试/生产环境。任务调度&#xff1a;定时执行任务&#xff08;如备份、清理&…...

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…...

启动vite项目报Unexpected “\x88“ in JSON

启动vite项目报Unexpected “\x88” in JSON 通常是文件被防火墙加密需要寻找运维解决 重启重装npm install...

Jenkins 多分支管道

如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线&#xff0c;本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。 Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一&#xff0c;因为它完全基于 git&#xff08;源代…...

PHP腾讯云人脸核身获取NONCE ticket

参考腾讯云官方文档&#xff1a; 人脸核身 获取 NONCE ticket_腾讯云 前提条件&#xff0c;已经成功获取了access token。 获取参考文档&#xff1a; PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getTxFaceNonceTicket($uid) {$access_token file_get_c…...

云计算(Cloud Computing)概述——从AWS开始

李升伟 编译 无需正式介绍亚马逊网络服务&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;。作为行业领先的云服务提供商&#xff0c;AWS为全球开发者提供了超过170项随时可用的服务。 例如&#xff0c;Adobe能够独立于IT团队开发和更新软件。通过AWS的服务&…...

51单片机实验五:A/D和D/A转换

一、实验环境与实验器材 环境&#xff1a;Keli&#xff0c;STC-ISP烧写软件,Proteus. 器材&#xff1a;TX-1C单片机&#xff08;STC89C52RC&#xff09;、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念&#xff1a;模数转换是将连续的模拟信号转换为离散的数字信…...

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论&#xff1a;从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…...

MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构

MCP协议在纳米材料领域的深度应用&#xff1a;从跨尺度协同到智能研发范式重构 文章目录 MCP协议在纳米材料领域的深度应用&#xff1a;从跨尺度协同到智能研发范式重构一、MCP协议的技术演进与纳米材料研究的适配性分析1.1 MCP协议的核心架构升级1.2 纳米材料研发的核心挑战与…...

.NET Core 服务实现监控可观测性最佳实践

.NET Core 概述 .Net Core 是一个开源的、跨平台的高性能框架&#xff0c;由微软开发并维护&#xff0c;现由 .NET Foundation 提供支持。它用于构建现代化、可扩展的云端和本地应用程序&#xff0c;支持开发 Web 应用、微服务、API、物联网应用以及移动后端服务&#xff0c;是…...

ios精灵脚本辅助软件,有根和无根roothide越狱区别

最新版本的ios按键精灵app 支持到15-16系统&#xff0c;可以在半越狱环境下和无根越狱环境安装&#xff0c;对于很多用户一直不理解有根和无根之间的差别&#xff0c;今天简单介绍下 最高权限和部分权限的区别 1、有根越狱 – 有系统根目录读写权限&#xff08;通过越狱软件可…...

ChatGPT-o3辅助学术大纲效果如何?

目录 1 引言 2 背景综述 2.1 自动驾驶雷达感知 2.2 生成模型演进&#xff1a;从 GAN 到 Diffusion 3 相关工作 3.1 雷达点云增强与超分辨率 3.2 扩散模型在数据增广中的应用 4 方法论 4.1 问题定义与总览 4.2 数据预处理与雷达→体素表示 4.3 潜在体素扩散网络&…...

PyCharm 2024.3.5 状态栏添加前进后退按钮

操作路径&#xff1a;Appearance & Behavior -> Menu and Toolbars -> Main Toolbar -> Left -> Add… 按钮位置&#xff1a;Main Menu -> Navigate -> OK 最终效果...

【CPP】死锁产生、排查、避免

一、死锁产生 死锁是指两个或多个线程互相等待对方释放资源&#xff0c;导致程序无法继续执行的现象。在多线程编程中&#xff0c;死锁是一种常见且严重的并发问题。死锁产生必须要四个条件同时满足才会发生&#xff1a; 互斥条件&#xff1a;某些资源只能由一个线程占用。占…...

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;几乎维系着整个安卓程序运行的生命周期&#xff0c;但是这么重要的一个东西&#xff0c;我们真的了解它吗&#xff1f;下面跟随着我的脚步&#xff0c;慢慢揭开Hanler的神秘面纱吧&#xff01; 本文将介绍Handler 的运…...

Git 进阶之路:高效协作之分支管理

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Git 企业级应用 目录 一&#xff1a;&#x1f525; 分⽀管理 &#x1f98b; 理解分⽀&#x1f98b; 创建分⽀&#x1f98b; 切换分⽀&#x1f98b; 合并分⽀&#x1f98b; 删除分⽀&#x1f98b; 合…...

LeetCode 2364.统计坏数对的数目:反向统计

【LetMeFly】2364.统计坏数对的数目&#xff1a;反向统计 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-bad-pairs/ 给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] &#xff0c;那么我们称 (i, j) 是一个 坏…...

6.Rust+Axum:打造高效 WebSocket 实时通信聊天室

摘要 本文详细介绍 RustAxum 在 WebSocket 实时通信开发中的应用&#xff0c;包括双向通信、状态管理等&#xff0c;实践构建聊天室应用。 一、引言 在当今的 Web 应用开发中&#xff0c;实时通信变得越来越重要。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议&…...