|
| 1 | +--- |
| 2 | +title: "保姆级教程,从概念到实践帮你快速上手 Apache APISIX Ingress" |
| 3 | +author: "张晋涛" |
| 4 | +authorURL: "https://github.com/tao12345666333" |
| 5 | +authorImageURL: "https://avatars.githubusercontent.com/u/3264292?v=4" |
| 6 | +date: 2021-10-09 |
| 7 | +keywords: |
| 8 | +- Apache APISIX |
| 9 | +- Ingress |
| 10 | +- Kubernetes |
| 11 | +- 自定义资源 |
| 12 | +description: 本文从理论和实践两个角度,对 Apache APISIX Ingress 进行了详细的描述与讲解 |
| 13 | +tags: [technology] |
| 14 | +--- |
| 15 | + |
| 16 | +>作者张晋涛,Apache APISIX Committer、Kubernetes Ingress Nginx Reviewer,多个云原生开源项目的贡献者。 |
| 17 | +
|
| 18 | +<!--truncate--> |
| 19 | + |
| 20 | +## Apache APISIX Ingress 概览 |
| 21 | + |
| 22 | +### Apache APISIX Ingress 定义 |
| 23 | + |
| 24 | +在 K8s 生态中,Ingress 作为表示 K8s 流量入口的一种资源,想要让其生效,就需要有一个 Ingress Controller 去监听 K8s 中的 Ingress 资源,并对这些资源进行相应规则的解析和实际承载流量。在当下趋势中,像 Kubernetes Ingress Nginx 就是使用最广泛的 Ingress Controller 实现。 |
| 25 | + |
| 26 | +而 APISIX Ingress 则是另一种 Ingress Controller 的实现。跟 Kubernetes Ingress Nginx 的区别主要在于 APISIX Ingress 是以 Apache APISIX 作为实际承载业务流量的数据面。如下图所示,当用户请求到具体的某一个服务/API/网页时,通过外部代理将整个业务流量/用户请求传输到 K8s 集群,然后经过 APISIX Ingress 进行后续处理。 |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +从上图可以看到,APISIX Ingress 分成了两部分。一部分是 APISIX Ingress Controller,作为控制面它将完成配置管理与分发。另一部分 APISIX Proxy Pod 负责承载业务流量,它是通过 CRD(Custom Resource Definitions) 的方式实现的。Apache APISIX Ingress 除了支持自定义资源外,还支持原生的 K8s Ingress 资源。 |
| 31 | + |
| 32 | +### Apache APISIX 简述 |
| 33 | + |
| 34 | +前边我们提到了 APISIX Ingress 是采用 Apache APISIX 作为实际承载业务流量的数据面,那么 Apache APISIX 项目又是做什么的呢? |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | +Apache APISIX 是 Apache 基金会旗下的顶级开源项目,也是当前最活跃的开源网关项目。作为一个动态、实时、高性能的开源 API 网关,Apache APISIX 提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 |
| 39 | + |
| 40 | +Apache APISIX 可以帮助企业快速、安全地处理 API 和微服务流量,比如限流认证、日志安全功能,以及支持丰富的自定义插件。目前也与很多开源项目如 Apache SkyWalking、Prometheus 等之类的组件进行了相关集成。 |
| 41 | + |
| 42 | +## APISIX Ingress vs K8s Ingress Nginx |
| 43 | + |
| 44 | +因为本人同时参与到了 APISIX Ingress 与 K8s Ingress Nginx 两个项目的开发和维护,所以很多人也会问我,这两个项目做比较的话,到底该如何选择?或者说为什么有了 K8s Ingress Nginx 还要再做 APISIX Ingress。 |
| 45 | + |
| 46 | +### 配置层面 |
| 47 | + |
| 48 | +在 APISIX Ingress 中,我们增加了一些丰富且灵活的配置,比如通过单个配置文件去实现灰度部署。但在 K8s Ingress Nginx 中去实现如上效果的话,最少也需要有两个 Ingress 资源文件才可以完成。 |
| 49 | + |
| 50 | +### 丰富度 |
| 51 | + |
| 52 | +在丰富度上,由于 Apache APISIX 本身的自带功能丰富且允许多种插件扩展使用,所以使用 APISIX Ingress 就可以省去自己额外配置功能的繁琐步骤,可以将更多的时间投入到实际开发中。 |
| 53 | + |
| 54 | +### 架构分离 |
| 55 | + |
| 56 | +APISIX Ingress 采用了数据面与控制面的分离架构,所以用户可以选择将数据面部署在 K8s 集群内部/外部。但 K8s Ingress Nginx 是将控制面和数据面放在了同一个 Pod 中,如果 Pod 或控制面出现一点闪失,整个 Pod 就会挂掉,进而影响到业务流量。 |
| 57 | + |
| 58 | +这种架构分离,给用户提供了比较方便的部署选择,同时在业务架构调整场景下,也方便进行相关数据的迁移与使用。 |
| 59 | + |
| 60 | +## APISIX Ingress 特性详解 |
| 61 | + |
| 62 | +由于 Apache APISIX 是一个全动态的高性能网关,所以在 APISIX Ingress 自身就支持了全动态,包括路由、SSL 证书、上游以及插件等等。 |
| 63 | + |
| 64 | +同时 APISIX Ingress 还具有以下特性: |
| 65 | + |
| 66 | +* 支持 CRD,更容易理解声明式配置;同时状态检查可保证快速掌握声明配置的同步状态 |
| 67 | +* 支持高级路由匹配规则以及自定义资源,可与 Apache APISIX 官方 50 多个插件 & 客户自定义插件进行扩展使用 |
| 68 | +* 支持 K8s 原生 Ingress 配置 |
| 69 | +* 支持流量切分 |
| 70 | +* 支持 gRPC plaintext 与 TCP 4 层代理 |
| 71 | +* 服务自动注册发现,无惧扩缩容 |
| 72 | +* 更灵活的负载均衡策略,自带健康检查功能 |
| 73 | + |
| 74 | +以下我们将从 CRD 与自定义资源层面进行详细的介绍。 |
| 75 | + |
| 76 | +### CRD 扩展 |
| 77 | + |
| 78 | +在前面的介绍中我们提到了 CRD,那么 APISIX Ingress 是如何使用 CRD 扩展的? |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | +从用户层面来看,当 Client 发起请求,到达 Apache APISIX 后,会直接把相应的业务流量传输到后端(如 Service Pod),从而完成转发过程。此过程不需要经过 Ingress Controller,这样做可以保证一旦有问题出现,或者是进行变更、扩缩容或者迁移处理等,都不会影响到用户和业务流量。 |
| 83 | + |
| 84 | +同时在配置端,用户通过 kubectl apply,可将自定义 CRD 配置应用到 K8s 集群。Ingress Controller 会持续 watch 这些资源变更,来将相应配置应用到 Apache APISIX。 |
| 85 | + |
| 86 | +### 自定义资源 |
| 87 | + |
| 88 | +APISIX Ingress 目前已经支持的自定义资源主要是以下 5 类,涉及到路由、上游、消费者、证书相关和集群公共配置的相关类别。 |
| 89 | + |
| 90 | +#### APISIX Route(路由) |
| 91 | + |
| 92 | +自定义资源 APISIX Route 中 `spec` 属性的顶级配置是 `http`。但其实 `spec` 是同时支持两种配置的,一种是下图示例的 `spec.http`,主要用于 7 层代理;另一种是 `spec.stream`,用于 4 层代理。在配置文件中,我们首先为其自定义了一项规则,即 match 下的相关参数。 |
| 93 | + |
| 94 | + |
| 95 | + |
| 96 | +如上图后端配置示例使用了同一个 Service,实际使用中大家根据场景进行调整即可。需要注意的是,`weight` 属性是用来配置相关 Service 权重。通过以上配置,从而实现一套完整的路由自定义资源。 |
| 97 | + |
| 98 | +#### APISIX Upstream(上游) |
| 99 | + |
| 100 | +在配置 APISIX Upstream 时,需要注意 `name` 的内容要与 K8s 集群的 Service 保持一致,这样可以保证后续 APISIX Ingress Controller 准确匹配其相应流量。 |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | +在配置文件中,`spec.loadbalancer` 主要负责负载均衡策略的设置,有多种策略模式可供选择。`spec.schem`e 则是协议类型的配置,目前只支持 HTTP 和 gRPC 协议。`spec.healthCheck` 主要是对健康检查功能进行设置,比如设置其活跃状态、生效协议与路径和最终反馈等参数配置。 |
| 105 | + |
| 106 | +#### APISIX Consumer(消费者) |
| 107 | + |
| 108 | +在 APISIX Consumer 配置中,主要是增加了认证相关的功能,比如 `spec.authParameter`,目前该配置参数支持 `BasicAuth` 与 `KeyAuth` 这两种比较常见的认证类型。 |
| 109 | + |
| 110 | + |
| 111 | + |
| 112 | +通过 `value` 可直接去配置相关的 `username` 和 `password`,或者直接使用 `secret` 进行配置,相比前者的明文配置会更安全一些。 |
| 113 | + |
| 114 | +#### APISIX TLS(证书) |
| 115 | + |
| 116 | +APISIX TLS 主要是为了进行证书的管理。如示例所示,用户可以通过 `hosts` 来配置多个域名,`secret` 下的参数就是对应的配置证书。 |
| 117 | + |
| 118 | + |
| 119 | + |
| 120 | +同时 APISIX TLS 还配有 `spec.client`,用于进行 mTLS 双向认证的配置。 |
| 121 | + |
| 122 | +#### APISIX Config 相关 |
| 123 | + |
| 124 | +关于自定义资源支持的 Config 类型我们会从两个方面进行描述。 |
| 125 | + |
| 126 | + |
| 127 | + |
| 128 | +一种是 APISIX Cluster Config,它主要用于一些通用配置。目前支持在 K8s 或者 Apache APISIX 中全局使用 Prometheus 插件/全局配置 SkyWalking,后续开发中也会去增加一些其他的通用配置。 |
| 129 | + |
| 130 | +另一种就是我们现在正在 PR 中的 [APISIX Plugin Config](https://github.com/apache/apisix-ingress-controller/pull/689)。大家如果感兴趣的话,也可以点击链接来一起参与讨论。Plugin Config 主要是将通用的插件配置统一集合在一起,比如一些同样的配置,用户就可以通过 APISIX Plugin Config 同时应用在多个路由当中,省去了额外多项独立配置的繁琐步骤。 |
| 131 | + |
| 132 | +## APISIX Ingress 上手实践 |
| 133 | + |
| 134 | +目前大家可以通过 [Helm Charts](https://github.com/apache/apisix-helm-chart) 的方式来进行 APISIX Ingress 的部署。通过一条命令,就可以同时把 Apache APISIX 以及 APISIX Ingress,包括 Apache APISIX 所需要用到的 etcd 全部部署好,步骤非常简单。 |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | +### 实践场景一:流量切分 |
| 139 | + |
| 140 | +通过使用 APISIX Ingress 可以实现按比例进行流量切分的效果,具体操作如下: |
| 141 | + |
| 142 | +#### 步骤一:配置 APISIX Upstream |
| 143 | + |
| 144 | + |
| 145 | + |
| 146 | +#### 步骤二:配置 APISIX Route |
| 147 | + |
| 148 | +通过在 `backends` 中去配置 `subset` 和 `weight`,来实现用户请求流量进入时的分流。如下图示例就是 90% 的流量会进入到 v1 中,10% 的流量进入到 v2 中。 |
| 149 | + |
| 150 | + |
| 151 | + |
| 152 | +通过以上两步,就可以十分方便地按比例进行流量切分,实现类似灰度发布等场景需求。 |
| 153 | +更多具体操作细节也可参考:[Apache APISIX Ingress Controller 中的流量切分](https://www.apiseven.com/zh/blog/traffic-split-in-apache-apisix-ingress-controller)。 |
| 154 | + |
| 155 | +### 实践场景二:配置认证 |
| 156 | + |
| 157 | +如果想在 APISIX Ingress 中为某些路由配置 Basic Auth,可以参考如下操作: |
| 158 | + |
| 159 | +#### 步骤一:创建 APISIX Consumer 资源 |
| 160 | + |
| 161 | +如前文所提到的,可以在 APISIX Consumer 配置中增加 `basicAuth`,并为其指定用户名和密码。 |
| 162 | + |
| 163 | + |
| 164 | + |
| 165 | +#### 步骤二:配置 APISIX Route,增加认证相关参数 |
| 166 | + |
| 167 | +在自定义资源 APISIX Route 中,通过在后端添加 `authenticatio`n,将其开启并指定认证类型即可。 |
| 168 | + |
| 169 | + |
| 170 | + |
| 171 | +通过以上步骤,就可以实现使用 Consumer 去完成相关配置认证。 |
| 172 | + |
| 173 | +### 实践场景三:K8s 资源扩展 |
| 174 | + |
| 175 | +正如我们在开头提到过的,APISIX Ingress 不仅支持自定义资源,还同时支持 K8s 原生的 Ingress 资源。 |
| 176 | + |
| 177 | + |
| 178 | + |
| 179 | +如上图是 K8s Ingress 资源。通常情况下如果想要在资源上做 rewrite,可以通过增加 annotation 配置属性。这样当用户携带 `httpbin.org` 请求时,就可以通过路径 /sample 将它重定向到 /ip。 |
| 180 | + |
| 181 | +当上述需求使用 APISIX Ingress 时,只需在 Ingress 增加一个 `kubernetes.io/ingress.class: apisix`,去指定 APISIX Ingress Controller 去监听这个资源,同时通过配置 `k8s.apisix.apache.org/rewrite-target: "/ip"`,就可以完成重定向到 /ip 路径。 |
| 182 | + |
| 183 | + |
| 184 | + |
| 185 | +以上示例只是目前 APISIX Ingress 对于原生 K8s Ingress 支持的一种方式,更多示例大家可以查看[具体文档](https://apisix.apache.org/docs/ingress-controller/practices/proxy-the-httpbin-service-with-ingress)进行参考使用。 |
| 186 | + |
| 187 | +## 未来规划 |
| 188 | + |
| 189 | +之后 APISIX Ingress 将会继续在功能与生态上进行更新,目前阶段已经完成了 [APISIX Ingress 与 Cert-manager 集成](https://github.com/apache/apisix-ingress-controller/blob/master/docs/en/latest/practices/manage-certificates-with-cert-manager.md),后续将逐步实现以下目标: |
| 190 | + |
| 191 | +1. 完成 Kubernetes V1.22+ 与 CRD V1 版本的适配支持(已经完成,即将在 APISIX Ingress V1.3 版本 中发布) |
| 192 | +2. 支持 Gateway API(预计在 Q4 阶段实现) |
| 193 | +3. 扩展新架构,以便于用户在不需要使用 etcd 的情况下,可以正常使用 APISIX Ingress |
| 194 | +4. 丰富产品生态,扩展 APISIX Ingress 社区 |
| 195 | + |
| 196 | +最后也希望大家能够多多地参与到项目中来,比如每两周的周三下午 2 点都会有一次 APISIX Ingress 社区会议,会跟大家同步一下当前的项目进展或者遇到的问题。大家可以持续关注 Apache APISIX 视频号,届时可以直接参与社区会议直播。 |
| 197 | + |
| 198 | +[点此查看](https://github.com/apache/apisix-ingress-controller/issues/614)更多关于 APISIX Ingress 社区会议细节。 |
0 commit comments