アプリケーション

Verrazzanoでのアプリケーションの開発

Verrazzanoは、OAM仕様を使用して、アプリケーションを記述およびデプロイするための階層化されたアプローチを提供します。Open Application Model (OAM)は、Cloud Native Computing Foundation (CNCF)内で開発された仕様です。Verrazzanoは、OAM仕様バージョン0.2.1に準拠しています。

ApplicationConfigurationは、Componentの構成です。Componentは、アプリケーション実装の詳細をカプセル化します。アプリケーション・デプロイヤは、TraitおよびScopeを適用して、環境のComponentをカスタマイズします。

OAM仕様は拡張性をサポートしています。プラットフォームの動作は、OAM準拠の定義およびコントローラを追加することで拡張できます。具体的には、新しいワークロード、TraitおよびScope定義を追加できます。これらの定義は、Componentおよびアプリケーション構成によって参照でき、カスタム・コントローラによって処理されます。

アプリケーション構成

ApplicationConfigurationは、Componentの参照の集合です。TraitとScopeのセットを各Component参照に適用できます。このプラットフォームは、これらのComponent、TraitおよびScopeを使用して、デプロイメント中に最終アプリケーション・リソースを生成します。

次の例は、ApplicationConfigurationの大まかな構造を示しています。

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
  components:
    - componentName: example-component-1
      traits:
        ...
      scopes:
        ...
    - componentName: example-component-2
        ...

コンポーネント

Componentはワークロードの内容をラップします。プラットフォームはデプロイメント中にワークロードを抽出し、TraitおよびScopeの適用による新しいリソースを作成します。VerrazzanoおよびOAM仕様では、VerrazzanoHelidonWorkloadやContainerizedWorkloadなどの複数のワークロードが提供されます。ワークロードは、任意のKubernetesリソースにすることもできます。一部のKubernetesリソースでは、oam-kubernetes-runtimeオペレータに追加権限を付与する必要がある場合があります。

Componentはパラメータで表すこともできます。これにより、ApplicationConfiguration内で参照されたときにワークロード・コンテンツをカスタマイズできます。詳細は、OAM仕様を参照してください。

次の例は、Componentの大まかな構造を示しています。

apiVersion: core.oam.dev/v1alpha2
kind: Component
...
spec:
  workload:
    ...
  parameters:
    ...

ワークロード

Componentには埋込みワークロードが含まれます。VerrazzanoおよびOAM仕様には、VerrazzanoWebLogicWorkloadやContainerizedWorkloadなどの複数のワークロードが用意されています。ワークロードは、任意のKubernetesリソースにすることもできます。

次の例は、Component内に埋め込まれたVerrazzanoHelidonWorkloadワークロードを示しています。

apiVersion: core.oam.dev/v1alpha2
kind: Component
...
spec:
  workload:
    apiVersion: oam.verrazzano.io/v1alpha1
    kind: VerrazzanoHelidonWorkload
    spec:
      deploymentTemplate:
        podSpec:
          containers:
            - name: example-container
              image: ...
              ...

オプションで、ワークロードにWorkloadDefinitionを関連付けることができます。これにより、ワークロードのスキーマに関する情報をプラットフォームに提供します。WorkloadDefintionは、通常、エンド・ユーザーではなくプラットフォームによって提供されます。

トレイト

Traitは、コンポーネント・ワークロードをカスタマイズし、デプロイメント中に関連リソースを生成します。Verrazzanoには、IngressTraitやMetricsTraitなどの複数のTraitが用意されています。プラットフォームは、デプロイメント中にApplicationConfigurationに含まれるTraitを抽出します。この処理は、Componentリソースからのワークロード・コンテンツの抽出に似ています。一部のKubernetesリソースでは、oam-kubernetes-runtimeオペレータに作成権限を付与する必要があることに注意してください。

Kubernetesオペレータ(verrazzano-application-operatorなど)は、抽出されたこれらのTraitを処理し、追加の関連リソースを作成したり、関連するワークロードを変更します。各Trait実装の動作は異なります。

次の例は、参照先Componentに適用されるIngressTraitを示しています。

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
  components:
    - componentName: example-component
      traits:
        - trait:
            apiVersion: oam.verrazzano.io/v1alpha1
            kind: IngressTrait
            spec:
              rules:
                - paths:
                    - path: "/greet"

各Traitタイプには、オプションでTraitDefinitionを関連付けることができます。これにより、TraitのスキーマおよびTraitを適用できるワークロードに関する追加情報がプラットフォームに提供されます。TraitDefintionは、通常、エンド・ユーザーではなくプラットフォームによって提供されます。

スコープ

Scopeは、Componentワークロードをカスタマイズし、デプロイメント中に関連リソースを生成します。ApplicationConfigurationには、Scopeのコンテンツが埋め込まれているかわりにScope参照が含まれます。プラットフォームでは、適用された各Componentへの参照を使用してScopeが更新されます。この更新によって関連オペレータがトリガーされ、Scopeが処理されます。

