配置服务
在 Kubernetes 中,Service 是一种用于暴露集群中作为一个或多个 Pod 运行的网络应用的方法。
目录
为什么需要 ServiceClusterIP 类型 Service 示例:无头服务使用 Web 控制台创建服务使用 CLI 创建服务示例:访问集群内的应用示例:访问集群外的应用示例:ExternalName 类型的服务LoadBalancer 类型 Service 注解AWS EKS 集群Huawei Cloud CCE 集群Azure AKS 集群Google GKE 集群示例:使用 MetalLB BGP 和本地流量策略的 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。
无头服务
有时您不需要负载均衡和单个 Service IP。在这种情况下,您可以创建所谓的无头服务:
无头服务适用于以下场景:
-
您希望发现单个 Pod IP,而不仅仅是单个 Service IP。
-
您需要直接连接到每个 Pod(例如,用于 Cassandra 等数据库或 StatefulSet)。
-
您使用的是 StatefulSet,其中每个 Pod 都必须具有稳定的 DNS 名称。
使用 Web 控制台创建服务
-
转到 容器平台。
-
在左侧导航栏中,单击 网络 > 服务。
-
单击 创建服务。
-
按照以下说明配置相关参数。
-
单击 创建。
使用 CLI 创建服务
基于现有的 Deployment 资源 my-app 创建服务。
示例:访问集群内的应用
-
应用此 YAML:
-
启动另一个 Pod:
-
在
test-podPod 中访问nginx-clusterip服务:
你应会看到包含类似“Welcome to nginx!”文本的 HTML 响应。
示例:访问集群外的应用
-
应用此 YAML:
-
检查 Pod:
-
使用 curl 访问 Service:
你应会看到包含类似“Welcome to nginx!”文本的 HTML 响应。
当然,也可以通过创建 LoadBalancer 类型的 Service 从集群外部访问应用。
注意:请提前配置 LoadBalancer Service。
-
应用此 YAML:
-
获取外部 IP 地址:
EXTERNAL-IP是你在浏览器中访问的地址。
你应会看到包含类似“Welcome to nginx!”文本的 HTML 响应。
如果 EXTERNAL-IP 为 pending,则表示 LoadBalancer Service 当前未部署在集群上。
示例:ExternalName 类型的服务
-
应用此 YAML:
-
尝试在集群中的某个 Pod 内解析:
然后:
你会看到它解析为 example.com。
LoadBalancer 类型 Service 注解
AWS EKS 集群
有关 EKS LoadBalancer Service 注解的详细说明,请参阅注解使用文档。
Huawei Cloud CCE 集群
有关 CCE LoadBalancer Service 注解的详细说明,请参阅注解使用文档。
Azure AKS 集群
有关 AKS LoadBalancer Service 注解的详细说明,请参阅注解使用文档。
Google GKE 集群
有关 GKE LoadBalancer Service 注解的详细说明,请参阅注解使用文档。
示例:使用 MetalLB BGP 和本地流量策略的 LoadBalancer
此示例演示如何使用 MetalLB BGP 模式和 externalTrafficPolicy: Local 配置 LoadBalancer Service,从而实现无需额外网络跳转的双活负载均衡。
优势
- 双活负载均衡:流量可同时分发到多个节点
- 无额外网络跳转:无需通过中间节点转发即可直接路由到 Pod
- 更高性能:
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 nodeSelectors 指定的节点进行通告
- BGP Peer 接收这些通告,并据此路由流量
- BGPPeer 与 BGPAdvertisement 之间的节点选择器保持一致,可确保路由一致性
部署步骤
-
部署应用:
-
验证 LoadBalancer Service:
预期输出:
-
测试服务:
验证
- 监控服务端点:
kubectl get endpoints nginx-loadbalancer-local - 检查服务状态:
kubectl describe svc nginx-loadbalancer-local
商标声明
NGINX® 是 F5, Inc. 在美国及其他国家/地区的注册商标。
MetalLB™ 是 The Linux Foundation 的商标。
Alauda 是一家独立供应商。本产品与 The Linux Foundation 或 F5, Inc. 无关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,仅用于标识目的。