ネイティブ Kubernetes サービスでは、バックエンド エンドポイントがクラスター内のすべてのノードに分散されます。この分散により、ノードプールをまたぐトラフィックでアクセスの問題やパフォーマンスの低下が発生する可能性があります。サービス トラフィック トポロジー機能を使用すると、エッジノード上のアプリケーションへのアクセスを、同一ノードプール内またはローカルノードからのみに制限できます。本ドキュメントでは、サービス トラフィック トポロジー管理機能とその構成方法について説明します。
背景情報
エッジコンピューティングのシナリオでは、エッジノードは場所、リージョン、または CPU アーキテクチャやインターネットサービスプロバイダー (ISP) などの論理的属性に基づいてグループ化されることが一般的です。これらのノードグループは通常分離されており、個別のネットワーク、リソース、またはアプリケーションを持つことがあります。
サービス トラフィック トポロジー管理の実装
このような課題に対応するため、ACK Edge はネイティブ サービスを拡張し、エンドポイント トポロジ管理機能を提供します。シンプルな構成により、サービスのバックエンド エンドポイントへのアクセス範囲を制限できます。たとえば、エッジノード上のアプリケーションへのアクセスを、同一ノードプール内またはローカルノードからのみに制限することが可能です。次の図はこの動作を示しています。
-
Service 1 は、Pod 2 および Pod 3 の 2 つのバックエンド インスタンスに関連付けられています。Service 1 に付与されたアノテーション
"openyurt.io/topologyKeys: kubernetes.io/zone"により、ノードプールのトポロジー範囲が定義されています。 -
Pod 2 をホストする Node 2 と、Pod 3 をホストする Node 4 は、それぞれ異なるノードプール A および B に属しています。
-
Pod 1 と Pod 3 は同一ノードプールに属していません。Pod 1 が Service 1 にアクセスすると、トラフィックは Pod 2 のみに転送され、Pod 3 へのトラフィックはブロックされます。
注意事項
-
v1.26.3-aliyun.1 より前のバージョンの場合:トラフィック トポロジー機能を有効にするには、サービス作成時にトポロジー アノテーションを追加する必要があります。サービス作成後にアノテーションを追加しても、機能は有効になりません。サービスを一度削除して再作成してください。
-
v1.26.3-aliyun.1 以降のバージョンの場合:サービス作成後にトポロジー アノテーションを追加または変更できます。変更は即座に反映されます。
アノテーションの説明
ネイティブ サービスにアノテーションを追加することで、トラフィック トポロジーを構成できます。以下の表は各パラメーターの説明です。
|
アノテーションキー |
アノテーション値 |
説明 |
|
openyurt.io/topologyKeys |
kubernetes.io/hostname |
サービスへのアクセスをローカルノードのみに制限します。 |
|
openyurt.io/topologyKeys |
kubernetes.io/zone または openyurt.io/nodepool |
サービスへのアクセスを現在のノードプール内のノードのみに制限できます。ACK Edge クラスター バージョン 1.18 以降では、openyurt.io/nodepool の使用を推奨します。 |
|
- |
- |
サービスにトポロジー制限はありません。 |
サービス トラフィック トポロジーの構成
サービス トラフィック トポロジーは、コンソールまたはコマンドラインから構成できます。
方法 1:コンソールを使用したサービス トラフィック トポロジーの構成
ノードプール内からのみアクセス可能なサービスを作成するには、サービスにアノテーションを追加します。たとえば、名前 を openyurt.io/topologyKeys に、値 を kubernetes.io/zone に設定します。サービスの作成方法の詳細については、「サービス管理」をご参照ください。

方法 2:コマンドラインを使用したサービス トラフィック トポロジーの構成
以下の YAML テンプレートは、ノードプール トポロジー ドメインを使用するサービスの作成方法を示しています。
apiVersion: v1
kind: Service
metadata:
annotations:
openyurt.io/topologyKeys: kubernetes.io/zone
name: my-service-nodepool
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: nginx
sessionAffinity: None
type: ClusterIP