更新时间:2025-08-19 GMT+08:00

DNAT网关(DNAT)

DNAT网关类型的服务可以为集群内的所有节点提供网络地址转换服务,使多个节点可以共享使用弹性IP。其访问方式由NAT网关的公网弹性IP地址以及设置的访问端口组成,例如“10.117.117.117:80”。

业务需要通过公网进行临时或低流量访问的场景,可以通过DNAT类型服务进行访问。DNAT类型与节点访问类型相比增强了可靠性,弹性IP无需与单个节点绑定,任何节点状态的异常不影响其访问。

图1 DNAT网关 ( DNAT )

约束与限制

关于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,具体操作步骤如下:

  1. 登录NAT控制台,单击页面右上角的“购买公网NAT网关”。根据实际业务需求填写相关内容。

    NAT网关购买完成后,可无需添加SNAT或DNAT规则。

    购买NAT网关,选择VPC和子网时,请确保与CCE中运行业务的集群VPC和子网一致。

    图2 购买NAT网关

  2. 登录EIP控制台,单击右上角的“购买弹性公网IP”。根据实际业务需求填写相关内容。

    图3 购买弹性公网IP

创建DNAT网关类型Service

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”
  3. 设置DNAT网关服务的参数。

    参数

    说明

    Service名称

    自定义服务名称,可与工作负载名称保持一致。

    访问类型

    选择“DNAT网关”

    命名空间

    工作负载所在命名空间。

    服务亲和

    选择将外部流量路由到节点本地或集群范围的端点,详情请参见服务亲和(externalTrafficPolicy)
    • 集群级别:集群下所有节点的IP+节点端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
    • 节点级别:只有通过负载所在节点的IP+节点端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。

    选择器

    Service将会根据标签与工作负载的Pod进行关联,将流量导向包含该标签的Pod。

    您可以添加Pod标签的键值,填写后单击“确认添加”

    您也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”

    DNAT网关

    选择准备工作:创建NAT网关和弹性公网IP中创建的DNAT网关实例和弹性公网IP。

    端口配置

    • 协议:请根据业务支持的协议类型选择。
    • 容器端口:业务容器进程实际监听的端口,您需要根据运行的容器镜像确定,端口范围为1~65535。例如Nginx默认使用80端口,而MySQL的默认访问端口为3306。
    • 服务端口:访问DNAT服务使用的端口,您可以根据需求进行自定义,端口范围为1~65535。

  4. 单击“确定”,创建Service。

您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现集群内访问的方法。

  1. 使用kubectl连接集群,详情请参见通过kubectl连接集群
  2. 创建并编辑nginx-deployment.yaml文件,配置示例工作负载,详情请参见创建无状态负载(Deployment)。其中nginx-deployment.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

  3. 创建并编辑nginx-nat-svc.yaml文件,配置Service参数。其中nginx-nat-svc.yaml为自定义名称,您可以随意命名。

    vi nginx-nodeport-svc.yaml

    内容如下:

    apiVersion: v1 
    kind: Service 
    metadata: 
      name: nginx-nat 
      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。

    获取方法:

    在控制台的“服务列表”中,单击“网络 > NAT网关 NAT”,单击NAT网关的名称,在NAT详情页的“基本信息”页签下找到“ID”字段复制即可。

    loadBalancerIP

    String

    填写NAT网关关联的弹性公网IP。

    port

    Integer

    访问DNAT服务使用的端口,您可以根据需求进行自定义,端口范围为1~65535。

    targetPort

    String

    业务容器进程实际监听的端口,您需要根据运行的容器镜像确定,端口范围为1~65535。例如Nginx默认使用80端口,而MySQL的默认访问端口为3306。

    type

    String

    NAT网关服务需要配置为LoadBalancer类型。

  4. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下,表示工作负载已经创建。

    deployment/nginx created

    查看已创建的工作负载。

    kubectl get pod

    回显如下,工作负载状态为Running,表示工作负载已处于运行中状态。

    NAME                     READY     STATUS             RESTARTS   AGE
    nginx-2601814895-znhbr   1/1       Running            0          15s

  5. 创建服务。

    kubectl create -f nginx-nat-svc.yaml

    回显如下,表示服务开始创建。

    service/nginx-nat created

    查看已创建的Service。

    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  **.**.**.**   80:30589/TCP  5s

  6. 在浏览器中输入访问地址即可,例如<EIP>:<port>。