云其它

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > 云其它 > Kubernetes Service(SVC)网络

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

作者: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 解决了这个问题,提供了一个 稳定的访问方式

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(默认类型)

示例 YAML

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

访问方式

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

NodePort

示例 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

示例 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

示例 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(默认)

IPVS(高性能)

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

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

您可能感兴趣的文章:
阅读全文