详细介绍:K8s学习笔记(十一) service

news/2025/10/29 17:28:58/文章来源:https://www.cnblogs.com/yangykaifa/p/19174984

在 Kubernetes 中,Service(服务) 是核心组件之一,它的核心作用是解决 Pod 的 “动态性问题”—— 由于 Pod 会因重启、扩缩容、节点故障等原因重建,其 IP 地址会频繁变化,直接访问 Pod IP 极不稳定。而 Service 通过提供一个固定的访问入口,自动关联后端 Pod 并实现负载均衡,让客户端(如其他 Pod、外部服务)能稳定访问服务。

1 为什么需要 Service?

假设部署了 3 个 Nginx Pod(通过 Deployment 创建,标签app: nginx),用于提供 Web 服务。此时存在两个关键问题:

  1. Pod IP 不稳定:如果某个 Pod 故障重建,新 Pod 的 IP 会变,客户端无法感知这种变化。
  2. 缺乏负载均衡:客户端需要手动分发请求到不同 Pod,无法自动实现流量分摊。

Service 正是为解决这两个问题而生:

  • 提供一个固定的 ClusterIP(集群内 IP)或端口,客户端只需访问这个固定地址。
  • 自动通过标签选择器关联后端 Pod,将请求转发到健康的 Pod,并实现简单的负载均衡(默认轮询)。

2 Service 的核心功能

简单说,Service 就是 Pod 的 “稳定访问层”,核心功能有 3 个:

  1. 固定访问入口:为一组 Pod 提供固定的 IP(ClusterIP)和端口,屏蔽 Pod IP 的动态变化。
  2. 自动负载均衡:将请求分发到后端健康的 Pod(默认轮询策略,部分类型支持会话保持)。
  3. 服务发现:通过 K8s 内置 DNS(如 CoreDNS),让集群内其他 Pod 可通过 “Service 名称” 访问服务(无需记 IP)。

3 Service 的核心属性(必懂)

定义 Service 时,关键是要明确 “关联哪些 Pod”“用什么方式访问”,核心属性如下:

