デフォルトでは、Kubernetes Service のバックエンドエンドポイントはクラスター内のすべてのノードに分散されます。これにより、異なるノードグループ間を通過するトラフィックにおいて、接続性の問題やパフォーマンスの非効率性が生じる可能性があります。サービストポロジーを使用すると、エッジノード上のアプリケーションへのトラフィックを制限し、同じノードプール内のノードまたはローカルノードからのみアクセスされるようにできます。このトピックでは、サービストポロジー機能について説明し、その設定方法を説明します。
背景情報
エッジコンピューティングのシナリオでは、エッジノードは地理的な場所や、CPU アーキテクチャ、インターネットサービスプロバイダー (ISP)、クラウドサービスプロバイダーなどの他の論理属性によってグループ化されることがよくあります。これらのノードグループは、通常、互いに分離されています。この分離は、ネットワーク接続がない、リソースを共有しない、異種のリソースを使用する、または独立したアプリケーションを実行する可能性があることを意味します。
サービストポロジーの仕組み
これらの問題を解決するために、ACK Edge は、ネイティブの Service にエンドポイントトポロジー管理機能を追加します。これにより、簡単な設定で Service のバックエンド Endpoints のアクセススコープを制限できます。たとえば、エッジノード上のアプリケーションは、同じノードプール内のノード、またはローカルノードからのみアクセスできます。実装の原則を次の図に示します。
-
Service1 は、2つのバックエンド Pod インスタンスである Pod 2 と Pod 3 に関連付けられています。
annotation: "openyurt.io/topologyKeys: kubernetes.io/zone"は、Service1 のトポロジースコープをノードプールに設定します。 -
Pod 2 はノード 2 上にあり、Pod 3 はノード 4 上にあります。これらのノードは、それぞれノードプール A とノードプール B という2つの異なるノードプールに属しています。
-
Pod 1 が Service1 にアクセスすると、同じノードプール内の Pod 2 にのみトラフィックがルーティングされます。Pod 1 と Pod 3 は異なるノードプールにあるため、Pod 3 へのアクセスは制限されます。
注意事項
-
v1.26.3-aliyun.1 より前のバージョンでは、サービストポロジーを有効にするには、Service の作成時にサービストポロジーのアノテーションを適用する必要があります。Service の作成後にアノテーションを追加しても、この機能は有効になりません。この場合、Service を削除して再作成する必要があります。
-
v1.26.3-aliyun.1 以降のバージョンでは、Service の作成後にサービストポロジーのアノテーションを変更できます。変更はすぐに有効になります。
アノテーション
標準の Kubernetes Service にアノテーションを追加することで、サービストポロジーを設定できます。次の表で、利用可能なアノテーションを説明します。
|
アノテーションキー |
アノテーション値 |
説明 |
|
openyurt.io/topologyKeys |
kubernetes.io/hostname |
Service へのアクセスをローカルノードのみに制限します。 |
|
openyurt.io/topologyKeys |
kubernetes.io/zone または openyurt.io/nodepool |
Service へのアクセスを同じノードプール内のノードに制限します。お使いのACK Edge クラスターのバージョンが 1.18 以降の場合は、openyurt.io/nodepool の使用を推奨します。 |
|
- |
- |
Service にトポロジー制限は適用されません。 |
サービストポロジーの設定
コンソールまたは CLI を使用してサービストポロジーを設定できます。
コンソール
同じノードプール内のノードからのみアクセス可能な Service を作成するには、Service にアノテーションを追加します。たとえば、名前 を openyurt.io/topologyKeys に、値 を kubernetes.io/zone に設定します。詳細については、「サービス管理」をご参照ください。
CLI
ノードプールをトポロジードメインとして使用する Service を作成するには、次の 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