探索云原生应用管理平台Radius 101

发表时间: 2023-12-22 20:39

Radius 是微软开源的一个面向多云的云原生应用平台。它可以让开发和运维协作管理和交付云原生应用。通过该平台,研发团队可以专注在业务逻辑上,只需要开发业务本身的代码和标记服务的依赖,即可快速将服务交付到目的环境中(包括本地dev环境、cloud、edge以及om-prime),运维团队可以确保应用所运行的基础设施满足成本、运维以及安全等要求。

我们先通过一个简单的示例,让大家有一个直观的感知。

示例

通过本示例,我们可以学会如何使用 Radius 定义、部署和管理一个云原生应用。

主要包括:

  1. 定义和部署 Radius 环境和应用程序
  2. 将容器 frontend 添加到应用程序,并自定义该容器
  3. 将 Mongodb 数据库添加到应用程序,并配置上述的容器 frontend 访问该数据库
  4. 添加第二个容器 backend,并配置第一个容器 frontend 访问该容器
  5. 通过网关Gateway安全地向 Internet 公开应用程序


首先运行 rad init 命令,来完成初始化工作。初始化工作主要包括:

  • 部署 Radius 控制面组件,如果已经部署过,则本步骤会跳过。
  • 创建默认的环境default,如果已经创建,则本步骤会跳过。如果指定了新的环境,则会完成新环境的创建工作。
  • 在当前目录生成 app.bicep 文件,即 Radius 应用配置文件。
rad initInitializing Radius. This may take a minute or two...✅ Use existing Radius 0.28.0 install on docker-desktop✅ Use existing environment default✅ Scaffold application cloud-native-platform-engineering-demo✅ Update local configurationInitialization complete! Have a RAD time 

然后我们打开 app.bicep,编辑相关内容。具体如下:

import radius  as radiusparam application stringparam environment stringresource demo 'Applications.Core/containers@2023-10-01-preview' = {  name: 'demo'  properties: {    application: application    container: {      image: 'ghcr.io/radius-project/samples/demo:latest'      env: {        FOO: 'bar'      }      ports: {        web: {          containerPort: 3000        }      }    }    connections: {      mongodb: {        source: mongodb.id      }      backend: {        source: 'http://backend:80'      }    }  }}resource mongodb 'Applications.Datastores/mongoDatabases@2023-10-01-preview' = {  name: 'mongodb'  properties: {    environment: environment    application: application  }}resource backend 'Applications.Core/containers@2023-10-01-preview' = {  name: 'backend'  properties:{    application: application    container: {      image: 'nginx:latest'      ports: {        api: {          containerPort: 80        }      }    }  }}resource gateway 'Applications.Core/gateways@2023-10-01-preview' = {  name: 'gateway'  properties: {    application: application    routes: [      {        path: '/'        destination: 'http://demo:3000'      }    ]  }}


然后运行 rad deploy app.bicep 命令,完成部署工作。具体如下:

Building app.bicep...Deploying template 'app.bicep' for application 'cloud-native-platform-engineering-demo' and environment 'default' from workspace 'default'...Deployment In Progress... Completed            gateway         Applications.Core/gatewaysCompleted            backend         Applications.Core/containersCompleted            mongodb         Applications.Datastores/mongoDatabases.                    demo            Applications.Core/containersDeployment CompleteResources:    backend         Applications.Core/containers    demo            Applications.Core/containers    gateway         Applications.Core/gateways    mongodb         Applications.Datastores/mongoDatabasesPublic Endpoints:    gateway         Applications.Core/gateways http://localhost

如图所示,Radius 按照我们的 app.bicep 应用程序描述,在本地的 kubernetes 中完成了所有的部署。

我们可以通过暴露的URL,访问该应用程序。


是不是很简单?对于开发同学来说,只需要按照 radius 的规范,描述自己的服务和服务的依赖,即可一键发布自己的应用程序。

接下来我们探究一下 Radius 的设计思想以及如何支持一键发布应用程序。

解读

想要真正理解 Radius,必须搞清楚以下几个概念。

Recipe

Recipe ,翻译过来就是菜谱。怎么理解Recipe那?

顾客到饭店点菜的时候,根据自己的喜好和需求,点不同的菜,也可能会提出免辣或是微辣等特殊要求。厨师根据所点的菜和特殊要求,完成菜的制作,最后交给顾客。这里,顾客完全不需要关注菜是如何制作、以及原料的采购。

比如红烧肉,有预制菜类型的红烧肉,也有国宴大师亲自抄的红烧肉。如果顾客只是想填饱肚子,那就点预制红烧肉,如果是宴请贵宾,就需要点国宴红烧肉了。


对应到技术场景,我们需要一个 redis。预制红烧肉就是本地开发环境的 redis,在 k8s 里部署一个单节点的 redis 容器即可满足要求。在生产环境,考虑到稳定性,我们可能需要购买云厂商的 redis 集群。

