部署一个支持Dapr 的Kubernetes APISIX Ingress
在这篇文章中,我将展示如何创建一个 APISIX控制器,该控制器在 Kubernetes 集群中公开启用 Dapr 的应用程序。 本质上,APISIX控制器将配置相同的标准 Dapr annotations以注入daprd sidecar。 通过公开这个 sidecar,它将允许外部应用程序与集群中启用 Dapr 的应用程序进行通信,请参阅 Dapr API 参考。下图是我们实际项目中的架构图:

Apache APISIX Ingress 概览
在 K8s 生态中,Ingress 作为表示 K8s 流量入口的一种资源,想要让其生效,就需要有一个 Ingress Controller 去监听 K8s 中的 Ingress 资源,并对这些资源进行相应规则的解析和实际承载流量。在当下趋势中,像 Kubernetes Ingress Nginx 就是使用最广泛的 Ingress Controller 实现。
而 APISIX Ingress 则是另一种 Ingress Controller 的实现。跟 Kubernetes Ingress Nginx 的区别主要在于 APISIX Ingress 是以 Apache APISIX 作为实际承载业务流量的数据面。如下图所示,当用户请求到具体的某一个服务/API/网页时,通过外部代理将整个业务流量/用户请求传输到 K8s 集群,然后经过 APISIX Ingress 进行后续处理。

从上图可以看到,APISIX Ingress 分成了两部分。一部分是 APISIX Ingress Controller,作为控制面它将完成配置管理与分发。另一部分 APISIX Proxy Pod 负责承载业务流量,它是通过 CRD(Custom Resource Definitions) 的方式实现的。Apache APISIX Ingress 除了支持自定义资源外,还支持原生的 K8s Ingress 资源。详细内容参见:https://www.apiseven.com/zh/blog/apisix-ingress-details
Dapr 概览
Dapr是一个可移植,事件驱动的运行时。它使开发人员简单地去构建运行在云和edge上弹性、无状态和有状态的应用,并且包含多种语言和开发人员框架。
Any language, any framework, anywhere

今天,我们正在经历一波云应用浪潮。开发人员熟悉web +数据库应用程序架构(例如经典的3层设计),但不熟悉本质上是分布式的微服务应用程序架构。成为分布式系统专家很难,你也不应该这样做。开发人员希望专注于业务逻辑,同时依靠平台为他们的应用程序注入伸缩性、弹性、可维护性、弹性和其他本地云架构的属性。
这就是Dapr的用武之地。Dapr将构建微服务应用程序的最佳实践编入开放的、独立的构建块中,使您能够使用自己选择的语言和框架构建可移植的应用程序。每个构建块都是完全独立的,您可以在应用程序中使用其中的一个、一些或全部。
此外,Dapr与平台无关,这意味着您可以在任何Kubernetes集群和其他与Dapr集成的托管环境上本地运行应用程序。这使您能够构建可以在云和edge上运行的微服务应用程序。
详细内容参见:https://docs.dapr.io/zh-hans/concepts/overview/
APISIX 支持Dapr 的部署
前提条件
• Kubernetes 1.19+ 集群,集群上已经配置了 Dapr 。
• 安装了 Helm CLI 3x。
• Kubectl CLI 已安装并配置为访问集群。
• 可选:用于创建自签名证书的OpenSSL。
• APISIX的Helm Chart 版本0.7.2+,具体原因0.7.2 版本修复的issue:https://github.com/apache/apisix-helm-chart/issues/167
准备APISIX Helm
通过运行以下命令为 APISIX控制器添加最新的 helm chart repo:
$ helm repo add apisix https://charts.apiseven.com
$ helm repo update
创建APISIX Ingerss命名空间
确保当前 kubectl 上下文指向正确的 Kubernetes 集群,然后运行以下命令:
kubectl create namespace ingress-apisix
安装支持 Dapr 的 APISIX 控制器
使用以下内容创建一个名为 dapr-annotations.yaml 的文件,以在 APISIX Proxy Pod 上设置注释:
apisix:
podAnnotations:
dapr.io/enabled: "true"
dapr.io/app-id: " apisix-gateway"
dapr.io/app-port: "9080"
dapr.io/enable-metrics: "true"
dapr.io/metrics-port: "9099"
dapr.io/sidecar-listen-addresses: 0.0.0.0
dapr.io/config: ingress-apisix-config
注意:上面的app-port告诉 daprd sidecar Proxy在监听哪个端口。 有关受支持的注释的完整列表,请参阅 Dapr Kubernetes pod 注释规范。
下面是我在AKS上安装的示例dapr-annotations.yaml:
apisix:
podAnnotations:
dapr.io/app-id: apisix-gateway
dapr.io/app-port: '9080'
dapr.io/enable-metrics: 'true'
dapr.io/enabled: 'true'
dapr.io/metrics-port: '9099'
dapr.io/sidecar-listen-addresses: 0.0.0.0
dapr.io/config: ingress-apisix-config
gateway:
type: LoadBalancer
ingress-controller:
enabled: true
dashboard:
enabled: true
运行以下命令,该命令引用上述文件:
helm install apisix apisix/apisix -f dapr-annotations.yaml -n ingress-apisix
创建APISIX的Dapr Sidecar 资源
1、配置一个Apisix 上游 upstream—apisix-dapr

