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