YurtAppSet を使用すると、単一の構成から ACK Edge クラスター内の複数のノードプールにまたがるアプリケーションをデプロイおよび管理できます。YurtAppSet はノードプールのラベルの変更を監視し、ワークロードの同期を自動的に維持します。これにより、各ノードプールを個別に操作することなく、クラスター全体でバージョンを更新したり、アプリケーションをスケーリングしたりできます。
前提条件
開始する前に、以下をご確認ください。
-
ACK Edge クラスター
-
クラスターに接続するように構成された kubectl
-
クラスターでカスタムリソースを作成および管理する権限
アプローチの選択
| クラスターバージョン | 推奨リソース |
|---|---|
| 1.26 以降 | YurtAppSet (apps.openyurt.io/v1beta1) |
| 1.26 より前 | UnitedDeployment (apps.kruise.io/v1alpha1) |
背景情報
エッジコンピューティングでは、通常、同じアプリケーションが複数のリージョンのノードで実行されます。従来のアプローチでは、各リージョンのノードにラベルを割り当て、リージョンごとに個別の Deployment を作成していましたが、リージョンの数が増えるにつれて管理が困難になります。
-
面倒な更新:バージョンの変更ごとに、すべての Deployment を手動で更新する必要があります。
-
複雑な管理:リージョンが増えるにつれて、個別の Deployment の追跡と維持にエラーが発生しやすくなります。
-
冗長な構成:リージョン間の Deployment はほぼ同じ仕様を共有しているため、変更が面倒になります。
YurtAppSet は、次の 3 つのコアメカニズムでこれらの問題を解決します。
| メカニズム | 目的 |
|---|---|
workloadTemplate |
すべてのターゲットノードプールに適用される単一のワークロードテンプレートを定義します |
nodepoolSelector |
ラベルによってターゲットノードプールを選択します。新規作成または削除されたノードプールを自動的に検出します |
workloadTweaks |
個別のワークロードを作成することなく、個々のノードプールの特定のフィールド (レプリカ、コンテナイメージ、任意のパッチ) をオーバーライドします |
YurtAppSet (クラスターバージョン 1.26 以降)
YurtAppSet インスタンスの作成
次の YAML は、2 つのノードプールに nginx ワークロードをデプロイする YurtAppSet を作成します。np1xxxxxx ノードプールは nginx:1.19.1 のレプリカを 2 つ使用し、np2xxxxxx ノードプールはデフォルトをオーバーライドして nginx:1.20.1 のレプリカを 3 つ使用します。
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
YAML フィールドリファレンス
Spec フィールド
| フィールド | 説明 | 必須 |
|---|---|---|
spec.pools |
デプロイ先のノードプール名のリスト。pools と nodepoolSelector の両方が設定されている場合は、その和集合 (UNION) が使用されます。 |
いいえ |
spec.nodepoolSelector |
NodePool リソースの metadata.labels に一致するラベルによってノードプールを選択します。一致する新しいノードプールを自動的に含め、削除されたノードプールを除外します。 |
いいえ |
spec.workload.workloadTemplate |
デプロイするワークロードテンプレート。deploymentTemplate と statefulSetTemplate をサポートします。 |
はい |
spec.workload.workloadTweaks |
workloadTemplate の上に適用されるノードプールごとのオーバーライド。 |
いいえ |
ほとんどのデプロイメントでは、nodepoolSelectorをpoolsよりも優先して使用することを推奨します。ラベルベースの選択は、YurtAppSet 構成を変更することなく、新しく追加または削除されたノードプールを自動的に処理します。NodePool のラベルを変更するには、クラスターコンソールの [カスタムリソース] ページで、対応する NodePool の YAML を編集します。
workloadTweaks フィールド
| フィールド | 説明 | 必須 |
|---|---|---|
workloadTweaks[*].pools |
このオーバーライドが適用されるノードプール (名前別)。 | いいえ |
workloadTweaks[*].nodepoolSelector |
このオーバーライドが適用されるノードプール (ラベル別)。 | いいえ |
workloadTweaks[*].tweaks.replicas |
選択したノードプールのレプリカ数をオーバーライドします。 | いいえ |
workloadTweaks[*].tweaks.containerImages |
選択したノードプールのコンテナイメージをオーバーライドします。 | いいえ |
workloadTweaks[*].tweaks.patches |
選択したノードプールの workloadTemplate に任意のフィールドパッチを適用します。 |
いいえ |
tweaks.patches[*].path |
workloadTemplate 内で変更するフィールドの JSON パス。 |
いいえ |
tweaks.patches[*].operation |
パッチ操作:add、remove、または replace。 |
いいえ |
tweaks.patches[*].value |
設定する値。add および replace 操作にのみ適用されます。 |
いいえ |
Status フィールド
| フィールド | 説明 |
|---|---|
status.conditions |
ノードプールの選択ステータスやワークロードのステータスなど、YurtAppSet の現在のステータス。 |
status.readyWorkloads |
すべてのレプリカが準備完了状態にある管理対象ワークロードの数。 |
status.updatedWorkloads |
すべてのレプリカが最新バージョンに更新された管理対象ワークロードの数。 |
status.totalWorkloads |
この YurtAppSet によって管理されるワークロードの総数。 |
UnitedDeployment (クラスターバージョン 1.26 より前)
UnitedDeployment インスタンスの作成
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
YAML フィールドリファレンス
| フィールド | 説明 |
|---|---|
spec.workloadTemplate |
デプロイするワークロードテンプレート。deploymentTemplate と statefulSetTemplate をサポートします。 |
spec.topology.subsets |
デプロイ先のノードプールのリスト。 |
spec.topology.subsets[*].name |
ノードプールの名前。 |
spec.topology.subsets[*].nodeSelectorTerm |
ノードアフィニティ構成。キーとして alibabacloud.com/nodepool-id を使用し、値としてノードプール ID を使用します。ノードプール ID を見つけるには、[ノードプール] ページに移動し、[名前] 列を確認します。 |
spec.topology.subsets[*].tolerations |
ノードプールの Toleration 構成。 |
spec.topology.subsets[*].replicas |
ノードプール内の Pod レプリカの数。 |
エッジアプリケーションの管理
YurtAppSet が実行されると、すべてのライフサイクル操作は spec を変更することによって機能します。YurtAppSet コントローラーは、変更を各ノードプールのワークロードに自動的に伝播します。
アプリケーションバージョンのアップグレード
新しいコンテナイメージまたは他のテンプレートの変更で spec.workload.workloadTemplate を更新します。コントローラーは更新されたテンプレートをすべての管理対象ワークロードに適用し、各ノードプールでローリングアップデートをトリガーします。
特定リージョンでのグレースケールアップデートの実行
ターゲットノードプールの spec.workload.workloadTweaks[*].containerImages を更新します。そのノードプール内の Pod のみが新しいイメージを受け取り、他のノードプールは影響を受けません。
特定リージョンでのアプリケーションのスケーリング
ターゲットノードプールの spec.workload.workloadTweaks[*].tweaks.replicas を更新します。これにより、そのノードプールに対してのみ workloadTemplate で定義されたレプリカ数がオーバーライドされます。
新しいリージョンへのデプロイ
spec.nodepoolSelector に一致するラベルを持つ新しいノードプールを作成します。YurtAppSet は新しい NodePool リソースを検出し、そのためのワークロードを自動的に作成します。その後、そのリージョンのノードをノードプールに追加します。
nodepoolSelector を使用する場合、YurtAppSet 構成への変更は不要です。
特定リージョンでのアプリケーションのオフライン化
ターゲットリージョンのノードプールを削除します。YurtAppSet は削除を検出し、そのノードプールに関連付けられたワークロードを自動的に削除します。