Service服务 #
一、Service概述 #
Service是Kubernetes中定义服务抽象的方法,为一组Pod提供稳定的访问入口和负载均衡。
1.1 Service功能 #
text
Service功能
│
├── 服务发现
│ ├── 稳定的ClusterIP
│ └── DNS名称解析
│
├── 负载均衡
│ └── 流量分发到后端Pod
│
├── 服务暴露
│ ├── 集群内部访问
│ └── 外部访问
│
└── 松耦合
└── 前端不依赖后端Pod IP
1.2 Service类型 #
| 类型 | 说明 | 访问范围 |
|---|---|---|
| ClusterIP | 集群内部IP | 集群内部 |
| NodePort | 节点端口 | 集群外部 |
| LoadBalancer | 云负载均衡器 | 外部访问 |
| ExternalName | 外部服务别名 | DNS映射 |
二、ClusterIP服务 #
2.1 创建ClusterIP服务 #
yaml
# clusterip-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
bash
# 创建Service
kubectl apply -f clusterip-service.yaml
# 查看Service
kubectl get svc nginx-service
# 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service ClusterIP 10.96.145.23 <none> 80/TCP 10s
# 查看Endpoints
kubectl get endpoints nginx-service
2.2 访问ClusterIP服务 #
bash
# 集群内部访问
curl http://nginx-service:80
# 或使用完整DNS名称
curl http://nginx-service.default.svc.cluster.local:80
# 跨命名空间访问
curl http://nginx-service.other-namespace.svc.cluster.local:80
2.3 多端口服务 #
yaml
apiVersion: v1
kind: Service
metadata:
name: multi-port-service
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8443
三、NodePort服务 #
3.1 创建NodePort服务 #
yaml
# nodeport-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
bash
# 创建Service
kubectl apply -f nodeport-service.yaml
# 查看Service
kubectl get svc nginx-nodeport
# 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-nodeport NodePort 10.96.145.23 <none> 80:30080/TCP 10s
3.2 访问NodePort服务 #
bash
# 获取节点IP
kubectl get nodes -o wide
# 获取NodePort端口
kubectl get svc nginx-nodeport -o jsonpath='{.spec.ports[0].nodePort}'
# 访问服务
curl http://<node-ip>:30080
3.3 NodePort范围 #
text
NodePort范围
│
├── 默认范围:30000-32767
│
└── 可通过API Server参数修改
└── --service-node-port-range
四、LoadBalancer服务 #
4.1 创建LoadBalancer服务 #
yaml
# loadbalancer-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80
bash
# 创建Service
kubectl apply -f loadbalancer-service.yaml
# 查看Service
kubectl get svc nginx-lb
# 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-lb LoadBalancer 10.96.145.23 203.0.113.10 80:30080/TCP 1m
4.2 指定负载均衡器IP #
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
type: LoadBalancer
loadBalancerIP: 203.0.113.100
selector:
app: nginx
ports:
- port: 80
targetPort: 80
4.3 外部流量策略 #
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
type: LoadBalancer
externalTrafficPolicy: Local
selector:
app: nginx
ports:
- port: 80
targetPort: 80
| 策略 | 说明 |
|---|---|
| Cluster | 流量可转发到任意节点Pod |
| Local | 流量只转发到本节点Pod |
五、Headless服务 #
5.1 创建Headless服务 #
yaml
# headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
spec:
clusterIP: None
selector:
app: nginx
ports:
- port: 80
targetPort: 80
5.2 Headless服务特点 #
text
Headless服务特点
│
├── 无ClusterIP
│
├── DNS返回所有Pod IP
│
├── 直接访问Pod
│
└── 用于StatefulSet
5.3 DNS解析 #
bash
# 解析Headless服务
nslookup nginx-headless
# 返回所有Pod IP
# 示例输出
Server: 10.96.0.10
Address: 10.96.0.10
Name: nginx-headless.default.svc.cluster.local
Address: 10.244.1.5
Address: 10.244.2.3
Address: 10.244.3.7
六、ExternalName服务 #
6.1 创建ExternalName服务 #
yaml
# externalname-service.yaml
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
type: ExternalName
externalName: database.example.com
6.2 使用ExternalName #
bash
# 访问外部服务
curl http://external-db:3306
# 实际解析到
# database.example.com:3306
七、服务发现 #
7.1 DNS服务发现 #
text
DNS命名格式
│
└── <service-name>.<namespace>.svc.cluster.local
示例
│
├── nginx-service.default.svc.cluster.local
├── mysql.database.svc.cluster.local
└── redis.cache.svc.cluster.local
7.2 环境变量服务发现 #
bash
# 查看Service环境变量
kubectl exec <pod-name> -- env | grep SERVICE
# 输出示例
NGINX_SERVICE_SERVICE_HOST=10.96.145.23
NGINX_SERVICE_SERVICE_PORT=80
NGINX_SERVICE_PORT=tcp://10.96.145.23:80
7.3 CoreDNS配置 #
yaml
# CoreDNS配置
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
八、Endpoints #
8.1 Endpoints概念 #
Endpoints是Service的后端Pod地址列表。
bash
# 查看Endpoints
kubectl get endpoints nginx-service
# 输出示例
NAME ENDPOINTS AGE
nginx-service 10.244.1.5:80,10.244.2.3:80,10.244.3.7:80 1m
8.2 手动管理Endpoints #
yaml
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
ports:
- port: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 192.168.1.100
- ip: 192.168.1.101
ports:
- port: 80
8.3 EndpointSlice #
bash
# 查看EndpointSlice
kubectl get endpointslices
# 输出示例
NAME ADDRESSTYPE PORTS ENDPOINTS AGE
nginx-service-xxx IPv4 80 10.244.1.5,10.244.2.3,... 1m
九、完整配置示例 #
9.1 生产级Service #
yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
spec:
type: LoadBalancer
selector:
app: web
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
- name: https
port: 443
targetPort: 8443
protocol: TCP
externalTrafficPolicy: Local
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
9.2 配置说明 #
| 配置项 | 说明 |
|---|---|
| sessionAffinity | 会话亲和性 |
| externalTrafficPolicy | 外部流量策略 |
| loadBalancerSourceRanges | 访问IP限制 |
十、故障排查 #
10.1 常见问题 #
bash
# 查看Service详情
kubectl describe svc nginx-service
# 查看Endpoints
kubectl get endpoints nginx-service
# 测试DNS解析
kubectl run test --image=busybox --rm -it -- nslookup nginx-service
# 测试服务连通性
kubectl run test --image=busybox --rm -it -- wget -qO- nginx-service:80
10.2 问题诊断 #
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Endpoints为空 | 标签不匹配 | 检查selector |
| 无法访问 | 网络策略限制 | 检查NetworkPolicy |
| DNS解析失败 | CoreDNS问题 | 检查CoreDNS状态 |
十一、总结 #
11.1 核心要点 #
| 类型 | 用途 | 访问范围 |
|---|---|---|
| ClusterIP | 集群内部服务 | 集群内部 |
| NodePort | 节点端口暴露 | 集群外部 |
| LoadBalancer | 云负载均衡 | 外部访问 |
| Headless | 直接访问Pod | StatefulSet |
11.2 下一步 #
掌握了Service后,让我们学习 Ingress入口,了解HTTP路由和TLS配置。
最后更新:2026-03-28