深入解析 Kubernetes Service(SVC)网络


深入解析 Kubernetes Service(SVC)网络

在 Kubernetes(k8s)集群中,Pod 是最小的可部署单元,但 Pod 的生命周期是短暂的,IP 也是动态分配的。这种特性导致 Pod 之间的网络通信变得复杂。为了解决这个问题,Kubernetes 引入了 Service(SVC) 资源,它充当一组 Pod 的稳定访问入口,使得集群内部或外部的访问更加高效和稳定。

本文将深入探讨 Kubernetes Service 的网络机制、不同类型及其应用场景。


为什么需要 Service?

Kubernetes 中 Pod 可能会被频繁销毁和重建,每次重新创建时,其 IP 地址都会改变。例如,一个微服务架构的 Web 应用,frontend 需要访问 backend,但 backend 的 Pod IP 是动态变化的,frontend 无法始终知道 backend 的最新 IP。Service 解决了这个问题,提供了一个 稳定的访问方式

  • Service 具有 固定的 Cluster IP,不会因 Pod 变化而变化。
  • Service 通过 标签选择器(Label Selector) 发现匹配的 Pod,并自动负载均衡。
  • Service 还可以暴露到集群外部,让外部应用访问 Kubernetes 内部的服务。

Kubernetes Service 主要组成部分

一个 Service 由以下关键部分组成:

组件作用
selector通过 Label 选择匹配的 Pod
clusterIPService 的内部 IP 地址(默认自动分配)
ports定义 Service 暴露的端口
typeService 的类型,决定了其访问方式
endpoints记录了与 Service 关联的 Pod 的 IP 和端口

Kubernetes Service 类型

类型的对比表格

Service 类型作用访问方式适用场景
ClusterIP(默认)仅在 集群内部 访问,提供稳定的服务发现http://my-service.default.svc.cluster.local集群内部通信(如微服务间调用)
NodePort在每个 Node 上开放一个固定端口,供外部访问http://<NodeIP>:<NodePort>小规模外部访问,如开发测试
LoadBalancer在云环境中创建外部负载均衡器,自动分配外部 IPhttp://<External-IP>:<Port>生产环境对外提供服务
ExternalName代理 Kubernetes 内部流量到外部域名http://my-database.default.svc.cluster.local访问外部数据库或 API

ClusterIP(默认类型)

  • 作用:只在 集群内部 访问,提供稳定的内部服务发现。

  • 适用场景:集群内部服务通信,例如 backend 访问 database

  • 示例 YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: ClusterIP
    
    • port: 80:Service 暴露的端口。
    • targetPort: 8080:Pod 内部监听的端口。
  • 访问方式

    curl http://my-service.default.svc.cluster.local
    

NodePort

  • 作用:通过每个 Node 的 固定端口30000-32767)访问,适用于集群外部访问。
  • 适用场景:用于 临时外部访问,例如开发环境调试或小规模部署。
  • 示例 YAML
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          nodePort: 30080
      type: NodePort
    
  • 访问方式
    curl http://<NodeIP>:30080
    

LoadBalancer

  • 作用:在云环境(如 AWS、GCP、Azure)中,自动创建外部负载均衡器,适用于 生产环境
  • 适用场景:用于对外暴露的服务,如 Web 服务器、API 服务器。
  • 示例 YAML
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer
    
  • 访问方式:获取 LoadBalancer 分配的外部 IP:
    kubectl get svc my-service
    

ExternalName

  • 作用:用于将 Kubernetes 内部流量 代理到外部域名,类似于 DNS 记录。
  • 适用场景:例如将 my-database Service 映射到外部 db.example.com
  • 示例 YAML
    apiVersion: v1
    kind: Service
    metadata:
      name: my-database
    spec:
      type: ExternalName
      externalName: db.example.com
    
  • 访问方式
    curl http://my-database.default.svc.cluster.local
    

Service 的解析与访问机制

Service DNS 解析

Kubernetes 内置了 DNS 解析服务,支持以下格式的域名访问:

<service-name>.<namespace>.svc.cluster.local

例如:

my-service.default.svc.cluster.local

此 DNS 解析由 CoreDNS 组件管理,Pod 内部可以直接使用 curl my-service 访问。

Service 负载均衡原理

当请求发送到 Service 时,Kubernetes 通过 iptables 或 IPVS 进行负载均衡:

  • iptables(默认)

    • 创建 NAT 规则,将请求随机转发到某个 Pod。
    • 适用于 小规模集群,性能较好。
  • IPVS(高性能)

    • 采用 哈希表 管理规则,性能比 iptables 更优。
    • 适用于 大规模集群,如万级 Pod 部署。

要启用 IPVS:

kubectl edit configmap -n kube-system kube-proxy

修改 mode: ipvs,然后重启 kube-proxy


Service 与 Ingress 的区别

特性ServiceIngress
作用连接 Pod 之间的网络连接外部流量与内部 Service
访问方式ClusterIP, NodePort, LoadBalancer通过 Ingress Controller 代理
负载均衡Kubernetes 自带需要 Ingress Controller
适用场景内部通信,或对外简单暴露复杂路由、SSL 终结

小结

  • Service 解决了 Pod 动态 IP 的问题,提供稳定的访问入口。
  • ClusterIP 适用于内部通信,NodePort 适用于简单外部访问,LoadBalancer 适用于云环境
  • Service 通过 iptables 或 IPVS 进行负载均衡
  • Service 结合 Ingress 可实现更强大的流量管理

Service 是 Kubernetes 网络的核心,理解其工作机制对于搭建可靠的微服务架构至关重要!🚀


希望这篇文章能帮助你更好地理解 Kubernetes Service 网络,有任何问题欢迎交流! 😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMYX-0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值