# Ingress
#### 介绍视频
<video controls="controls" preload="none" id="object956365920304" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/video/cce/ingress(1).mp4" title="Ingress" poster="https://support.huaweicloud.com/basics-cce/zh-cn_image_0000002358225253.jpg" height="340.0000" width="600.0000"></video>
#### 为什么需要Ingress
Service是基于四层TCP和UDP协议转发的，而Ingress可以基于七层的HTTP和HTTPS协议转发，可以通过域名和路径做到更细粒度的划分，如下图所示。
图1Ingress-Service   
![](https://support.huaweicloud.com/basics-cce/zh-cn_image_0258961458.png "点击放大")
#### Ingress工作机制
要想使用Ingress功能，必须在Kubernetes集群上安装Ingress Controller。Ingress Controller有很多种实现，最常见的就是Kubernetes官方维护的[ingress-nginx](https://github.com/kubernetes/ingress-nginx)；不同厂商通常有自己的实现，例如CCE使用弹性负载均衡服务ELB实现Ingress的七层负载均衡。
外部请求首先到达Ingress Controller，Ingress Controller根据Ingress的路由规则，查找到对应的Service，进而通过Endpoint查询到Pod的IP地址，然后将请求转发给Pod。
图2Ingress工作机制   
![](https://support.huaweicloud.com/basics-cce/zh-cn_image_0261720089.png "点击放大")
#### 创建Ingress
下面例子中，使用http协议，关联的后端Service为"nginx:8080"，使用ELB作为Ingress控制器（metadata.annotations字段都是指定使用哪个ELB实例），当访问"http://192.168.10.155:8080/"时，流量转发"nginx:8080"对应的Service，从而将流量转发到对应Pod。
示例如下（适用于v1.23及以上版本的集群）：
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/elb.class: union
    kubernetes.io/elb.port: '8080'
    kubernetes.io/elb.id: aa7cf5ec-7218-4c43-98d4-c36c0744667a
spec:
  rules:
    - host: ''
      http:
        paths:
          - path: /
            backend:
              service:
                name: nginx
                port:
                  number: 8080
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
  ingressClassName: cce
```
Ingress中还可以设置外部域名，这样您就可以通过域名来访问到ELB，进而访问到后端服务。
![](https://support.huaweicloud.com/basics-cce/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:
              service:
                name: nginx
                port:
                  number: 8080
...
```
#### 路由到多个服务
Ingress可以同时路由到多个服务，配置如下所示。
- 当访问"http://foo.bar.com/foo"时，访问的是"s1:80"后端。
- 当访问"http://foo.bar.com/bar"时，访问的是"s2:80"后端。
![](https://support.huaweicloud.com/basics-cce/public_sys-resources/notice_3.0-zh-cn.png)
Ingress转发策略中的path路径要求后端应用内存在相同的路径，否则转发无法生效。
例如，Nginx应用默认的Web访问路径为"/usr/share/nginx/html"，在为Ingress转发策略添加"/test"路径时，需要应用的Web访问路径下也包含相同路径，即"/usr/share/nginx/html/test"，否则将返回404。
```
...
spec:
  rules:
    - host: foo.bar.com          # host地址
      http:
        paths:
          - path: "/foo"
            backend:
              service:
                name: s1
                port:
                  number: 80
          - path: "/bar"
            backend:
              service:
                name: s2
                port:
                  number: 80
...
```
