
# DNAT网关（DNAT）
"DNAT网关"类型的服务可以为集群内的所有节点提供网络地址转换服务，使多个节点可以共享使用弹性IP。其访问方式由NAT网关的公网弹性IP地址以及设置的访问端口组成，例如"10.117.117.117:80"。
业务需要通过公网进行临时或低流量访问的场景，可以通过DNAT类型服务进行访问。DNAT类型与节点访问类型相比增强了可靠性，弹性IP无需与单个节点绑定，任何节点状态的异常不影响其访问。
图1DNAT网关 ( DNAT )   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002389381189.png "点击放大")
#### 约束与限制
关于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的路由加入到自定义路由表中。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002395776162.png "点击放大")
  
  
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
其余关于NAT网关的产品限制，请参见[NAT网关约束与限制](https://support.huaweicloud.com/productdesc-natgateway/zh-cn_topic_0086739750.html)。
 #### 准备工作：创建NAT网关和弹性公网IP
您需要提前创建NAT网关实例和弹性公网IP，具体操作步骤如下：
1. 登录[NAT控制台](https://console.huaweicloud.com/vpc/#/nat/public/list)，单击页面右上角的"购买公网NAT网关"。下图是购买NAT网关的案例，请根据实际业务需求填写相关内容。
   
   NAT网关购买完成后，可无需添加SNAT或DNAT规则。
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   购买NAT网关，选择VPC和子网时，请确保与CCE中运行业务的集群VPC和子网一致。
   图2购买NAT网关   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002355901036.png "点击放大")
   
   
   
2. 登录[EIP控制台](https://console.huaweicloud.com/vpc/#/eip/eips/list)，单击右上角的"购买弹性公网IP"。下图是购买弹性IP的案例，请根据实际业务需求填写相关内容。
   
   图3购买弹性公网IP   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002389501081.png "点击放大")
   
   
   
 
#### 创建DNAT网关类型Service
您可以通过以下方式进行创建。
- [通过控制台创建]
- [通过kubectl命令行创建]
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"服务"，在右上角单击"创建服务"。
3. 设置DNAT网关服务的基础配置参数。 
   
   | 参数   | 说明                                                                                                                                                |
   |:---|:---|
   | 访问类型 | 选择"DNAT网关"。                                                                                                                                       |
   | 服务名称 | 自定义服务名称，可与工作负载名称保持一致。                                                                                                                             |
   | 命名空间 | 工作负载所在命名空间。                                                                                                                                       |
   | 选择器  | 您可以添加Pod标签的键值，Service将会根据标签与工作负载的Pod进行关联，将流量导向包含该标签的Pod。 您也可以引用已有工作负载的标签，单击"引用负载标签"，在弹出的窗口中选择负载，然后单击"确定"。 |
      
   
   
4. 填写访问设置参数。 
   
   | 参数     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   |:---|:---|
   | 服务亲和   | 选择将外部流量路由到节点本地或集群范围的端点，详情请参见[服务亲和（externalTrafficPolicy）](https://support.huaweicloud.com/usermanual-cce/cce_10_0249.html#cce_10_0249__section18134208069)。 - 集群级别：集群下所有节点的IP+节点端口均可以访问到此服务关联的负载，服务访问会因路由跳转导致一定性能损失，且无法获取到客户端源IP。  - 节点级别：只有通过负载所在节点的IP+节点端口才可以访问此服务关联的负载，服务访问没有因路由跳转导致的性能损失，且可以获取到客户端源IP。   |
   | DNAT网关 | 选择[准备工作：创建NAT网关和弹性公网IP]中创建的DNAT网关实例和弹性公网IP。                                                                                                                                                                                                                                                                                                                                                                                |
   | 端口配置   | - 协议：请根据业务支持的协议类型选择。  - 容器端口：业务容器进程实际监听的端口，您需要根据运行的容器镜像确定，端口范围为1\~65535。例如Nginx默认使用80端口，而MySQL的默认访问端口为3306。  - 服务端口：访问DNAT服务使用的端口，您可以根据需求进行自定义，端口范围为1\~65535。                                                                      |
      
   
   
5. 单击"创建"，创建Service。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002355900984.png "点击放大")
   
   
   
 
您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例，说明kubectl命令实现集群内访问的方法。
1. 使用kubectl连接集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
2. 创建并编辑nginx-deployment.yaml文件，配置示例工作负载，详情请参见[创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)。其中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\>。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002389501041.png "点击放大")
   
   
 