Recipe 体现了关注分离的思想。开发和运维协作来完成应用的交付。运维会制定一些列的 recipe ,也就是基础设施的模板,开发选择自己所需的 recipe。

具体从炒菜到交付给顾客,就是 IaC 的思想。Radius 支持 Bicep 和 Terraform 两种 IaC 方案,未来会支持 Crossplane ,实现基础设施的自动化交付。

所以,简单理解 Recipe = 模板 + IaC。

示例中的,部署一个 mongo, 配置非常简单,实际上是直接使用了提前设置好的 mongo recipe。执行以下命令,查看 Radius 预置的 Recipe:

rad recipe listRECIPE    TYPE                                    TEMPLATE KIND  TEMPLATE VERSION  TEMPLATEdefault   Applications.Datastores/mongoDatabases  bicep                            ghcr.io/radius-project/recipes/local-dev/mongodatabases:0.28default   Applications.Datastores/redisCaches     bicep                            ghcr.io/radius-project/recipes/local-dev/rediscaches:0.28default   Applications.Datastores/sqlDatabases    bicep                            ghcr.io/radius-project/recipes/local-dev/sqldatabases:0.28default   Applications.Messaging/rabbitMQQueues   bicep                            ghcr.io/radius-project/recipes/local-dev/rabbitmqqueues:0.28default   Applications.Dapr/pubSubBrokers         bicep                            ghcr.io/radius-project/recipes/local-dev/pubsubbrokers:0.28default   Applications.Dapr/secretStores          bicep                            ghcr.io/radius-project/recipes/local-dev/secretstores:0.28default   Applications.Dapr/stateStores           bicep                            ghcr.io/radius-project/recipes/local-dev/statestores:0.28

Radius 支持自定义 Recipe,所以我们的运维需要按照自己公司的实际情况,定义自己的 Recipe。

Environment

环境就是应用部署的目的地。可能有本地开发环境和生产环境之分。那么对于生产环境,也有AWS生产环境,Azure生产环境。

环境主要包含容器运行时和各种 cloud provider设置。

比如初始化过程中默认的 default 环境设置如下:

rad env show -e default -o json{  "id": "/planes/radius/local/resourcegroups/default/providers/Applications.Core/environments/default",  "location": "global",  "name": "default",  "properties": {    "compute": {      "kind": "kubernetes",      "namespace": "default"    },    "provisioningState": "Succeeded",    "recipes": {      "Applications.Dapr/pubSubBrokers": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/pubsubbrokers:0.28"        }      },      "Applications.Dapr/secretStores": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/secretstores:0.28"        }      },      "Applications.Dapr/stateStores": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/statestores:0.28"        }      },      "Applications.Datastores/mongoDatabases": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/mongodatabases:0.28"        }      },      "Applications.Datastores/redisCaches": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/rediscaches:0.28"        }      },      "Applications.Datastores/sqlDatabases": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/sqldatabases:0.28"        }      },      "Applications.Messaging/rabbitMQQueues": {        "default": {          "plainHTTP": false,          "templateKind": "bicep",          "templatePath": "ghcr.io/radius-project/recipes/local-dev/rabbitmqqueues:0.28"        }      }    }  },  "systemData": {    "createdAt": "0001-01-01T00:00:00Z",    "createdBy": "",    "createdByType": "",    "lastModifiedAt": "0001-01-01T00:00:00Z",    "lastModifiedBy": "",    "lastModifiedByType": ""  },  "tags": {},  "type": "Applications.Core/environments"}

Application 应用模型

Radius 抽象了 Application 对象,翻译过来就是应用。一个应用可能包含服务、依赖以及关系。如我们示例中的 demo 应用,包含了 frontend 服务、backend 服务、mongodb 依赖、frontend 与 backend 的关系以及访问方式 Gateway。

这里其实体现了以应用为中心的思想。

Radius 应用设计为与云和平台无关。这意味着你可以定义一次应用,并将其部署到 Radius 支持的任何云或平台。这使你可以轻松地在云之间,甚至在云和本地环境之间迁移应用程序。开发人员可以定义他们的需求和依赖关系(Redis、SQL、Dapr 等),运维可以定义将这些需求绑定到相应云资源的 environment 和 Recipe。

当运维配置好相应的 environment 和 Recipe,研发就可以基于这些能力结合自己实际的业务,使用 Bicep 这种 DSL来完成一个应用的描述和一键部署。

其中 VSCODE 有相关 Bicep 的扩展支持。

总结

本文简单介绍了 Radis。并通过一个示例和相关概念讲解,来让大家感受到,Radius 如何实现以应用为中心和开发和运维关注分离两个思想。


相关链接:

  • https://github.com/radius-project/radius
  • https://learn.microsoft.com/zh-cn/azure/azure-resource-manager/bicep/