マルチクラスタ
マルチクラスタ環境での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の処理に関する追加情報がプラットフォームに提供されます。
ScopeDefintionは、通常、エンド・ユーザーではなくプラットフォームによって提供されます。
Verrazzanoプラットフォームには、複数のワークロード定義と実装が用意されています:
ContainerizedWorkloadは、前述のワークロード・タイプによってカバーされない長時間実行コンテナ・ワークロードに使用する必要があります。このワークロード・タイプは、Deploymentワークロードに似ています。OAMをKubernetes以外のデプロイメント環境で使用できるようにするために提供されています。OAM仕様を参照してください。
Verrazzanoプラットフォームには、複数のTrait定義および実装が用意されています:
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は、Verrazzanoプラットフォームに含まれるPrometheusサービスとの簡単な統合を提供します。verrazzano-application-operator
は各MetricsTraitを処理し、次の2つの処理を行います:
次の例は、自動的に適用されたMetricsTraitを示しています。
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
...
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: oam.verrazzano.io/v1alpha1
kind: MetricsTrait
詳細は、APIドキュメントを参照してください。
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およびその他のリソースを生成します。