# 通过Kubectl命令行创建Nginx Ingress
本节以[Nginx工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html#cce_10_0047__section155246177178)为例，说明kubectl命令添加Nginx Ingress的方法。
#### 关于CCE v1.23集群中Ingress API版本升级的说明
CCE从v1.23版本集群开始，将Ingress切换到**networking.k8s.io/v1**版本。
v1版本的参数相较v1beta1版本的参数有如下区别：
- ingress类型由annotations中**kubernetes.io/ingress.class** 变为使用**spec.ingressClassName**字段。
- **backend**的写法变化。
- 每个路径下必须指定路径类型**pathType** ，支持如下类型。
  - ImplementationSpecific: 对于这种路径类型，匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式，这与v1beta1方式相同。
  
  - Exact：精确匹配 URL 路径，且区分大小写。
  
  - Prefix：基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写，并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。
   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001234708000.png "点击放大")
#### 前提条件
- Ingress为后端工作负载提供网络访问，因此集群中需提前部署可用的工作负载。若您无可用工作负载，可参考[创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)、[创建有状态负载（StatefulSet）](https://support.huaweicloud.com/usermanual-cce/cce_10_0048.html)或[创建守护进程集（DaemonSet）](https://support.huaweicloud.com/usermanual-cce/cce_10_0216.html)部署工作负载。
- 为上述工作负载配置ClusterIP类型或NodePort类型的Service，可参考[集群内访问（ClusterIP）](https://support.huaweicloud.com/usermanual-cce/cce_10_0011.html)或[节点访问（NodePort）](https://support.huaweicloud.com/usermanual-cce/cce_10_0142.html)配置示例Service。
- 添加Nginx Ingress时，需在集群中提前安装NGINX Ingress 控制器，具体操作可参考[安装插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0034.html#cce_10_0034__section1152424015224)。
 
#### 约束与限制
- **不建议在ELB服务页面修改ELB实例的任何配置，否则将导致服务异常。**如果您已经误操作，请卸载Nginx Ingress插件后重装。
- Ingress转发策略中注册的URL需与后端应用提供访问的URL一致，否则将返回404错误。
- 负载均衡实例需与当前集群处于相同VPC 且为相同公网或私网类型。
- 负载均衡实例需要拥有至少两个监听器配额，且端口80和443没有被监听器占用。
- 在CCE Standard集群中，当NGINX Ingress控制器插件对接的ELB开启"获取客户端IP"功能时（独享型ELB默认开启，共享型ELB为手动开启），插件控制器Pod（名为cceaddon-nginx-ingress-controller）所在节点以及该节点上的其他容器，无法使用该ELB的私网地址访问Ingress。这是因为源IP透传后，访问流量的源地址与目的地址相同，导致流量无法正常转发。
 
#### 添加Nginx Ingress
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本，之前版本集群使用networking.k8s.io/v1beta1。v1版本与v1beta1版本的区别请参见[关于CCE v1.23集群中Ingress API版本升级的说明]。
   以HTTP协议访问为例，YAML文件配置如下。
   **1.23及以上版本集群** ：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-test
   spec:
     rules:
       - host: ''
         http:
           paths:
             - path: /
               backend:
                 service:
                   name: <your_service_name>  #替换为您的目标服务名称
                   port:
                     number: <your_service_port>  #替换为您的目标服务端口
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
     ingressClassName: nginx   # 表示使用Nginx Ingress。如果集群中安装了多套NGINX Ingress控制器，需将nginx替换为自定义的控制器名称，用于识别Ingress对接的控制器实例
   ```
   **1.21及以下版本集群** ：
   ```
   apiVersion: networking.k8s.io/v1beta1
   kind: Ingress
   metadata:
     name: ingress-test
     namespace: default
     annotations:
       kubernetes.io/ingress.class: nginx   # 表示使用Nginx Ingress
   spec:
     rules:
       - host: ''
         http:
           paths:
             - path: '/'
               backend:
                 serviceName: <your_service_name>  #替换为您的目标服务名称
                 servicePort: <your_service_port>  #替换为您的目标服务端口
   ```
   表1关键参数说明 
   | 参数                                         | 是否必填                                           | 参数类型    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|:---|:---|
   | kubernetes.io/ingress.class                 | 是（仅1.21及以下集群）                                | String  | nginx：表示使用Nginx Ingress，未安装NGINX Ingress控制器插件时无法使用。 创建Nginx Ingress时必须指定该参数，否则默认创建ELB Ingress。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | ingressClassName                           | 是 （仅1.23及以上集群） | String | nginx：表示使用Nginx Ingress，未安装NGINX Ingress控制器插件时无法使用。 当NGINX Ingress控制器插件为2.5.4及以上时，集群中支持同时安装多套NGINX Ingress控制器，该参数值需设置为安装控制器时指定的自定义[控制器名称](https://support.huaweicloud.com/usermanual-cce/cce_10_0034.html#cce_10_0034__li0953175016455)，表示该Ingress由此控制器进行管理。 创建Nginx Ingress时必须指定该参数，否则默认创建ELB Ingress。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | host                                    | 否                                            | String  | 为服务访问域名配置，默认为""，表示域名全匹配。请确保所填写的域名已注册并备案，一旦配置了域名规则后，必须使用域名访问。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | path                                    | 是                                            | String | 为路由路径，用户自定义设置。所有外部访问请求需要匹配host和path。 说明： - Nginx Ingress的访问路径匹配规则是基于"/"符号分隔的路径前缀匹配，并区分大小写。只要访问路径以"/"符号分隔后的子路径匹配此前缀，均可正常访问，但如果该前缀仅是子路径中的部分字符串，则不会匹配。例如URL设置为/healthz，则匹配/healthz/v1，但不匹配/healthzv1。  - 此处添加的访问路径要求后端应用内存在相同的路径，否则转发无法生效。 例如，Nginx应用默认的Web访问路径为"/usr/share/nginx/html"，在为Ingress转发策略添加"/test"路径时，需要应用的Web访问路径下也包含相同路径，即"/usr/share/nginx/html/test"，否则将返回404。                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | ingress.beta.kubernetes.io/url-match-mode | 否                                            | String   | 路由匹配策略。 默认值为"STARTS_WITH"(前缀匹配)。 取值范围： - EQUAL_TO：精确匹配  - STARTS_WITH：前缀匹配                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | pathType                                 | 是                                             | String   | 路径类型，该字段仅v1.23及以上集群支持。 - ImplementationSpecific: 匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式。  - Exact：精确匹配 URL 路径，且区分大小写。  - Prefix：前缀匹配，且区分大小写。该方式是将URL路径通过"/"分隔成多个元素 ，并且对元素进行逐个匹配。 如果URL中的每个元素均和路径匹配，则说明该URL的子路径均可以正常路由。 说明： - Prefix匹配时每个元素均需精确匹配，如果URL的最后一个元素是请求路径中最后一个元素的子字符串，则不会匹配 。例如：/foo/bar匹配/foo/bar/baz，但不匹配/foo/barbaz。  - 通过"/"分隔元素时，若URL或请求路径以"/"结尾，将会忽略结尾的"/"。例如：/foo/bar会匹配/foo/bar/。      关于Ingress路径匹配示例，请参见[示例](https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/)。 |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS   HOSTS     ADDRESS          PORTS   AGE
   ingress-test  nginx   *         121.**.**.**     80      10s
   ```
   
   
5. 访问工作负载（例如[Nginx工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html#cce_10_0047__section155246177178)），在浏览器中输入访问地址"http://121.\*\*.\*\*.\*\*:80"进行验证。
   
   其中，"121.\*\*.\*\*.\*\*"为统一负载均衡实例的IP地址。
   
   
 
#### 相关文档
- 如果您需要获取客户端源IP，详情请参见[不同场景下容器内获取客户端源IP](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00035.html)。
- 如果您需要使用更多Nginx Ingress的高级功能，请参见[Nginx Ingress注解（Annotations）配置案例合集](https://support.huaweicloud.com/usermanual-cce/cce_10_0699.html)。
  Nginx Ingress支持更多社区的原生注解，详情请参考[Annotations](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/)。
  
- 如果出现从外部无法访问Ingress的问题，请参见[集群外部访问Ingress异常](https://support.huaweicloud.com/cce_faq/cce_faq_00313.html)逐步排查根因。
 
