zoukankan      html  css  js  c++  java
  • apisixanddapr

    [转载]部署一个支持Dapr 的Kubernetes APISIX Ingress

     

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

    image

    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 进行后续处理。

    image

    从上图可以看到,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

    clip_image006

    今天,我们正在经历一波云应用浪潮。开发人员熟悉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

    clip_image008

    主机名 填写: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:

    clip_image010

    {

    "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

    clip_image012

    上面假设有一个使用 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:

    clip_image014

    可以看到也正常代理了。

    删除 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的服务调用模块调用集群中的微服务。

    示例代码:https://github.com/geffzhang/apisix-and-dapr

  • 相关阅读:
    班别:批量添加导师
    批量删除注入字段,触发器防止注入。
    c#生成不重复随机数
    网络蜘蛛爬虫程序
    session丢失问题整理
    asp.net 自动生成控件
    C#实现所有经典排序算法 收藏
    泛型学习
    Android 判断网络并打开设置界面
    Android 获取Android手机中SD卡存储信息 获取剩余空间
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/15556837.html
Copyright © 2011-2022 走看看