Radius 是微软开源的一个面向多云的云原生应用平台。它可以让开发和运维协作管理和交付云原生应用。通过该平台,研发团队可以专注在业务逻辑上,只需要开发业务本身的代码和标记服务的依赖,即可快速将服务交付到目的环境中(包括本地dev环境、cloud、edge以及om-prime),运维团队可以确保应用所运行的基础设施满足成本、运维以及安全等要求。
我们先通过一个简单的示例,让大家有一个直观的感知。
示例
通过本示例,我们可以学会如何使用 Radius 定义、部署和管理一个云原生应用。
主要包括:
首先运行 rad init 命令,来完成初始化工作。初始化工作主要包括:
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 如何实现以应用为中心和开发和运维关注分离两个思想。
相关链接: