云容器引擎 CCE-服务概述:服务亲和(externalTrafficPolicy)

时间:2024-05-31 08:37:31

服务亲和(externalTrafficPolicy)

NodePort类型及LoadBalancer类型的Service接收请求时,会先访问到节点,然后转到Service,再由Service选择一个Pod转发到该Pod,但Service选择的Pod不一定在接收请求的节点上。默认情况下,从任意节点IP+服务端口都能访问到后端工作负载,当Pod不在接收请求的节点上时,请求会再跳转到Pod所在的节点,带来一定性能损失。

Service有一个配置参数(externalTrafficPolicy),用于设置Service是否希望将外部流量路由到节点本地或集群范围的端点,示例如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  externalTrafficPolicy: Local
  ports:
  - name: service
    nodePort: 30000
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort

当externalTrafficPolicy取值为Local时,通过节点IP:服务端口的请求只会转发给本节点上的Pod,如果节点没有Pod的话请求会挂起。

当externalTrafficPolicy取值为Cluster时,请求会在集群内转发,从任意节点IP+服务端口都能访问到后端工作负载。

如不设置externalTrafficPolicy,默认取值为Cluster

在CCE 控制台创建NodePort类型Service时,也可以通过“服务亲和”选项配置该参数。

总结服务亲和(externalTrafficPolicy)的两个选项对比如下:

表1 服务亲和特性对比

对比维度

服务亲和(externalTrafficPolicy)

集群级别(Cluster)

节点级别(Local)

使用场景

适用于对性能要求不高,无需保留客户端源IP场景,此方式能为集群各节点带来更均衡的负载。

适用于客户端源IP需要保留且对性能要求较高的业务,但是流量仅会转发至容器所在的节点,不会做源地址转换。

访问方式

集群下所有节点的IP+访问端口均可以访问到此服务关联的负载。

只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载。

获取客户端源IP

无法获取到客户端源IP。

可以获取到客户端源IP。

访问性能

服务访问会因路由跳转导致一定性能损失,可能导致第二跳到另一个节点。

服务访问没有因路由跳转导致的性能损失。

负载均衡性

流量传播具有良好的整体负载均衡性。

存在潜在的不均衡流量传播风险。

其他特殊情况

-

在不同容器网络模型和服务转发模式下,可能出现集群内无法访问Service的情况,详情请参见集群内无法访问Service的说明

support.huaweicloud.com/usermanual-cce/cce_10_0249.html