配置服务
在 Kubernetes 中,Service 是一种用于暴露运行在集群中一个或多个 Pod 上的网络应用的方法。
目录
为什么需要 ServiceClusterIP 类型 Service 示例:Headless 服务通过 Web 控制台创建服务通过 CLI 创建服务示例:集群内访问应用示例:集群外访问应用示例:ExternalName 类型的 ServiceLoadBalancer 类型 Service 注解AWS EKS 集群华为云 CCE 集群Azure AKS 集群Google GKE 集群示例:使用 MetalLB BGP 和 Local Traffic Policy 的 LoadBalancer优势前提条件步骤关键配置点externalTrafficPolicy: Local使用 BGP 的 LoadBalancer部署步骤验证为什么需要 Service
-
Pod 有自己的 IP,但:
-
Pod IP 不稳定(如果 Pod 被重新创建,IP 会变化)。
-
直接访问 Pod 变得不可靠。
-
-
Service 通过提供以下功能解决了这个问题:
-
稳定的 IP 和 DNS 名称。
-
自动负载均衡到匹配的 Pod。
-
ClusterIP 类型 Service 示例:
- 可用的 type 值及其行为包括
ClusterIP、NodePort、LoadBalancer、ExternalName - Service 目标的 Pod 集合通常由你定义的 selector 决定。
Service端口。- 将 Service 的
targetPort绑定到 Pod 的containerPort。此外,也可以引用 Pod 容器下的port.name。
Headless 服务
有时你不需要负载均衡和单一的 Service IP。在这种情况下,可以创建所谓的 Headless 服务:
Headless 服务适用于:
-
你想发现单个 Pod 的 IP,而不仅仅是单一的服务 IP。
-
你需要直接连接到每个 Pod(例如,像 Cassandra 或 StatefulSets 这样的数据库)。
-
你使用 StatefulSets,其中每个 Pod 必须有稳定的 DNS 名称。
通过 Web 控制台创建服务
-
进入 Container Platform。
-
在左侧导航栏点击 Network > Services。
-
点击 Create Service。
-
参考以下说明配置相关参数。
-
点击 Create。
通过 CLI 创建服务
基于已有的 deployment 资源 my-app 创建服务。
示例:集群内访问应用
-
应用该 YAML:
-
启动另一个 Pod:
-
在
test-podPod 中访问nginx-clusterip服务:
你应该能看到包含 “Welcome to nginx!” 字样的 HTML 响应。
示例:集群外访问应用
-
应用该 YAML:
-
查看 Pods:
-
curl 访问 Service:
你应该能看到包含 “Welcome to nginx!” 字样的 HTML 响应。
当然,也可以通过创建 LoadBalancer 类型的 Service 从集群外访问应用。
注意:请提前配置 LoadBalancer 服务。
-
应用该 YAML:
-
获取外部 IP 地址:
EXTERNAL-IP即为你从浏览器访问的地址。
你应该能看到包含 “Welcome to nginx!” 字样的 HTML 响应。
如果 EXTERNAL-IP 显示为 pending,说明 LoadBalancer 服务尚未在集群中部署。
示例:ExternalName 类型的 Service
-
应用该 YAML:
-
尝试在集群内的 Pod 中解析:
然后执行:
你会看到它解析为 example.com。
LoadBalancer 类型 Service 注解
AWS EKS 集群
有关 EKS LoadBalancer Service 注解的详细说明,请参阅 Annotation Usage Documentation 。
华为云 CCE 集群
有关 CCE LoadBalancer Service 注解的详细说明,请参阅 Annotation Usage Documentation 。
Azure AKS 集群
有关 AKS LoadBalancer Service 注解的详细说明,请参阅 Annotation Usage Documentation 。
Google GKE 集群
有关 GKE LoadBalancer Service 注解的详细说明,请参阅 Annotation Usage Documentation 。
示例:使用 MetalLB BGP 和 Local Traffic Policy 的 LoadBalancer
本示例演示如何使用 MetalLB BGP 模式配置 LoadBalancer 类型的 Service,并设置 externalTrafficPolicy: Local,实现无额外网络跳转的主动-主动负载均衡。
优势
- 主动-主动负载均衡:流量同时分布到多个节点
- 无额外网络跳转:直接路由到 Pod,无需节点中转转发
- 更好性能:
externalTrafficPolicy: Local保留源 IP,降低延迟 - 高可用性:BGP 路由公告确保流量到达健康节点
前提条件
配置 LoadBalancer Service 前,请确保:
- 已部署 MetalLB:参见 创建外部 IP 地址池 了解安装方法
- 已配置 BGP Peer:参见 创建 BGP Peers 了解 BGP 配置
- 外部 IP 地址池:配置带有 BGPAdvertisement 的 IPAddressPool
步骤
使用 externalTrafficPolicy: Local 部署带 LoadBalancer 的应用:
关键配置点
externalTrafficPolicy: Local
externalTrafficPolicy: Local 设置带来多项好处:
- 保留源 IP:客户端源 IP 得以保留,便于日志记录和安全策略
- 直接路由 Pod:流量直接到达 Pod,无需节点级转发
使用 BGP 的 LoadBalancer
使用 MetalLB BGP 模式时:
- 路由由 BGPAdvertisement 中 nodeSelectors 指定的节点发布
- BGP Peer 接收路由公告并进行流量路由
- BGPPeer 和 BGPAdvertisement 的节点选择器需匹配,确保路由一致性
部署步骤
-
部署应用:
-
验证 LoadBalancer Service:
预期输出:
-
测试服务:
验证
- 监控服务端点:
kubectl get endpoints nginx-loadbalancer-local - 检查服务状态:
kubectl describe svc nginx-loadbalancer-local