属性名作用示例值
spec.selector标签选择器(核心!用于匹配后端 Pod,Service 只转发请求到带这些标签的 Pod)app: nginx(匹配标签app=nginx的 Pod)
spec.ports端口映射规则(定义 Service 的端口与 Pod 端口的映射关系)见下文详解
spec.typeService 类型(决定访问方式,如集群内访问、外部访问等,核心!)ClusterIP(默认)、NodePort
spec.sessionAffinity会话亲和性(是否将同一客户端的请求转发到同一个 Pod,默认NoneClientIP(按客户端 IP 绑定)

重点:ports端口映射规则

Service 的端口映射是 “客户端访问 Service 的端口”→“Service 转发到 Pod 的端口”,每个端口规则包含 3 个关键参数:

示例:若 Pod 的 Nginx 监听 80 端口,Service 定义port: 8080targetPort: 80,则客户端访问 Service 的 8080 端口,会被转发到 Pod 的 80 端口。

4 Service 的 4 种类型

Service 的类型决定了 “如何访问服务”,不同类型对应不同场景,必须掌握:

4.1 ClusterIP(默认类型):集群内访问

示例:创建 ClusterIP 类型的 Service

先部署 3 个 Nginx Pod(通过 Deployment):

# deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3  # 3个副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx  # Pod标签,用于Service关联
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80  # Pod内Nginx监听80端口

创建 Service,关联上述 Pod:

# service-nginx-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service  # Service名称(集群内可通过此名称访问)
spec:
type: ClusterIP  # 类型(默认,可省略)
selector:
app: nginx  # 匹配标签app=nginx的Pod
ports:
- port: 8080  # Service暴露的端口
targetPort: 80  # 转发到Pod的80端口
操作与验证:
# 创建Deployment和Service
kubectl apply -f deployment-nginx.yaml
kubectl apply -f service-nginx-clusterip.yaml
# 查看Service(CLUSTER-IP即为固定访问IP)
kubectl get svc nginx-service
# 输出示例:
# NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
# nginx-service   ClusterIP   10.100.237.182    <none>        8080/TCP   30s# 查看Service关联的后端Pod(endpoints)kubectl get endpoints nginx-service# 输出示例(3个Pod的IP和端口,证明关联成功):# NAME            ENDPOINTS                                      AGE# nginx-service   10.200.104.38:80,10.200.135.26:80,10.200.166.179:80      1m# 集群内测试访问:在任意Pod中访问Service的ClusterIP:8080kubectl run -it pod名 -- bash# 在test-pod内部执行(访问Service):curl 10.100.237.182:8080  # 会返回Nginx的默认页面# 或通过Service名称访问(依赖CoreDNS):curl nginx-service:8080  # 同样生效(推荐,无需记IP)

在这里插入图片描述

4.2 NodePort:集群外通过节点端口访问

  • 特点:在 ClusterIP 基础上,额外在集群所有节点上开放一个静态端口(NodePort,范围 30000-32767),外部客户端可通过 “任意节点 IP:NodePort” 访问服务。
  • 适用场景:需要从集群外部临时访问服务(如开发测试环境)。
示例:创建 NodePort 类型的 Service
# service-nginx-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort  # 类型为NodePort
selector:
app: nginx
ports:
- port: 8080  # Service内部端口
targetPort: 80  # 转发到Pod的端口
nodePort: 30080  # 节点开放的端口(可选,不指定则自动分配)
操作与验证:
kubectl apply -f service-nginx-nodeport.yaml
# 查看Service(PORT(S)显示8080:30080/TCP,30080即节点端口)
kubectl get svc nginx-nodeport
# 输出示例:
# NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
# nginx-nodeport   NodePort   10.100.134.2    <none>        8080:30080/TCP   20s# 外部访问:用集群任意节点的IP:30080# 在本地电脑浏览器输入任意节点的IP:30080:192.168.121.111:30080  # 会返回Nginx页面(确保节点端口可访问)

在这里插入图片描述

4.3 LoadBalancer:云环境外部访问(自动分配负载均衡器)

  • 特点:仅在云环境(如 AWS、GCP、阿里云)中生效,云厂商会自动创建一个外部负载均衡器(如 AWS ELB),并将流量转发到 Service 的 NodePort 或 ClusterIP。
  • 适用场景:生产环境中需要从公网访问服务(通过云厂商的负载均衡器)。
示例:创建 LoadBalancer 类型的 Service
# service-nginx-loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-loadbalancer
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80
操作与验证:
kubectl apply -f service-nginx-loadbalancer.yaml
# 查看Service(EXTERNAL-IP会显示云厂商分配的负载均衡器IP)
kubectl get svc nginx-loadbalancer
# 输出示例(AWS环境):
# NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
# nginx-loadbalancer   LoadBalancer   10.96.23.45     a1b2c3d4.elb.amazonaws.com   80:30123/TCP   5m
# 外部访问:直接访问EXTERNAL-IP
curl a1b2c3d4.elb.amazonaws.com  # 会转发到后端Nginx Pod

4.4 ExternalName:映射到外部域名

  • 特点:不关联任何 Pod,直接将 Service 名称映射到一个外部域名(如example.com),通过 K8s DNS 实现。
  • 适用场景:需要将集群内服务访问指向外部服务(如外部数据库、第三方 API)。
示例:创建 ExternalName 类型的 Service
# service-externalname.yaml
apiVersion: v1
kind: Service
metadata:
name: external-api
spec:
type: ExternalName
externalName: api.example.com  # 映射到外部域名
操作与验证:
kubectl apply -f service-externalname.yaml
# 在集群内Pod中访问:通过Service名称会解析到api.example.com
kubectl run -it --rm test-pod --image=busybox:1.35 -- sh
nslookup external-api  # 会返回api.example.com的IP

5 特殊的 Service:无头服务(Headless Service)

普通 Service 有 ClusterIP,而无头服务(Headless Service) 没有 ClusterIP,它的作用是提供 Pod 的 DNS 记录列表,让客户端自己决定访问哪个 Pod(适合需要自定义负载均衡或 StatefulSet 的场景)。

定义方式:spec.clusterIP: None,示例:

# service-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
spec:
clusterIP: None  # 无头服务(无ClusterIP)
selector:
app: nginx
ports:
- port: 80
targetPort: 80

验证:在集群内 Pod 中解析 Service 名称,会返回所有后端 Pod 的 IP:

nslookup nginx-headless  # 输出所有关联Pod的A记录(IP)

6 Service 的工作原理(简单理解)

Service 的核心是 “流量转发”,K8s 通过两种方式实现(默认 iptables):

  1. iptables 模式(默认):
    • K8s 在每个节点的 iptables 中添加规则,当请求访问 Service 的 ClusterIP:Port 时,iptables 会将流量转发到后端 Pod 的 IP:Port(随机选择一个,实现轮询负载均衡)。
  2. IPVS 模式(高性能,需手动开启):
    • 基于 LVS(Linux Virtual Server)实现,支持更多负载均衡策略(如最小连接数),性能优于 iptables,适合大流量场景。

7 常见问题与排错(必看)

  1. Service 访问不通,提示 “Connection refused”
    • 原因 1:selector标签不匹配,Service 未关联到任何 Pod(查看 endpoints:kubectl get endpoints <service-name>,若为空则标签错误)。
    • 原因 2:Pod 的targetPort未监听(检查 Pod 内容器是否正常启动,端口是否正确,如kubectl exec <pod-name> -- netstat -tln)。
    • 原因 3:网络策略(NetworkPolicy)禁止了访问,需检查是否有策略限制 Service 到 Pod 的流量。
  2. NodePort 访问不通
    • 原因 1:节点端口被防火墙拦截(如节点的 firewalld/ufw 未开放 30080 端口)。
    • 原因 2:nodePort指定的端口不在 30000-32767 范围内(K8s 默认限制,需调整则修改 kube-apiserver 的--service-node-port-range参数)。
  3. Service 名称无法解析
    • 原因:CoreDNS 未正常运行(检查kubectl get pods -n kube-system | grep coredns,确保 CoreDNS Pod 正常)。

8 总结

  1. Service 的核心价值:为动态变化的 Pod 提供固定访问入口,实现负载均衡和服务发现。
  2. 4 种类型:
    • ClusterIP:集群内访问(默认)。
    • NodePort:外部通过节点端口访问(测试用)。
    • LoadBalancer:云环境外部访问(生产用)。
    • ExternalName:映射到外部域名。
  • 原因:CoreDNS 未正常运行(检查kubectl get pods -n kube-system | grep coredns,确保 CoreDNS Pod 正常)。

8 总结

  1. Service 的核心价值:为动态变化的 Pod 提供固定访问入口,实现负载均衡和服务发现。
  2. 4 种类型:
    • ClusterIP:集群内访问(默认)。
    • NodePort:外部通过节点端口访问(测试用)。
    • LoadBalancer:云环境外部访问(生产用)。
    • ExternalName:映射到外部域名。
  3. 关键机制:通过selector标签关联 Pod,依赖 iptables/IPVS 实现流量转发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vn.py的日志问题

vn.py的日志问题使用新版 vn.py 调试时, 发现没有日志, 然后写了下面一段代码跟踪:from vnpy.trader.setting import SETTINGS from vnpy.event import EventEngine from vnpy.trader.engine import MainEngine fro…

Oracle故障处理:create table 引起select语句hang住出现library cache lock事件

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle故障处…

OSI中七层模型

OSI中七层模型OSI中七层模型 1.物理层: 在物理媒介上传输原始的比特流。它定义了电气,机械,过程和功能规范,以激活。维持和断开物理链路。 关心的问题:电压大小,引脚数量,电缆类型,传输速率,信号同步等 协议/…

2025 年西安苹果手机维修公司最新推荐榜,聚焦技术实力与用户口碑深度解析

引言 随着西安苹果设备保有量年增 18%,维修需求同步攀升,但行业仍存在配件掺假率 12%、隐性收费占比 23% 等乱象。为破解选择难题,本次推荐榜联合该委员会开展专项测评,采用 “三维九维度” 评估体系:技术维度涵盖…

2025 年西安苹果电脑维修最新推荐榜,技术实力与市场口碑深度解析

引言 苹果电脑的精密构造与高端配置,使其维修对技术与服务的专业性要求极高。但西安维修市场仍存在配件以次充好、报价虚高、维修流程不透明等问题,据电子商会消费电子售后服务专业委员会 2024 年测评数据显示,西安…

Awesome GitHub Copilot:超级定制化AI编程助手工具集

Awesome GitHub Copilot是一个精心策划的GitHub Copilot定制化资源库,包含丰富的提示词、自定义指令和聊天模式,涵盖多种编程语言、开发框架和云服务平台,帮助开发者显著提升编程效率和代码质量。Awesome GitHub Co…

跟着视频学,从0开始学PostgreSQL数据库

首先,要清楚一个问题“为什么要学习PostgreSQL数据库”?PostgreSQL有很多优点,比如开源、免费、功能强大等等,基于这些优点,我国众多数据库厂商都选择PostgreSQL再次开发自己的产品,国内使用PG数据库的企业和项目…

SSD和HDD存储应该如何选择?

选择 SSD(固态硬盘) 和 HDD(机械硬盘) 的存储类型主要取决于你的需求、预算以及使用场景。以下是详细的比较和建议,帮助你在不同场景下做出最佳选择。1. SSD 和 HDD 的基本介绍 1.1 SSD(固态硬盘)特点:使用闪存…

基于大语言模型的浏览器自动化:playwright+browser-use

基于大语言模型的浏览器自动化:playwright+browser-use 1、安装nodejs https://nodejs.org/zh-cn/download 下载 node-v24.11.0-x64.msi 2、安装 playwrightnpx playwright install 3、安装 browser-use 包 首先需要安…

Git克隆远程仓库后,本地无感切换分支工作的验证

Git客户端克隆远程仓库后如果本地想切换到feature/add-info分支工作,直接切换即可。 关于无感切换的操作,说明如下: 在 Git 2.23+ 版本中,新增了 “隐含创建本地分支” 的功能:当你执行 git checkout feature/add…

2025 年锰钢编织筛网厂家最新推荐榜,技术实力与市场口碑深度解析,筛选优质靠谱供应商振动/滚筒/平筛/黑钢锰钢编织筛网公司推荐

引言 为精准筛选出 2025 年锰钢编织筛网领域优质靠谱的供应商,本次推荐榜测评工作联合矿业装备协会、金属制品工业协会共同开展。测评过程严格遵循 “多维度、重数据、强验证” 原则,从企业综合实力与产品核心竞争力…

P7353 [2020-2021 集训队作业] Tom Jerry 题解

Sol 注意到 T 想赢必须一步一步缩小 J 的移动空间,所以 T 最优只会移动到割点来缩小 J 的移动空间最终让 J 无处可移。 所以我们考虑建出原图的圆方树。 考虑对于一组询问,把 \(a\) 提起来作为根,那么设 \(b\) 是 \…

痞子衡嵌入式:在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps。最近痞子衡在帮一个 RT600 的 AR 眼镜客户优化 SPI 从设备接收数据的速率,我们知道 …

国产LTCC低通滤波器HT-LFCG-530+实测:完美替代LFCG-530+,5G/WiFi6/车规全场景

国产LTCC低通滤波器HT-LFCG-530+实测:完美替代LFCG-530+,5G/WiFi6/车规全场景封装对比 ① 尺寸:5.03.01.1 mm,与原版游标卡尺测量完全一致,焊盘0.450.65 mm,0.65 mm间距,8Pin,钢网不用改。 ② 重量:16.3 mg v…

C语言 打印菱形图案

先画图,找关系,搞明白关系就会做题了//数量关系 // 3.空数 4.星数 1.val:辅助值 2.层数// * 3=4-1 1 4=mid 1// *** 2=5-3 3 5=mid+1 …

Java并发编程利器:从ConcurrentHashMap到Fork/Join的奇幻之旅

上篇讲了Lock锁、AQS相关的内容,本篇讲一下线程安全的类,拿来即用无需其他操作就能达到线程安全的效果,省力又省心 ~ ~你是否曾为多线程编程中的各种坑而头疼?本文将用生动比喻和实用代码,带你轻松掌握Java并发容…

mysql报错many connections errors

mysql报错many connections errors如上图所示 首先使用可以访问数据库的主机进入数据库,我的mysql在linux系统中直接从Linux系统进入然后重新使用可视化工具进行连接即可!

2025薪酬管理系统推荐:6大主流系统全面对比与选型指南

引言:复杂多变的薪酬挑战与数字化破局之道 在 “降本增效”成为主旋律的2025年,中国企业面临的薪酬管理挑战愈发复杂和严峻。薪酬,作为企业人力资源管理的核心环节,不仅关乎员工的切身利益和组织士气,更是企业合规…

Solon (可替换 SpringBoot)集成 Docker 实战:30分钟搞定轻量级应用容器化部署

本文介绍了如何将Solon框架与Docker快速集成,突出了Solon在启动速度、内存占用和容器化方面的优势。文章从环境准备入手,详细说明了两种Docker打包方式(Maven插件和Dockerfile),提供了完整的配置示例和操作命令,…