Kubernetes Service(SVC)网络使用及说明

 更新时间:2026年01月19日 09:50:03   作者:XMYX-0  
Kubernetes通过Service资源解决了Pod动态IP的问题,提供稳定的访问入口,ClusterIP、NodePort和LoadBalancer是Service的三种类型,分别适用于内部通信、简单外部访问和云环境,Service通过iptables或IPVS进行负载均衡,并结合Ingress可实现更强大的流量管理

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 网络的核心,理解其工作机制对于搭建可靠的微服务架构至关重要!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s如何使用NFS作为StorageClass提供动态存储

    k8s如何使用NFS作为StorageClass提供动态存储

    本文主要介绍了k8s中的StorageClass,包括其定义、引入的原因、实现方式、定义方法以及回收策略对数据的影响等,首先,StorageClass是在K8s集群中创建用于动态PV的管理,可以链接至不同的后端存储,对存储的请求可以指向StorageClass
    2024-09-09
  • K8s创建资源的两种方法实例

    K8s创建资源的两种方法实例

    而在我看来,在学习K8S之前,有必要对K8S的资源对象有个全局的概念,下面这篇文章主要给大家介绍了关于K8s创建资源的两种方法,需要的朋友可以参考下
    2022-05-05
  • Kubernetes集群模拟删除k8s重装详解

    Kubernetes集群模拟删除k8s重装详解

    这篇文章主要为大家介绍了Kubernetes集群模拟删除k8s重装详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Kubernetes调度管理优先级和抢占机制详解

    Kubernetes调度管理优先级和抢占机制详解

    这篇文章主要为大家介绍了Kubernetes调度管理优先级和抢占机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • k3s安装部署流程

    k3s安装部署流程

    文章详细介绍了如何在国内配置K3s镜像源、部署仪表盘、配置角色和权限、获取仪表盘token、进行端口转发以及使用nerdctl和buildkitd构建容器镜像的方法,并附带了注意事项和验证步骤
    2026-01-01
  • k8s搭建nfs共享存储实践

    k8s搭建nfs共享存储实践

    本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限和StorageClass,实现存储验证
    2025-09-09
  • 一文讲解如何获取k8s容器里运行的jar包

    一文讲解如何获取k8s容器里运行的jar包

    K8S是Google开源的容器集群管理系统,其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台,这篇文章主要给大家介绍了关于如何获取k8s容器里运行的jar包的相关资料,需要的朋友可以参考下
    2022-09-09
  • k8s dashboard安装过程记录

    k8s dashboard安装过程记录

    这篇文章主要介绍了k8s dashboard安装过程记录,本案例k8s版本为v1.22.17,所以安装v2.7.0版本的dashboard,需要的朋友可以参考下
    2024-05-05
  • k8s中的多网卡方案multus

    k8s中的多网卡方案multus

    这篇文章主要介绍了k8s中的多网卡方案multus,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 云原生技术持久化存储PV与PVC

    云原生技术持久化存储PV与PVC

    这篇文章主要介绍了云原生技术持久化存储PV与PVC
    2022-03-03

最新评论