次の例は、example-health-scopeという名前のHealthScopeへの参照を示しています。

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
  components:
    - componentName: example-component
      scopes:
        - scopeRef:
            apiVersion: core.oam.dev/v1alpha2
            kind: HealthScope
            name: example-health-scope
        ...

次の例は、参照されているHealthScopeの構成の詳細を示しています。

apiVersion: core.oam.dev/v1alpha2
kind: HealthScope
metadata:
  name: example-health-scope
spec:
  probe-method: GET
  probe-endpoint: /health

各Scopeタイプには、オプションでScopeDefinitionを関連付けることができます。これにより、Scopeの処理に関する追加情報がプラットフォームに提供されます。

  • Scopeのスキーマ。
  • Scopeを適用できるワークロード・タイプ。
  • 関連するComponent参照を記録するために使用されるScope内のフィールド。

ScopeDefintionは、通常、エンド・ユーザーではなくプラットフォームによって提供されます。

Verrazzanoワークロード

Verrazzanoプラットフォームには、複数のワークロード定義と実装が用意されています:

  • VerrazzanoWebLogicWorkloadは、WebLogicワークロードに使用されます。WebLogicワークロードを参照してください。
  • VerrazzanoCoherenceWorkloadはCoherenceワークロードに使用されます。Coherenceワークロードを参照してください。
  • VerrazzanoHelidonWorkloadはHelidonワークロードに使用されます。Helidonワークロードを参照してください。

OAM ContainerizedWorkload

ContainerizedWorkloadは、前述のワークロード・タイプによってカバーされない長時間実行コンテナ・ワークロードに使用する必要があります。このワークロード・タイプは、Deploymentワークロードに似ています。OAMをKubernetes以外のデプロイメント環境で使用できるようにするために提供されています。OAM仕様を参照してください。

Verrazzanoトレイト

Verrazzanoプラットフォームには、複数のTrait定義および実装が用意されています:

IngressTrait

IngressTraitは、Verrazzanoプラットフォームに含まれるIstioイングレス・ゲートウェイとの簡単な統合を提供します。verrazzano-application-operatorは、各IngressTraitを処理し、処理時に関連するGateway、VirtualServiceおよびCertificateリソースを生成します。Certificateはistio-systemネームスペースに作成されます。作成に使用される値は、Traitに明示的に指定されるか、環境または関連Componentから導出されます。

次の例は、パス/greetを使用してアプリケーションにアクセスできるようにするIngressTraitを示しています。

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
  components:
    - componentName: example-component
      traits:
        - trait:
            apiVersion: oam.verrazzano.io/v1alpha1
            kind: IngressTrait
            spec:
              rules:
                - paths:
                    - path: "/greet"

詳細は、APIドキュメントを参照してください。

MetricsTrait

MetricsTraitは、Verrazzanoプラットフォームに含まれるPrometheusサービスとの簡単な統合を提供します。verrazzano-application-operatorは各MetricsTraitを処理し、次の2つの処理を行います:

  • ワークロードの注釈を更新して、メトリック・ソース情報を提供します。
  • Prometheusのメトリック・スクレイピング構成をメトリック・スクレイピング・ターゲットで更新します。Verrazzanoプラットフォームでは、サポートされるワークロードを持つすべてのComponentにMetricsTraitが自動的に適用されます。

次の例は、自動的に適用されたMetricsTraitを示しています。

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
  components:
    - componentName: example-component
      traits:
        - trait:
            apiVersion: oam.verrazzano.io/v1alpha1
            kind: MetricsTrait

詳細は、APIドキュメントを参照してください。

Kubernetesリソース

VerrazzanoおよびOAMは、アプリケーションを定義およびカスタマイズするためのワークロードとTraitを提供します。ただし、状況によっては、提供されるリソース以外のリソースが必要な場合があります。この場合、他の既存のKubernetesリソースも使用できます。todo-listの例では、複数のComponentでこの機能を利用して、一意のServiceおよびConfigMap要件をサポートします。

ほとんどのKubernetesリソースは、Component内にワークロードとして埋め込むことができます。次のサンプルは、DeploymentをComponent内にワークロードとして埋め込む方法を示しています。oam-kubernetes-runtimeオペレータは、Componentを処理し、デプロイメント中に別のリソースにDeploymentを抽出します。

apiVersion: core.oam.dev/v1alpha2
kind: Component
...
spec:
  workload:
    kind: Deployment
    apiVersion: apps/v1
    name: ...
    spec:
      selector:
        ...
      template:
        ...

ほとんどのKubernetesリソースは、ApplicationConfiguration内にTraitとして埋め込むこともできます。次の例は、ApplicationConfiguration内にTraitとしてIngressを埋め込む方法を示しています。oam-kubernetes-runtimeオペレータは、ApplicationConfigurationを処理し、デプロイメント中に別のリソースにIngressを抽出します。次のサンプルでは、IngressがKubernetes Ingressで、Verrazzanoが提供するIngressTraitではないことに注意してください。

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
  components:
    - componentName: ...
      traits:
        - trait:
            apiVersion: networking.k8s.io/v1beta1
            kind: Ingress
            ...
            spec:
              rules:
                ...

