ACK Edge クラスターでは、アプリケーションセット(YurtAppSet)を使用して、複数のノードプールにまたがってアプリケーションをデプロイします。YurtAppSet は、ノードプールのラベル変更を検知する柔軟な応答メカニズムを提供し、インスタンス数やソフトウェアバージョンなど、ワークロード構成を複数のノードプールで統一的に管理できるようにします。本トピックでは、YurtAppSet を使用して ACK Edge クラスター内のアプリケーションを効率的に管理およびデプロイする方法について説明します。
背景情報
従来のソリューション
エッジコンピューティングのシナリオでは、コンピュートノードが地域ごとに異なる分布特性を持つことが多く、同一アプリケーションを異なる地域のコンピュートノードにデプロイする必要がある場合があります。たとえば、Deployment を使用する場合、従来のアプローチでは、まず同一地域のコンピュートノードに同一のラベルを割り当て、その後、NodeSelector を使用して異なるラベルを対象とする複数の Deployment を作成します。これにより、同一アプリケーションを複数の地域にデプロイできます。
地域の分布範囲が拡大し、アプリケーション要件が地域ごとに異なってくるにつれて、運用・メンテナンスの複雑さが増します。この複雑さは、以下の点に現れます。
-
煩雑な更新:アプリケーションのバージョンが変更された場合、各地域間で一貫性を保つために、すべての Deployment を手動で更新する必要があります。これにより、更新効率が低下します。
-
複雑な管理:管理対象の地域数が増加すると、各地域ごとに Deployment を区別・維持する必要があります。これにより、運用・メンテナンスの負荷が増加します。
-
冗長な構成:複数の地域にわたる Deployment 構成は類似度が非常に高いため、構成管理が煩雑になり、ミスが発生しやすくなります。
アプリケーションセット管理ソリューション
アプリケーションセット(YurtAppSet)は、Container Service for Edgeが提供する機能であり、Deployment リソースなどの複数のワークロードを包括的に管理するための上位レベルの抽象化を実現することで、エッジコンピューティングにおける分散デプロイメントを簡素化します。これには、ワークロードの作成、更新、削除が含まれます。
YurtAppSet は、従来のソリューションで見られる低効率な更新、複雑な管理、冗長な構成といった課題に対処し、運用・メンテナンス効率およびアプリケーションデプロイメントの柔軟性を向上させます。
-
workloadTemplate:統一テンプレート定義
YurtAppSet を使用すると、複数の地域にまたがるワークロードを管理するための単一の workloadTemplate を定義できます。これにより、重複する Deployment 構成が削減され、作成・更新・削除などのバッチ操作がより効率的かつ一貫性を持って実行できるようになります。
-
nodepoolSelector:自動デプロイメント
YurtAppSet は、nodepoolSelector メカニズムを用いて、ターゲットとなるノードプールを柔軟に選択します。これはノードプールの動的な変更にも同期します。新しいノードプールが作成されたり、既存のノードプールが削除されたりした場合、nodepoolSelector は最新の適合ノードプールを自動的に検出し、ワークロードの配信およびデプロイメントにマッチさせます。これにより、運用・メンテナンスの負担が軽減されます。
-
workloadTweaks:地域固有のカスタム構成
アプリケーション要件が地域ごとに異なる場合、YurtAppSet は workloadTweaks 機能を提供します。これにより、個別のワークロードを独立して管理・更新することなく、特定の地域でのワークロードをカスタマイズし、地域固有の要件を満たすことができます。
アプリケーションセットインスタンスの作成
-
ACK Edge クラスターのバージョンが 1.26 以降の場合、YurtAppSet を使用してアプリケーションをデプロイします。
-
ACK Edge クラスターのバージョンが 1.26 より前の場合、UnitedDeployment を使用してアプリケーションをデプロイします。
バージョン 1.26 以降
Deployment ワークロードテンプレートを使用する YurtAppSet アプリケーションセットインスタンスを作成します。
完全な YAML 例テンプレートは以下のとおりです。
apiVersion: apps.openyurt.io/v1beta1
kind: YurtAppSet
metadata:
name: example
namespace: default
spec:
revisionHistoryLimit: 5
pools:
- np1xxxxxx
- np2xxxxxx
nodepoolSelector:
matchLabels:
yurtappset.openyurt.io/type: "nginx"
workload:
workloadTemplate:
deploymentTemplate:
metadata:
labels:
app: example
spec:
replicas: 2
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- image: nginx:1.19.1
imagePullPolicy: Always
name: nginx
workloadTweaks:
- pools:
- np2xxxxxx
tweaks:
replicas: 3
containerImages:
- name: nginx
targetImage: nginx:1.20.1
patches:
- path: /metadata/labels/test
operation: add
value: test
以下の表に、関連するフィールドを示します。
|
フィールド |
説明 |
必須 |
|
spec.pools |
アプリケーションをデプロイするノードプール名のリスト(slice 型)を指定します。ノードプールの指定には、nodepoolSelector の使用を優先してください。 |
いいえ |
|
spec.nodepoolSelector |
labelSelector を使用して、アプリケーションをデプロイするノードプールを選択します。pools と nodepoolSelector の両方が指定されている場合は、その和集合が使用されます。
|
いいえ |
|
spec.workload.workloadTemplate |
管理対象のワークロードテンプレートを指定します。現在、 |
はい |
|
spec.workload.workloadTweaks |
ワークロードに対するカスタム変更を指定します。 |
いいえ |
|
spec.workload.workloadTweaks[*].pools |
この変更を適用するノードプール(slice 型)を指定します。 |
いいえ |
|
spec.workload.workloadTweaks[*].nodepoolSelector |
labelSelector を使用して、変更対象のノードプールを選択します。 |
いいえ |
|
spec.workload.workloadTweaks[*].tweaks.replicas |
変更後のワークロードのレプリカ数を指定します。 |
いいえ |
|
spec.workload.workloadTweaks[*].tweaks.containerImages |
変更後のワークロードのコンテナイメージを指定します。 |
いいえ |
|
spec.workload.workloadTweaks[*].tweaks.patches |
`patch` フィールドを使用して、workloadTemplate の任意のフィールドを変更します。 |
いいえ |
|
spec.workload.workloadTweaks[*].tweaks.patches[*].path |
workloadTemplate 内で変更するフィールドのパスを指定します。 |
いいえ |
|
spec.workload.workloadTweaks[*].tweaks.patches[*].operation |
パスに対して実行する操作を指定します(現在は add/remove/replace をサポート)。 |
いいえ |
|
spec.workload.workloadTweaks[*].tweaks.patches[*].value |
変更後の最新値を指定します(add/replace 操作のみ有効)。 |
いいえ |
|
status.conditions |
YurtAppSet の現在のステータス(ノードプール選択ステータスおよびワークロードステータスを含む)を示します。 |
|
|
status.readyWorkloads |
YurtAppSet が管理するワークロードのうち、すべてのレプリカが準備完了状態であるワークロードの数を示します。 |
|
|
status.updatedWorkloads |
YurtAppSet が管理するワークロードのうち、すべてのレプリカが最新バージョンに更新済みであるワークロードの数を示します。 |
|
|
status.totalWorkloads |
YurtAppSet が管理するワークロードの総数を示します。 |
バージョン 1.26 より前の場合
Deployment ワークロードテンプレートを使用する UnitedDeployment インスタンスを作成します。
完全な YAML 例テンプレートは以下のとおりです。
apiVersion: apps.kruise.io/v1alpha1
kind: UnitedDeployment
metadata:
name: example
namespace: default
spec:
revisionHistoryLimit: 5
selector:
matchLabels:
app: example
template:
deploymentTemplate:
metadata:
creationTimestamp: null
labels:
app: example
spec:
selector:
matchLabels:
app: example
template:
metadata:
creationTimestamp: null
labels:
app: example
spec:
containers:
- image: nginx:1.19.3
imagePullPolicy: Always
name: nginx
dnsPolicy: ClusterFirst
restartPolicy: Always
topology:
subsets:
- name: cloud
nodeSelectorTerm:
matchExpressions:
- key: alibabacloud.com/nodepool-id
operator: In
values:
- np4b9781c40f0e46c581b2cf2b6160****
replicas: 2
- name: edge
nodeSelectorTerm:
matchExpressions:
- key: alibabacloud.com/nodepool-id
operator: In
values:
- np47832359db2e4843aa13e8b76f83****
replicas: 2
tolerations:
- effect: NoSchedule
key: apps.openyurt.io/taints
operator: Exists
以下の表に、関連するフィールドを示します。
|
フィールド |
説明 |
|
spec.workloadTemplate |
サポートされるワークロードテンプレートを表します。ノードプールでは現在、 |
|
spec.topology.subsets |
複数のノードプールを指定します。 |
|
spec.topology.subsets[*].name |
ノードプールの名前です。 |
|
spec.topology.pools[*].nodeSelectorTerm |
NodePool とのホスト親和性構成を対応付けるために、 説明
[ノードプール] ページで、対応するクラウドおよびエッジノードプールの [名前] の下に表示されるノードプール ID を確認できます。 |
|
spec.topology.pools[*].tolerations |
ノードプールのホスト許容構成です。 |
|
spec.topology.pools[*].replicas |
各ノードプール下の Pod インスタンス数です。 |
アプリケーションセットを用いたエッジアプリケーションの管理
-
アプリケーションのバージョンアップグレード:アップグレードプロセスをトリガーするために、
spec.workload.workloadTemplateのフィールドを変更します。コントローラーは、更新されたテンプレートを各ノードプールのワークロードに適用し、その後、ノードプールコントローラーが Pod のアップグレードを実行します。 -
地域ごとの段階的アップデートの実行:対応するノードプール内のアプリケーション Pod のイメージ更新をトリガーするために、
spec.workload.workloadTweak[*].containerImages構成を変更します。 -
地域ごとのアプリケーションのスケーリング:対応するノードプール内のアプリケーション Pod のスケーリング操作をトリガーするために、
spec.workload.workloadTweak[*].replicas構成を変更します。 -
新規地域へのアプリケーションのデプロイ:spec.nodepoolSelector のラベルに一致する新しいノードプールを作成します。YurtAppSet はノードプールリソースの変更を検出し、そのノードプール向けに自動的にワークロードを作成します。その後、その地域のノードをノードプールに追加します。
-
地域ごとのアプリケーションのオフライン化:対応する地域のノードプールを削除します。YurtAppSet は、その地域に関連付けられたワークロードを自動的に削除します。