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