一、服务核心类型详解
类型 | 工作原理 | 适用场景 | 配置文件示例 |
---|---|---|---|
ClusterIP | 创建集群内部虚拟 IP,通过 kube-proxy 实现负载均衡 | 内部微服务通信 | webapp-service.yaml |
NodePort | 在所有节点开放静态端口(30000-32767),将外部流量转发到 Service | 开发测试环境、简单外部访问 | tomcat-service.yaml |
LoadBalancer | 云厂商自动创建外部负载均衡器,分配公网 IP | 生产环境公网暴露 | nginx-service.yaml |
ExternalName | 创建 CNAME 记录指向外部 DNS 名称 | 访问集群外部服务(如云数据库) | myapp-svc-extername01.yaml |
Headless | clusterIP: None ,DNS 直接返回 Pod IP |
StatefulSet、DNS 发现、直接 Pod 访问 | myapp-svc-headless01.yaml |
二、服务高级配置
1. 多端口服务
# service-multiple-ports.yaml ports: - port: 8080 # Service 端口 targetPort: 8080 # 容器端口 name: http # 必需命名(唯一标识) protocol: TCP # TCP/UDP/SCTP - port: 8005 targetPort: 8005 name: jmx protocol: TCP
2. 会话保持 (Session Affinity)
spec: sessionAffinity: ClientIP # 基于客户端 IP 的会话保持 sessionAffinityConfig: clientIP: timeoutSeconds: 3600 # 会话保持时间
3. 流量策略
spec: externalTrafficPolicy: Local # 保留客户端源 IP,避免额外跳转 internalTrafficPolicy: Local # 内部流量优先本节点
三、服务发现机制
1. DNS 解析规则
服务类型 | DNS 记录格式 | 返回结果 |
---|---|---|
ClusterIP | <svc>.<ns>.svc.cluster.local |
ClusterIP 虚拟 IP |
Headless | <svc>.<ns>.svc.cluster.local |
所有 Pod IP 列表 |
ExternalName | <svc>.<ns>.svc.cluster.local |
配置的 CNAME 记录 |
2. 环境变量注入
Pod 启动时自动注入:
text
复制
下载
WEBAPP_SERVICE_HOST=10.96.128.5 WEBAPP_SERVICE_PORT=8080
四、跨命名空间通信
1. ExternalName 跨 NS 访问
# myapp-svc-extername01.yaml externalName: myapp-svc02.test02.svc.cluster.local
2. 直接 DNS 访问
curl http://myapp-svc02.test02.svc.cluster.local:39320
五、端点(Endpoints)与选择器
1. 手动 Endpoints(无 Selector)
apiVersion: v1 kind: Service metadata: name: external-db spec: ports: - port: 5432 --- kind: Endpoints apiVersion: v1 metadata: name: external-db subsets: - addresses: - ip: 192.168.1.100 ports: - port: 5432
2. 选择器高级匹配
selector: matchExpressions: - {key: tier, operator: In, values: [frontend]} - {key: env, operator: NotIn, values: [dev]}
六、服务与部署全生命周期
1. 完整部署流程
创建 Deployment
定义 Pod 模板
设置副本数
配置容器镜像
暴露容器端口
创建 Service
配置 Selector
定义端口映射
选择服务类型
2. 金丝雀发布示例
# myapp01.yaml (v1) spec: replicas: 3 template: metadata: labels: app: myapp01 version: v1 # myapp-canary.yaml (v2) spec: replicas: 1 template: metadata: labels: app: myapp01 version: v2
七、网络策略与安全
1. 网络策略示例
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: frontend-policy spec: podSelector: matchLabels: app: frontend ingress: - from: - podSelector: matchLabels: app: backend ports: - protocol: TCP port: 80
2. 服务账户授权
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: test01 name: service-access rules: - apiGroups: [""] resources: ["services"] verbs: ["get", "list"]
八、服务监控与调试
1. 关键监控指标
服务请求延迟 (
kube_service_request_duration_seconds
)端点变化次数 (
kube_endpoint_changes
)Pod 就绪状态 (
kube_pod_status_ready
)
2. 诊断命令
# 检查端点映射 kubectl get endpoints <service-name> # 查看服务详情 kubectl describe svc <service-name> # 测试服务发现 kubectl run test -it --rm --image=busybox --restart=Never -- nslookup <service-name> # 检查网络策略 kubectl network-policy analyze
九、高级服务模式
1. Topology-Aware Hints
spec: topologyKeys: ["topology.kubernetes.io/zone"]
2. Service Mesh 集成
# Istio VirtualService 示例 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: webapp-vs spec: hosts: - webapp.example.com http: - route: - destination: host: webapp.default.svc.cluster.local