公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
Nginx, 模块化设计的反向代理软件,C 语言开发
OpenResty, 以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本
Kong, OpenResty 的一个应用,是一个 API 网关,具有 API 管理和请求代理的功能,使用 PostgreSQL 存储
APISIX, 替换了 Kong 的 PostgreSQL 为 Etcd,基于 Nginx 的核心库实现
APISIX 的优势在于提供了 API 的管理和扩展能力,让网关不再仅仅转发服务,而是可以被配置、定制化。相较于 Nginx,APISIX 使用的是动态路由,避免了配置之后 reload 产生的风险。同时,APISIX 支持 HTTP(S)、HTTP2、Dubbo、QUIC、MQTT、TCP/UDP 等更多的协议,具有更好的使用生态。
上面是 APISIX 的架构图,数据面处理客户端请求,控制面管理路由。
边缘路由
机房对外暴露的访问入口 IP 数量,通常是极少的,但是却支撑了很多个服务。比如,访问的 IP 是 1.2.3.4,但却同时提供了 a.domain.com、b.domain.com 的访问服务。这就需要用到边缘路由,边缘路由会将不同域名的访问,转发到不同的内网地址。
APISIX 中三种方式可以注册边缘路由,dashboard、ingress-controller、admin api。
基础网关能力
网关的功能不限于转发流量,更重要的是限流、熔断等。
APISIX 内置了很多插件,提供 APM、日志、熔断、鉴权、证书管理、故障注入等功能。同时,也支持拖拽组合新的插件、开发新插件以满足业务需求。
Serverless
APISIX 通过插件的方式提供 Serverless,目前仅支持 Lua。但 APIGateway + Serverless 的组合,极具想象力。
利用 Serverless 可以快速对外提供无服务的 API,粘合各种服务,也可以对外直接提供功能服务。
灰度发布
由于对网关层进行了控制,APISIX 允许用户通过配置权重控制流量的转发行为,可以用来做灰度发布使用。
添加 Helm 源
$ helm repo add apisix https://charts.apiseven.com
$ helm repo update
查找 Chart 包
$ helm search repo apisix
NAME CHART VERSION APP VERSION DESCRIPTION
apisix/apisix 0.3.5 2.7.0 A Helm chart for Apache APISIX
apisix/apisix-dashboard 0.1.5 2.7.0 A Helm chart for Apache APISIX Dashboard
apisix/apisix-ingress-controller 0.5.0 1.0.0 Apache APISIX Ingress Controller for Kubernetes
安装 APISIX
$ helm install apisix apisix/apisix --set gateway.type=NodePort --set admin.allow.ipList="{0.0.0.0/0}" -n apisix --create-namespace
查看入口地址
$ export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
$ export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")
$ echo http://$NODE_IP:$NODE_PORT
http://1.1.1.1:32462
这里的入口地址是后端服务的入口地址,如果是生成环境,应该使用 LoadBalancer 提供的地址。
查看 apisix-admin 接口 key
$ export POD_NAME=$(kubectl get pods --namespace apisix -l "app.kubernetes.io/instance=apisix,app.kubernetes.io/name=apisix" -o jsonpath="{.items[0].metadata.name}")
$ kubectl -n apisix exec -it $POD_NAME cat conf/config.yaml |grep key
admin_key:
key: edd1c9f034335f136f87ad84b625c8f1
key: 4054f7cf07e344346cd3f287985e76a2
第一个 key 是 admin,第二个 key 是 viewer。这里的 key 可以用来通过 admin api 来配置 APISIX,给其他系统集成 APISIX 提供了入口。
安装 Dashboard
$ helm install apisix-dashboard apisix/apisix-dashboard -n apisix --create-namespace
默认账户是:admin 默认密码是:admin
查看 Dashboard 访问入口
$ export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
$ export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")
$ echo http://$NODE_IP:$NODE_PORT
http://1.1.1.1:31501
安装 ingress-controller
$ helm install apisix-ingress-controller apisix/apisix-ingress-controller --set config.apisix.baseURL=http://apisix-admin:9180/apisix/admin --set config.apisix.adminKey=edd1c9f034335f136f87ad84b625c8f1 -n apisix
这里就会需要设置上面获取到的 admin key, 实际上 ingress-controller 也是通过调用 admin api 来配置路由的。
前面提到 APISIX 通过 admin api 配置路由,有三种方式可以操作。这里主要验证使用 Dashboard 和 Ingress 两种方式:
创建一个服务
$ kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
暴露服务
$ kubectl expose deployment web --type=NodePort --port=8080
查看服务
$ kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.233.58.113 8080:30572/TCP 28d
新建一个上游服务
这里需要填入上面创建的集群访问地址:web.default.svc.cluster.local
新建一个路由
点击下一步之后,选择上面创建的服务 web,相关的参数就会自动填充。
访问测试
undefined
创建一个 ApisixRoute 路由
虽然这里部署的是 ingress-controller 组件,但是使用时创建的是 ApisixRoute 对象。
apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
name: web-route
spec:
http:
- name: web
match:
hosts:
- dev4.chenshaowen.com
paths:
- "/router-web/*"
backend:
serviceName: web
servicePort: 8080
访问测试
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-79d88c97d6-2sdlj 1/1 Running 0 27d 10.233.105.34 node4
web-79d88c97d6-7bfbb 1/1 Running 0 27d 10.233.105.32 node4
web-79d88c97d6-hccqk 1/1 Running 0 27d 10.233.105.33 node4
web-79d88c97d6-mh9gz 1/1 Running 0 28d 10.233.105.22 node4
APISIX 会将 Pod 的 IP 地址直接作为流量后端,而不需要经过 Service 的转发,这有别于 Kubernetes 的服务转发、负载均衡机制。
本文主要简述了几种网关的区别,思考了 APISIX 主要能帮助我们解决什么问题,最后在 Kubernetes 上进行了实践。内容如下:
APISIX 是基于 Nginx 网络库实现的 API 网关应用,使用 Etcd 作为存储后端
APISIX 能作为边缘路由使用,其动态特性,避免了 Nginx reload 带来的抖动
APISIX 提供了 admin api 管理路由,有三种方式可以进行配置
Kubernetes 下的 APISIX 跳过了 Kubernetes Service 直接将流量转发到 Pod IP
https://github.com/apache/apisix
https://bbs.huaweicloud.com/blogs/125686
https://github.com/apache/apisix-ingress-controller/blob/master/docs/en/latest/concepts/apisix_route.md
本文转载自:「 陈少文的网站 」,原文:https://tinyurl.com/yf9476mj ,版权归原作者所有。欢迎投稿,投稿邮箱: [email protected]。
你可能还喜欢
点击下方图片即可阅读
万字长文详解 PaaS toB 场景下 Kubernetes 离线部署方案
点击上方图片,『美团|饿了么』大额外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!