主机名 填写:apisix-gateway-dapr,端口号填写3500
{
"nodes": [
{
"host": "apisix-gateway-dapr",
"port": 3500,
"weight": 1
}
],
"retries": 1,
"timeout": {
"connect": 6,
"read": 6,
"send": 6
},
"type": "roundrobin",
"scheme": "http",
"pass_host": "pass",
"name": "apisix-dapr"
}
2、配置一个apisix 服务 apisix-gateway-dapr , 上游服务选择apisix-dapr:

{
"name": "apisix-gateway-dapr",
"upstream_id": "376187148778341098"
}
部署测试示例项目
HTTPBin是以Python+Flask写的一款工具,它cover了各类的HTTP场景,且每个接口一定都有返回。我们使用 kennethreitz/httpbin 作为示例项目进行演示:
kubectl apply -f 01.namespace.yaml
kubectl apply -f 02.deployment.yaml
kubectl apply -f 03.svc.yaml

上面假设有一个使用 Dapr app-id kennethreitz-httpbin运行的微服务,
路径匹配改写
比如请求网关是 /httpbin/*, 然后后端接收的路径应该是 /*, 中间的httpbin只是充当服务名的标识。
路径 填 /* 匹配/get这种请求
路径改写选正则改写
匹配^/ httpbin/(.*) 表示匹配/之后的部分,作为第一个匹配到的值,变量名为$1
转发路径模板 /v1.0/invoke/svc-kennethreitz-httpbin.kind-test/method/$1 即取上一个匹配后的参数拼接转发。 在支持命名空间的托管平台上,Dapr 应用 ID 是符合有效的 FQDN 格式,其中包括目标名称空间。例如,以下字符串包含应用 ID (svc-kennethreitz-httpbin) 以及应用运行在 命名空间(kind-test)。
测试是否代理成功,访问http://20.195.90.43/httpbin/get:

可以看到也正常代理了。
删除 APISIX控制器
为方便起见,这里是删除 APISIX控制器的命令:
helm delete apisix -n ingress-apisix
不要忘记删除之前创建的命名空间ingress-apisix。
总结
你可以在 Kubernetes 中使用 Apache APISIX 的官方 Helm 仓库直接部署 Apache APISIX 和 APISIX Ingress Controller。并且 Apache APISIX可通过作为网关,承载 APISIX Ingress Controller 的数据面来承载业务流量。将Dapr 通过Sidecar 的annotations 注入到APISIX Proxy Pod,通过Dapr的服务调用模块调用集群中的微服务。
部署一个支持Dapr 的Kubernetes APISIX Ingress的更多相关文章
- 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...
- 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用
Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,"没错, 我是在你的文章里看到了Fiori应用的 ...
- 部署一个生产级别的 Kubernetes 应用(以Wordpress为例)
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247487811&idx=1&sn=67b39b73 ...
- Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...
- 使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
本文作者:黄鑫鑫 - Nocalhost 项目核心开发者 腾讯云 CODING DevOps 研发工程师.硕士毕业于中山大学数据科学与计算机学院,曾负责过平安云主机及国家超算中心容器云平台等相关业务, ...
- kubernetes实战之部署一个接近生产环境的consul集群
系列目录 前面我们介绍了如何在windows单机以及如何基于docker部署consul集群,看起来也不是很复杂,然而如果想要把consul部署到kubernetes集群中并充分利用kubernete ...
- 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群
本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...
- kubernetes nginx ingress controller部署
Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...
- kubernetes实战篇之部署一个.net core微服务项目
目录 继上一篇kubernetes理论知识完结.本篇主要讲解基于nexus搭建一个docker镜像仓库(当然大家实践过程是不必完全跟着做,也可以搭建harbor仓库或者直接把镜像推送到docker h ...
随机推荐
- amber模拟kcl水溶液
最近刚开始学习amber软件,看网上的教程勉强知道怎么操作这个amber了.就暂时跑了个分子动力学,其他的啥也没处理.先把我的操作过程记录下来吧,免得日后忘记. 一.构建kcl.pdb结构 利用Gau ...
- Python - __all__ 变量
import * 当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线 _ 或者双下划线 __ )开头的变量.函数和类 因此,如果不想模块文件中的某个对象被引入到其它文件中使用,可 ...
- 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...
- 【nvidia jetson xavier】 Deepstream Yolov3示例模型运行
作者声明 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 原文链接:https://www.cnblogs.com/phoenixash/p/15 ...
- vue3 element-plus 配置json快速生成table列表组件,提升生产力近500%(已在公司使用,持续优化中)
️本文为博客园首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gith ...
- Vulnhub实战-grotesque3靶机👻
Vulnhub实战-grotesque3靶机 靶机地址:http://www.vulnhub.com/entry/grotesque-301,723/ 1.靶机描述 2.主机探测,端口扫描 我们在vm ...
- JAVA实现表达式求导运算的分析总结
1第一次作业 1.1题目描述 对形如4*x+x^2+x的多项式求导. 1.2类图 1.3度量分析 在完成第一次作业时,我的写法没有特别的"面向对象".唯一封装起来的是Node,代表 ...
- spring cloud zuul的回退
当我们使用 @EnableZuulProxy 注解来开启zuul的路由时,默认在@EnableZuulProxy注解上就包含了@EnableCircuitBreaker注解,即开启了断路器功能.那么在 ...
- 搬运1:关于对C语言中数组名取地址加减等操作的一点探究
对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...
- 梦开始的地方(Noip模拟3) 2021.5.24
T1 景区路线规划(期望dp/记忆化搜索) 一看题目发现肯定是概率期望题,再仔细想想这三天做的题,就知道是个期望dp. 考试思路(错): 因为聪聪与可可的10分打法根深蒂固,导致在考试时想到了用深搜( ...