目录
[一、Service 核心概念与作用](#一、Service 核心概念与作用)
[1. Service 定义](#1. Service 定义)
[2. 应用背景](#2. 应用背景)
[3. 核心组件协作原理](#3. 核心组件协作原理)
[二、Service 工作原理](#二、Service 工作原理)
[1. 基本原理](#1. 基本原理)
[2. 负载均衡机制](#2. 负载均衡机制)
[2. Endpoint 动态关联机制](#2. Endpoint 动态关联机制)
[三、Service 四种类型及应用](#三、Service 四种类型及应用)
[1. ClusterIP(默认类型)(集群内服务)](#1. ClusterIP(默认类型)(集群内服务))
[2. NodePort(节点端口暴露)](#2. NodePort(节点端口暴露))
[3. LoadBalancer(云服务商负载均衡)](#3. LoadBalancer(云服务商负载均衡))
[4. ExternalName(外部服务映射)](#4. ExternalName(外部服务映射))
[四、Service 高级功能](#四、Service 高级功能)
[1. 多端口设置](#1. 多端口设置)
[2. 服务发现机制](#2. 服务发现机制)
[1. 完整案例:创建 NodePort 服务](#1. 完整案例:创建 NodePort 服务)
[2. 关键操作命令](#2. 关键操作命令)
一、Service 核心概念与作用
1. Service 定义
- 本质:Kubernetes 中用于封装一组 Pod 的抽象资源,为其提供稳定访问入口,屏蔽后端 Pod 动态变化
- 核心功能:负载均衡、服务发现、服务暴露,是实现微服务的核心资源
- 关键价值:将外部请求代理到内部 Pod,提供 4 层负载均衡,构建高可用应用
2. 应用背景
传统架构中需通过 Nginx、LVS 等组件实现负载均衡,而 Kubernetes 通过 Service 和 Ingress 实现类似功能,但配置方式更标准化4。其中 Service 负责负载均衡,Ingress 负责域名路由。
3. 核心组件协作原理
- kube-proxy :
- 负责流量转发和负载均衡,运行在每个节点上
- 监听 Service 变化并更新 iptables/ipvs 规则
- CoreDNS :
- 集群 DNS 解析服务,将 Service 名称映射为 ClusterIP
- 支持通过
服务名.命名空间.svc.cluster.local
格式访问
二、Service 工作原理
1. 基本原理
- Pod IP 动态问题:Pod IP 会随重启变化,Service 为其创建虚拟 IP,客户端通过该 IP 访问 Pod
- 组件协作 :
- kube-proxy:监听 Service 变化,更新 iptables/ipvs 规则实现流量转发
- CoreDNS:将 Service 虚拟 IP 注册到 DNS,支持通过服务名访问
2. 负载均衡机制
2. Endpoint 动态关联机制
-
流量转发流程 :
- 客户端请求 Service 的 ClusterIP
- kube-proxy 根据模式更新路由规则
- 流量通过规则转发到后端 Pod
-
kube-proxy 模式对比 :
模式 核心特点 性能 userspace 早期模式,通过用户空间进程转发,存在内核态与用户态切换开销,已废弃 低 iptables 默认模式,直接通过 iptables 规则路由,规则数量增加会影响性能 中 ipvs 高性能模式,基于哈希表实现负载均衡,支持 RR/LC/DH 等多种算法 高 kernelspace Windows 专用模式 - -
Endpoint 定义 :Service 后端 Pod 的
IP:Port
组合,自动由 selector 匹配生成 -
查看方式 :
kubectl get endpoints # 查看所有 Endpoint kubectl describe svc <服务名> # 查看服务关联的 Endpoint
三、Service 四种类型及应用
1. ClusterIP(默认类型)(集群内服务)
- 核心特性 :
- 为集群内部服务提供虚拟 IP,外部无法直接访问
- 默认类型,创建时无需指定 type
- 创建方式 :
-
命令行:
kubectl expose deployment webapp
自动生成 -
YAML 配置:
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
ports:
- port: 8080 # Service端口
targetPort: 8080 # Pod端口
selector:
app: webapp # 匹配Pod标签
-
创建方式:
kubectl expose deployment webapp # 基于 Deployment 快速创建
kubectl create -f webapp-service.yaml # 基于 YAML 创建
- 验证 :通过
curl 10.104.162.209:8080
访问,流量会负载到后端 Pod
2. NodePort(节点端口暴露)
-
核心特性 :
- 在每个节点上开放指定端口,外部通过
NodeIP:NodePort
访问 - 端口范围固定为 30000-32767
- 在每个节点上开放指定端口,外部通过
-
配置示例 :
spec: type: NodePort # 指定类型为 NodePort ports: - nodePort: 30008 # 节点暴露端口 port: 8080 # Service 内部端口 targetPort: 8080 # Pod 端口 selector: app: webapp # 匹配标签
- 访问示例 :
http://192.168.10.101:30008
可访问集群服务
3. LoadBalancer(云服务商负载均衡)
-
特点:调用云服务商负载均衡器,自动分配外部 IP15
-
适用场景:生产环境对外暴露服务,需云平台支持(如 AWS ELB)
-
配置示例:
spec:
type: LoadBalancer # 指定类型
ports:
- nodePort: 31771 # 可选,系统自动分配
4. ExternalName(外部服务映射)
-
核心特性 :
- 将 Service 映射到集群外部服务(如外部数据库、API)
- 无 ClusterIP 和 Endpoint,通过 CNAME 记录指向外部地址
-
跨命名空间案例 :
spec: type: ExternalName # 指定类型为 ExternalName externalName: myapp-svc02.test02.svc.cluster.local # 格式说明:目标服务名.目标命名空间.svc.cluster.local
-
应用场景 :
- 连接外部数据库(如
externalName: mysql.example.com
) - 跨命名空间通信:通过
externalName: service.testns.svc.cluster.local
映射
- 连接外部数据库(如
四、Service 高级功能
1. 多端口设置
- 场景:当 Pod 提供多个服务端口时(如 Web 服务 + 管理端口)
- 配置示例:
bash
spec:
ports:
- protocol: TCP
port: 8080 # Web 服务端口
targetPort: 8080
name: web # 端口命名
- protocol: TCP
port: 8005 # 管理服务端口
targetPort: 8005
name: management # 端口命名
selector:
app: webapp # 匹配标签
2. 服务发现机制
-
1. 环境变量方式 :
-
原理:Pod 创建时自动注入所有 Service 的环境变量
-
示例变量:
KUBERNETES_SERVICE_HOST=10.96.0.1 # Kubernetes 主服务 IP MYNGINX_SERVICE_HOST=10.109.164.93 # 自定义服务 IP MYNGINX_SERVICE_PORT=80 # 自定义服务端口
-
-
2. DNS 方式 :
-
原理:通过 CoreDNS 解析 Service 名称为 ClusterIP
-
解析格式:
服务名.命名空间.svc.cluster.local 示例:webapp.default.svc.cluster.local
-
测试命令:
kubectl exec -it <Pod名> -- nslookup webapp # 解析服务名
-
五、实战案例与关键命令
1. 完整案例:创建 NodePort 服务
-
创建 Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: webapp spec: replicas: 2 # 2 个 Pod 副本 selector: matchLabels: app: webapp # Pod 标签 template: metadata: labels: app: webapp # 与 selector 匹配 spec: containers: - name: webapp image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 # Pod 端口
-
创建 Service:
apiVersion: v1 kind: Service metadata: name: webapp spec: type: NodePort # NodePort 类型 ports: - nodePort: 30008 # 节点端口 port: 8080 # Service 端口 targetPort: 8080 # Pod 端口 selector: app: webapp # 匹配标签
-
访问测试:
curl http://<节点IP>:30008 # 浏览器或命令行访问
2. 关键操作命令
- 创建 Service :
kubectl create -f <yaml文件>
- 暴露 Service :
kubectl expose deployment <部署名> --port=<端口>
- 查看 Service :
kubectl get svc
- 删除 Service :
kubectl delete svc <服务名>
或kubectl delete -f <yaml文件>
六、本章核心总结
- Service 本质:封装 Pod 为稳定服务,提供负载均衡和服务发现
- 四大类型核心差异 :
- ClusterIP:集群内通信(默认)
- NodePort:节点端口暴露(开发测试)
- LoadBalancer:云平台负载均衡(生产环境)
- ExternalName:外部服务映射(跨集群 / 跨命名空间)
- 关键组件:kube-proxy(流量转发)+ CoreDNS(DNS 解析)共同实现服务功能
- 服务发现:环境变量和 DNS 两种方式,推荐使用 DNS 方式(更灵活)