
# Ingress
上一节中讲了创建LoadBalancer类型的Service，使用ELB实例从外部访问Pod。
但是Service是基于四层TCP和UDP协议转发的，Ingress可以基于七层的HTTP和HTTPS协议转发，可以通过域名和路径做到更细粒度的划分，如下图所示。
图1Ingress-Service   
![](https://support.huaweicloud.com/devg-cci/zh-cn_image_0197967933.png "点击放大")
在云容器实例中，使用Ingress绑定ELB的IP和端口，实现外部访问，如[图2]所示。
图2Ingress   
![](https://support.huaweicloud.com/devg-cci/zh-cn_image_0197968810.png "点击放大")
#### ELB实例
Ingress支持绑定增强型ELB实例，您可以调用[创建负载均衡器（增强型）](https://support.huaweicloud.com/api-elb/zh-cn_topic_0096561535.html)创建ELB实例，更方便的方法是通过[ELB控制台](https://console.huaweicloud.com/vpc/?#/elb/manager/elbflag/elbList/enhanceElb)创建增强型ELB实例。
ELB实例根据IP地址不同可以分为私网ELB实例和公网ELB实例，区别在于公网ELB实例绑定了一个公网IP，您可以根据需要选择。
#### 创建Ingress
- 使用http协议创建Ingress
  下面例子中，关联的backend为"nginx:8080"，当访问"http://10.10.10.10:6071/"时，流量转发"nginx:8080"对应的Service，从而将流量转发到对应负载中的Pod。
  ```
  apiVersion: extensions/v1beta1                                   # Ingress的版本
  kind: Ingress
  metadata:
    name: nginx
    labels:
      app: nginx
      isExternal: "true"   # 系统预留字段，必选参数，取值必须为 "true"
      zone: data         # 系统预留字段，数据平面模式，必选参数，取值必须为data
    annotations:
      kubernetes.io/elb.id: 2d48d034-6046-48db-8bb2-53c67e8148b5   # ELB实例的ID，必选参数
      kubernetes.io/elb.ip: 192.168.137.182                        # ELB实例的IP，可选参数
      kubernetes.io/elb.port: '6071'                               # ELB实例的端口，必选参数
  spec:
    rules:                                                         # 路由规则
    - http:                                                        # 使用http协议                      
        paths:
        - path: /                                                  # 路由 
          backend:
            serviceName: nginx                                     # 转发到的Service名称
            servicePort: 8080                                      # 转发到的Service端口
  ```
  Ingress中还可以设置外部域名，这样您就可以通过域名来访问到ELB，进而访问到后端服务。
  ![](https://support.huaweicloud.com/devg-cci/public_sys-resources/note_3.0-zh-cn.png)
  域名访问依赖于域名解析，需要您将域名解析指向ELB实例的IP地址，例如您可以使用[云解析服务 DNS](https://www.huaweicloud.com/product/dns.html)来实现域名解析。
  ```
  spec:
    rules:
    - host: www.example.com       # 域名
      http:
        paths:
        - path: /
          backend:
            serviceName: nginx
            servicePort: 80
  ```
  

- 使用https协议创建Ingress
  下面例子中，关联的backend为"nginx:8080"，当访问"https://10.10.10.10:6071/"时，流量转发"nginx:8080"对应的Service，从而将流量转发到对应负载中的Pod。
  ```
  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/elb.id: 2d48d034-6046-48db-8bb2-53c67e8148b5
      kubernetes.io/elb.ip: 192.168.137.182
      kubernetes.io/elb.port: '6071'
    labels:
      app: nginx
      isExternal: 'true'
      zone: data
    name: nginx
  spec:
    rules:
    - http:
        paths:
        - backend:
            serviceName: nginx
            servicePort: 8080
          path: /
    tls:
   - secretName: cci-sslcertificate-20214221                                 # 上传的SSL证书的名称
  ```
  
 
#### 路由到多个服务
Ingress可以同时路由到多个服务，配置如下所示。
- 当访问"http://foo.bar.com/foo"时，访问的是"s1:80"后端。
- 当访问"http://foo.bar.com/bar"时，访问的是"s2:80"后端。
```
spec:
  rules:
  - host: foo.bar.com          # host地址
    http:
      paths:
      - path: "/foo"
        backend:
          serviceName: s1
          servicePort: 80
      - path: "/bar"
        backend:
          serviceName: s2
          servicePort: 80
```
#### 配置URL重定向的路由服务
以如下模板为例，Ingress对接了名为service-test的后端服务，访问这个Ingress的 "/service-test" 路径会被重定向到后端服务service-test的"/"路径下面。
```
cat <<-EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-redirect-test
  namespace: default
 spec:
  rules:
  - host: ingress-test.com
    http:
      paths:
      - path: /
        backend:
          serviceName: service-test
          servicePort: 80
EOF
```
