K8s学习笔记(十一):Service详解

Service的核心作用

Service是Kubernetes中抽象定义一组Pod的逻辑集合和访问策略的机制。它通过标签选择器(Label Selector)关联后端Pod,为这些Pod提供稳定的IP地址和DNS名称,无论后端Pod如何变化,客户端都能通过Service访问到它们。

Service主要解决动态Pod环境下服务发现和负载均衡问题。Pod的生命周期是临时的,重建后IP会改变,Service屏蔽了这种复杂性。

Service类型与使用场景

ClusterIP
默认类型,为服务分配集群内部IP,只能在集群内部访问。适用于内部服务间通信场景,如微服务架构中后端服务相互调用。

示例YAML:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

NodePort
在ClusterIP基础上,在每个节点上开放静态端口(默认范围30000-32767),可通过<NodeIP>:<NodePort>从外部访问。适合开发测试环境或需要简单外部访问的场景。

LoadBalancer
云提供商专属类型,自动创建外部负载均衡器并将流量导向Service。这是生产环境暴露服务的推荐方式,支持AWS ALB、GCP LB等。

ExternalName
特殊类型,通过CNAME记录映射到外部DNS名称,用于集成集群外部服务。

服务发现机制

DNS模式是Kubernetes默认的服务发现方式。CoreDNS会为Service创建如下DNS记录:

  • my-service.namespace.svc.cluster.local
  • 同命名空间可简写为my-service

环境变量方式(已逐渐淘汰):

MY_SERVICE_SERVICE_HOST=10.3.240.100
MY_SERVICE_SERVICE_PORT=6379
高级流量控制

会话保持
通过sessionAffinity: ClientIP实现,确保来自同一客户端的请求落到同一Pod:

spec:
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600

多端口服务
一个Service可暴露多个端口:

ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8443

Headless服务
无头服务(clusterIP: None)直接返回Pod IP列表,适用于需要客户端直接连接Pod的场景,如StatefulSet:

spec:
  clusterIP: None
服务代理模式

userspace代理模式
旧版模式,流量会经过kube-proxy在用户空间转发,性能较差但支持更多功能。

iptables模式
默认模式,kube-proxy通过iptables规则直接转发,性能更好但调试复杂。

IPVS模式
基于内核的IPVS实现,支持更多负载均衡算法(rr/wrr/lc等),适合大规模集群:

kube-proxy:
  --proxy-mode=ipvs
  --ipvs-scheduler=wrr
服务与Ingress结合

Service通常与Ingress配合使用实现七层路由:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80
服务网格集成

现代服务网格如Istio会在Service基础上注入Sidecar,实现高级流量管理:

  • 金丝雀发布
  • 熔断限流
  • mTLS加密
  • 指标收集

示例流量镜像配置:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10
    mirror:
      host: reviews
      subset: v2
调试技巧

常见问题排查命令:

kubectl describe svc my-service
kubectl get endpoints my-service
kubectl logs -l app=my-app
curl -v http://service-ip:port

网络策略验证工具:

kubectl run -it --rm testpod --image=alpine sh
apk add curl bind-tools
nslookup my-service
最佳实践建议
  1. 命名规范:服务名应当反映业务功能,如user-servicepayment-gateway
  2. 端口管理:避免使用保留端口(如3306),建议使用8000+端口范围
  3. 标签设计:确保Selector能准确匹配目标Pod,如app.kubernetes.io/name: frontend
  4. 资源限制:为kube-proxy配置适当资源,大型集群建议使用IPVS模式
  5. 监控指标:关注kube_service_spec_typekube_service_status_load_balancer_ingress等指标

Service作为Kubernetes的核心抽象之一,理解其工作原理和高级用法对于构建可靠的生产级应用至关重要。随着服务网格技术的普及,Service正逐渐演变为更细粒度流量控制的基础设施层。

更多推荐