操作场景
节点访问( NodePort )是指在每个节点的IP上开放一个静态端口,通过静态端口对外暴露服务。节点访问 ( NodePort )会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求 :,可以从集群的外部访问一个NodePort服务。
图 NodePort访问
约束与限制
- “节点访问 ( NodePort )”默认为VPC内网访问,如果需要使用弹性IP通过公网访问该服务,请提前在集群的节点上绑定弹性IP。
- 创建service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建service后不要修改服务亲和属性,如需修改请重新创建service。
- VPC网络模式下,当某容器A通过NodePort类型服务发布时,且服务亲和设置为节点级别(即externalTrafficPolicy为local),部署在同节点的容器B将无法通过节点IP+NodePort访问容器A。
创建NodePort类型Service
步骤 1 登录CCE控制台,单击集群名称进入集群。
步骤 2 在左侧导航栏中选择“服务发现”,在右上角单击“创建服务”。
步骤 3 设置集群内访问参数。
-
Service名称: 自定义服务名称,可与工作负载名称保持一致。
-
访问类型 :选择“节点访问 NodePort”。
-
命名空间:工作负载所在命名空间。
-
服务亲和: 详情请参见externalTrafficPolicy(服务亲和)。
- 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
- 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
-
选择器: 添加标签,Service根据标签选择Pod,填写后单击“添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。
-
IPv6: 默认不开启,开启后服务的集群内IP地址(ClusterIP)变为IPv6地址。该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。
-
端口配置:
- 协议:请根据业务的协议类型选择。
- 服务端口:Service使用的端口,端口范围为1-65535。
- 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
- 节点端口:即NodePort,建议选择“自动生成”;也可以指定端口,默认范围为30000-32767。
步骤 4 单击“确定”,创建Service。
externalTrafficPolicy(服务亲和)
NodePort类型的Service接收请求时先从访问到节点,然后转到Service,再由Service选择一个Pod转发到该Pod,选择的Pod不一定在接收请求的节点上。默认情况下,从任意节点IP+服务端口都能访问到后端工作负载,当Pod不在接收请求的节点上时,请求会在跳转到Pod所在的节点,带来一定性能损失。
Service有一个配置参数externalTrafficPolicy,如下所示。
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 ,也是默认取值,就是前面说的请求会在集群内转发。
在CCE 控制台创建NodePort类型Service时也可以配置该参数。
总结externalTrafficPolicy两个取值。
- cluster(集群级别):集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
- local(节点级别):只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。