当前位置:首页 > 技术 > 正文内容

Kubernetes Service 详解:稳定访问端点的核心机制

访客 技术 2026年6月17日 1

在 Kubernetes 集群中,Pod 是最小的部署单元,但它的 IP 地址是动态变化的。当一个 Pod 被销毁并由控制器(如 Deployment)重新创建时,新的 Pod 会获得一个新的 IP 地址。这对需要访问这些 Pod 的前端应用或其他服务来说是个问题——它们无法依赖一个固定的 IP 来通信。为了解决这个问题,Kubernetes 引入了 Service 资源。

什么是 Service?

Service 定义了一组 Pod 的稳定访问入口。它通过标签选择器(Label Selector)找到匹配的 Pod 集合,并将流量负载均衡到这些 Pod 上。Service 的 IP 地址(ClusterIP)在生命周期内保持不变,从而实现了前端应用与后端 Pod 的解耦。

ReplicaSet 或 Deployment 等控制器负责维护 Pod 的副本数量,确保服务的高可用性。而 Service 则负责提供固定的网络端点。

实战:创建 Nginx 服务并暴露为 Service

首先,创建一个 Nginx Deployment:

kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1

查看 Pod:

kubectl get pod | grep nginx

输出示例:

nginx-deploy-84cbfc56b6-7v59n   1/1     Running   0          4m1s

直接访问 Pod IP:

curl 172.20.0.64

你会看到 Nginx 的欢迎页面。但如果删除这个 Pod,Deployment 会重新创建一个,新的 Pod IP 会不同。为了解决这个问题,创建一个 Service:

kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP

查看 Service:

kubectl get svc | grep nginx

输出示例:

nginx          ClusterIP   10.68.23.129   <none>        80/TCP     18s

现在访问 Service IP:

curl 10.68.23.129

即使 Pod 被重建,这个 IP 仍然有效,因为 Service 会自动将流量转发到新的 Pod。

Service 的 DNS 解析

如果集群安装了 CoreDNS,Service 可以通过 DNS 名称访问。默认的 DNS 格式为 <service-name>.<namespace>.svc.cluster.local。例如,创建一个 BusyBox 客户端来测试:

kubectl run client --image=busybox --replicas=1 -it --restart=Never

在容器内执行:

wget -O - -q http://nginx:80

你可以看到与直接访问 IP 相同的结果。这意味着客户端可以通过 Service 名称(如 nginx)来访问,而不需要知道具体的 IP 地址。

深入理解 Service 的工作原理

Service 本质上是通过 iptables 或 IPVS 规则实现的。当你创建一个 Service 时,Kubernetes 会在每个节点上配置相应的规则,将发往 Service IP 的流量转发到后端的 Pod。我们可以查看 Service 关联的端点:

kubectl describe svc nginx

输出中的 Endpoints 字段显示了当前后端的 Pod IP 列表。标签选择器 Selector 决定了哪些 Pod 会被纳入 Service 的后端。

动态扩容与负载均衡

创建一个新的 Deployment:

kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2

查看 Pod 信息:

kubectl get pod -o wide | grep myapp

然后为它创建 Service:

kubectl expose deployment myapp --name=myapp --port=80

现在,从客户端访问这个 Service:

wget -O - -q myapp

使用循环测试负载均衡:

while true; do wget -O - -q myapp/hostname.html; sleep 1; done

你会看到请求被均匀地分发到两个 Pod 上:

myapp-9b4987d5-tcg4p
myapp-9b4987d5-jngkk

验证 Service 的底层实现

Service IP 无法 ping 通,因为它不是真实的网络接口,而是 iptables 规则。我们可以查看节点上的 NAT 规则:

iptables -vnL -t nat

输出中包含了 KUBE-SERVICES 链,其中定义了所有 Service 的转发规则。

外部访问:NodePort 类型

默认的 ClusterIP 只能在集群内部访问。如果希望外部用户访问,可以将 Service 类型改为 NodePort:

kubectl edit svc myapp

spec.typeClusterIP 改为 NodePort,Kubernetes 会自动在节点上开放一个端口(范围 30000-32767),外部可以通过 <节点IP>:<NodePort> 访问。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。