DNAT网关(DNAT)
操作场景
“DNAT网关”可以为集群节点提供网络地址转换服务,使多个节点可以共享使用弹性IP。
NAT网关与弹性IP方式相比增强了可靠性,弹性IP无需与单个节点绑定,任何节点状态的异常不影响其访问。访问方式由公网弹性IP地址以及设置的访问端口组成,例如“10.117.117.117:80”。
约束与限制
关于NAT网关的使用,您需要注意以下几点:
- DNAT规则不支持企业项目授权。
- 集群内容器不支持访问externalTrafficPolicy为Local模式的DNAT Service。
- 同一个NAT网关下的多条规则可以复用同一个弹性公网IP,不同网关下的规则必须使用不同的弹性公网IP。
- 每个VPC支持的NAT网关数为1。
- 用户不能在VPC下手动添加默认路由。
- VPC内的每个子网只能添加一条SNAT规则。
- SNAT规则和DNAT规则一般面向不同的业务,如果使用相同的EIP,会面临业务相互抢占问题,请尽量避免。SNAT规则不能和全端口的DNAT规则共用EIP。
- DNAT规则不支持将弹性公网IP绑定到虚拟IP。
- 当云主机同时配置弹性公网IP服务和NAT网关服务时,数据均通过弹性公网IP转发。
- SNAT规则中添加的自定义网段,对于虚拟私有云的配置,必须是虚拟私有云子网网段的子集,不能相等。
- SNAT规则中添加的自定义网段,对于云专线的配置,必须是云专线侧网段,且不能与虚拟私有云侧的网段冲突。
- 当执行云服务器底层资源操作(如变更规格)时,会导致已配置的NAT规则失效,需要删除后重新配置。
- 创建service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建service后不要修改服务亲和属性,如需修改请重新创建service。
- 当集群的节点子网关联了自定义路由表时,使用DNAT类型service同时需要将NAT的路由加入到自定义路由表中。
其余关于NAT网关的产品限制,请参见NAT网关约束与限制。
创建NAT网关和弹性公网IP
您需要提前创建NAT网关实例和弹性公网IP,具体操作步骤如下:
- 登录管理控制台,在服务列表中选择“网络 > NAT网关”,单击页面右上角的“购买公网NAT网关”。根据实际业务需求填写相关内容。
购买NAT网关,选择VPC和子网时,请确保与CCE中运行业务的集群VPC和子网一致。
- 在管理控制台,在服务列表中选择“网络 > 弹性公网IP”,单击右上角的“购买弹性公网IP”。根据实际业务需求填写相关内容。
创建DNAT网关类型Service
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。
- 设置集群内访问参数。
- Service名称:自定义服务名称,可与工作负载名称保持一致。
- 访问类型:选择“DNAT网关”。
- 命名空间:工作负载所在命名空间。
- 服务亲和:详情请参见服务亲和(externalTrafficPolicy)。
- 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
- 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
- 选择器:添加标签,Service根据标签选择Pod,填写后单击“添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。
- IPv6:默认不开启,开启后服务的集群内IP地址(ClusterIP)变为IPv6地址,具体请参见如何通过CCE搭建IPv4/IPv6双栈集群?。该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。
- DNAT网关:选择创建NAT网关和弹性公网IP中创建的DNAT网关实例和弹性公网IP。
- 端口配置:
- 协议:请根据业务的协议类型选择。
- 容器端口:工作负载程序实际监听的端口,需用户确定。nginx程序实际监听的端口为80。
- 服务端口:容器端口映射到集群虚拟IP上的端口,用虚拟IP访问工作负载时使用,端口范围为1-65535,可任意指定。
- 单击“确定”,创建Service。
通过kubectl命令行创建
您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现集群内访问的方法。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建并编辑nginx-deployment.yaml以及nginx-nat-svc.yaml文件。
其中,nginx-deployment.yaml和nginx-nat-svc.yaml为自定义名称,您可以随意命名。
vi nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest name: nginx imagePullSecrets: - name: default-secret
以上字段的解释请参见表1。
vi nginx-nat-svc.yaml
apiVersion: v1 kind: Service metadata: name: nginx annotations: kubernetes.io/elb.class: dnat kubernetes.io/natgateway.id: e4a1cfcf-29df-4ab8-a4ea-c05dc860f554 spec: loadBalancerIP: 10.78.42.242 ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
表1 关键参数说明 参数
是否必填
参数类型
描述
kubernetes.io/elb.class
是
String
该参数配置为DNAT用于对接NAT网关服务添加DNAT规则。
kubernetes.io/natgateway.id
是
String
用于指定NAT网关ID。
loadBalancerIP
是
String
公网弹性IP。
port
是
Integer
对应界面上的访问端口,取值范围为1 ~ 65535。
targetPort
是
String
对应界面上的容器端口,取值范围为1 ~ 65535。
type
是
String
NAT网关服务需要配置为LoadBalancer类型。
- 创建工作负载。
kubectl create -f nginx-deployment.yaml
回显如下表示工作负载开始创建。
deployment "nginx" created
kubectl get po
回显如下,工作负载状态为Running,表示工作负载已运行中。
NAME READY STATUS RESTARTS AGE nginx-2601814895-sf71t 1/1 Running 0 8s
- 创建服务。
kubectl create -f nginx-nat-svc.yaml
回显如下表示服务已创建成功。
service "nginx-eip" created
kubectl get svc
回显如下表示服务访问方式已设置成功。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 3d nginx-nat LoadBalancer 10.247.226.2 10.154.74.98 80:30589/TCP 5s
- 在浏览器中输入访问地址,例如为10.154.74.98:80访问地址。
其中10.154.74.98为弹性IP地址,80为上一步中获取的节点端口号。