銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Radiusを知る(7) Radiusのアプリケーションとは

ここからは、どのようにしてRadiusでアプリケーションの定義をしていくかというHow-to guideを読み進めていきます。まずはRadiusにおけるアプリケーションについてです。

docs.radapp.io

Radius アプリケーションとは、すべての「もの」を 1 つにまとめた定義です。具体的には、サービス、依存関係、結びつきといったものです。定義したアプリケーションを展開したり管理したりすることができます。

Radiusにおけるアプリケーションの定義(公式ドキュメントより引用)

Radius アプリケーションはクラウドやプラットフォームに依存しないように設計されているので、Radius がサポートする任意のクラウドまたはプラットフォームに展開できます。サンプルで試したように、開発者は依存関係 ( Redis、SQL、Dapr など) を定義でき、運用者はそれらの依存関係を適切なクラウド リソースに対応できるための環境とレシピを定義できます。このとき、開発者は具体的なクラウドリソースの実態を意識せずに、依存するサービスを利用することができます。

Radiusアプリケーションにおける環境とレシピ(公式ドキュメントより引用)

さて、現状ではRadiusがサポートするのはKubernetesです。Raiusアプリケーションで定義したリソースに対して、どのkubernetesリソースが生成されるかの対応関係はここに記載されています。例えばApplications.Core/containersに対してはapps/Deployment@v1が生成され、ポートが定義されている場合はさらにcore/Service@v1が生成されます。

docs.radapp.io

また、デフォルトではRadiusアプリケーションに対するkubernetesのリソースは`という名前空間に作成されますが、アプリケーション定義のextensions属性でkubernetesNamespace`を指定することで指定した名前空間に作成するようにできます。

docs.radapp.io

さらに、Radiusのリソースに定義したラベルとアノテーションをkubernetesのラベルとアノテーションとして付与することができます。

docs.radapp.io

ドキュメントにも記載されている通り、このようなRadiusアプリケーションを定義すると、確かにラベルとアノテーションがdeploymentに付与されていることがわかります。また、Radiusのapplicationで定義されたラベルがcontainerにも伝搬していますが、同じキーの場合はより具体的なcontainerのラベルで上書きされていることもわかります。

import radius as radius

@description('Radius environment ID. Set automatically by Radius')
param environment string

resource app 'Applications.Core/applications@2023-10-01-preview' = {
  name: 'myextensionapp'
  properties: {
    environment: environment
    extensions: [
      {
        kind: 'kubernetesNamespace'
        namespace: 'extension-demo'
      }
      {
        kind: 'kubernetesMetadata'
        labels: {
          'team.key1': 'appValue1'
          'team.key2': 'appValue2'
          'team.contact.name': 'Operations'
          'team.contact.alias': 'ops'
        }
        annotations: {
          'prometheus.io/port': '9090'
          'prometheus.io/scrape': 'true'
        }
      }
    ]
  }
}

resource frontend 'Applications.Core/containers@2023-10-01-preview' = {
  name: 'frontend2'
  properties: {
    application: app.id
    environment: environment
    container: {
      image: 'ghcr.io/radius-project/tutorial/webapp:edge'
    }
    extensions: [
      {
        kind: 'kubernetesMetadata'
        labels: {
          'team.key2': 'containerValue2'
          'team.contact.name': 'Frontend'
          'team.contact.alias': 'frontend-eng'
        }
      }
    ]
  }
}