oam-kubernetes-runtimeオペレータには、デフォルトで制限された権限セットがあります。一部のKubernetesリソースをワークロードまたはTraitとして使用できるようにするには、クラスタ管理者がoam-kubernetes-runtimeオペレータに追加権限を付与する必要がある場合があります。ワークロードまたはTraitとして埋め込まれる特定のリソースに追加のロールとロール・バインディングを作成します。次のClusterRoleおよびClusterRoleBindingの例は、oam-kubernetes-runtimeにIngressリソースを管理するための権限を付与する方法を示しています。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: oam-kubernetes-runtime-ingresses
rules:
  - apiGroups:
    - networking.k8s.io
    - extensions
    resources:
    - ingresses
    verbs:
    - create
    - delete
    - get
    - list
    - patch
    - update
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: oam-kubernetes-runtime-ingresses
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: oam-kubernetes-runtime-ingresses
subjects:
  - kind: ServiceAccount
    name: oam-kubernetes-runtime
    namespace: verrazzano-system

デプロイメント

Verrazzanoでは、様々なリソースの読取りと書込みを行う多数のKubernetesコントローラを介してアプリケーションのデプロイが行われます。各コントローラはアプリケーション・リソースを処理し、他の関連リソースを生成または更新します。様々なタイプのコントローラが様々なレベルのアプリケーション・リソースを処理します。

ApplicationConfigurationコントローラは、ApplicationConfigurationおよびComponentリソースを処理します。このコントローラは、ApplicationConfigurationリソース内で参照される各Componentのワークロードを抽出および格納します。Verrazzanoは、oam-kubernetes-runtimeオペレータ内にApplicationConfigurationコントローラを実装します。同様に、ApplicationConfigurationコントローラは、Componentリソースに関連付けられたTraitリソースをApplicationConfigurationに抽出して格納します。

ワークロード・コントローラは、ApplicationConfigurationコントローラによって作成されたワークロード・リソース(ContainerizedWorkloadやVerrazzanoWebLogicWorkloadなど)を処理します。このコントローラはこれらのワークロード・リソースを処理し、より具体的なランタイム・リソースを生成します。たとえば、ContainerizedWorkloadコントローラはContainerizedWorkloadリソースを処理し、Deploymentリソースを生成します。VerrazzanoWebLogicWorkloadコントローラはVerrazzanoWebLogicWorkloadリソースを処理し、Domainリソースを生成します。これらのコントローラは、ApplicationConfiguration内のワークロードのComponent参照に適用されるTraitおよびScopeを考慮に入れる場合があります。Verrazzanoは、これらのワークロード・コントローラを2つのオペレータに実装します。Verrazzano固有のワークロード(VerrazzanoHelidonWorkloadなど)は、verrazzano-application-operator内のコントローラによって処理されます。OAMによって定義されたワークロード(ContainerizedWorkloadなど)は、oam-kubernetes-runtimeオペレータを使用するコントローラによって処理されます。

Traitコントローラは、ApplicationConfigurationコントローラによって作成されたTraitリソース(MetricsTraitなど)を処理します。ApplicationConfigurationコントローラは、抽出された各Trait内でコントローラが適用されたコンポーネントを記録します。Traitコントローラは、抽出されたTraitリソースを処理し、他の関連リソースを生成または更新します。たとえば、verrazzano-application-operator内のIngressTraitコントローラはIngressTraitリソースを処理し、関連するGatewayおよびVirtualServiceリソースを生成します。同じオペレータには、MetricsTraitリソースを処理し、Deploymentなどの関連リソースに注釈を追加するMetricsTraitコントローラが含まれています。

Scopeコントローラは、デプロイメント中にApplicationConfigurationコントローラによって更新されたScopeリソースを読み取ります。ApplicationConfigurationコントローラは、Scopeが適用される各Componentへの参照を使用してScopeリソースを更新します。

次の図は、前述のリソースとコントローラの間の関係を示しています。

次の図は、hello-helidonの例に基づき、Kubernetesオペレータの観点からのリソースの処理を示しています。oam-kubernetes-runtime内のコントローラは、ApplicationConfigurationおよびComponentリソースを処理し、VerrazzanoHelidonWorkloadおよびIngressTraitを生成します。次に、verrazzano-application-operator内のコントローラがVerrazzanoHelidonWorkloadおよびIngressTraitリソースを処理して、Deployment、VirtualServiceおよびその他のリソースを生成します。


マルチクラスタ

マルチクラスタ環境でのVerrazzanoの詳細

プロジェクト

Verrazzanoプロジェクトの詳細

ワークロード

Verrazzanoアプリケーション・ワークロードの詳細