跳转到内容

Kubernetes Service概念

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 22:17的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Kubernetes Service概念[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Kubernetes Service 是 Kubernetes 中用于定义一组 Pod 的逻辑集合及其访问策略的核心抽象。它提供了一种稳定的网络端点,使得应用程序可以通过固定的 IP 地址或 DNS 名称访问动态变化的 Pod 实例。Service 解决了 Pod 因重启、扩展或故障导致 IP 地址变化的问题,是 Kubernetes 网络模型的关键组件。

Service 的主要功能包括:

  • 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称
  • 负载均衡流量到后端 Pod
  • 支持多种服务类型(ClusterIP、NodePort、LoadBalancer、ExternalName)
  • 通过标签选择器(Label Selector)动态关联 Pod

Service 类型[编辑 | 编辑源代码]

Kubernetes 支持四种主要 Service 类型:

1. ClusterIP[编辑 | 编辑源代码]

默认类型,为服务分配一个集群内部IP,只能在集群内部访问。

2. NodePort[编辑 | 编辑源代码]

在 ClusterIP 基础上,在每个节点上开放一个静态端口(NodePort),外部可通过 <节点IP>:<NodePort> 访问服务。

3. LoadBalancer[编辑 | 编辑源代码]

在 NodePort 基础上,使用云提供商的负载均衡器将外部流量导入服务。

4. ExternalName[编辑 | 编辑源代码]

通过 CNAME 记录将服务映射到外部 DNS 名称。

graph LR A[Client] -->|ClusterIP| B[Service] A -->|NodePort| C[NodeIP:Port] A -->|LoadBalancer| D[Cloud LB] B --> E[Pod] B --> F[Pod] C --> E C --> F D --> E D --> F

核心机制[编辑 | 编辑源代码]

标签选择器[编辑 | 编辑源代码]

Service 通过标签选择器(Label Selector)确定哪些 Pod 属于服务后端:

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

此配置会选择所有带有 app=my-apptier=frontend 标签的 Pod。

服务发现[编辑 | 编辑源代码]

Kubernetes 提供两种服务发现方式: 1. 环境变量:Pod 启动时,kubelet 会为每个活动 Service 注入环境变量 2. DNS(推荐):集群 DNS 服务(如 CoreDNS)会为 Service 创建 DNS 记录

实际案例[编辑 | 编辑源代码]

案例1:部署Web应用服务[编辑 | 编辑源代码]

部署一个Nginx服务并通过ClusterIP访问:

# 部署Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

# 创建Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

应用后可通过以下命令验证:

# 获取Service信息
kubectl get svc nginx-service

# 从集群内部访问
kubectl run curl --image=curlimages/curl -it --rm -- curl http://nginx-service

案例2:暴露服务到外部[编辑 | 编辑源代码]

将上述服务改为NodePort类型:

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30007

此时可通过任何节点IP的30007端口访问服务。

高级主题[编辑 | 编辑源代码]

会话保持(Session Affinity)[编辑 | 编辑源代码]

通过设置 sessionAffinity: ClientIP 可将来自同一客户端的请求转发到同一Pod:

apiVersion: v1
kind: Service
metadata:
  name: affinity-service
spec:
  sessionAffinity: ClientIP
  selector:
    app: webapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

无头服务(Headless Service)[编辑 | 编辑源代码]

指定 clusterIP: None 可创建无头服务,直接返回Pod IP而非代理:

apiVersion: v1
kind: Service
metadata:
  name: headless-service
spec:
  clusterIP: None
  selector:
    app: stateful-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

数学表示[编辑 | 编辑源代码]

Service的负载均衡可表示为权重分配问题:

Wi=1n对于 i=1,2,...,n

其中Wi是第i个Pod的权重,n是后端Pod数量(默认均等分配)。

常见问题[编辑 | 编辑源代码]

Q: Service和Ingress有什么区别? A: Service是L4(TCP/UDP)抽象,而Ingress是L7(HTTP/HTTPS)抽象,提供基于路径和主机的路由。

Q: 如何调试Service连接问题? A: 可按以下步骤检查: 1. 验证Endpoints是否存在:kubectl get endpoints <service-name> 2. 检查标签选择器匹配 3. 测试从Pod内部直接访问目标端口 4. 检查网络策略(NetworkPolicy)是否阻止流量

总结[编辑 | 编辑源代码]

Kubernetes Service是微服务架构中的关键网络抽象,它:

  • 提供稳定的服务端点
  • 实现负载均衡
  • 支持多种暴露方式
  • 通过标签实现动态后端关联

理解Service概念是掌握Kubernetes网络模型的基础,对于构建可靠、可扩展的分布式系统至关重要。