Azure Kubernetes Fleet Manager の DNS 負荷分散は、可用性を高め、複数のメンバー クラスターにデプロイされたワークロード全体に負荷を分散するのに役立ちます。 この機能は DNS 経由で提供されるため、必要に応じてレイヤー 4 と 7 の負荷分散を提供するために使用できます。
このドキュメントの手順に従って、フリートでホストされているマルチクラスター アプリケーションの DNS ベースの負荷分散を設定します。
Von Bedeutung
Azure Kubernetes Fleet Manager のプレビュー機能は、セルフサービス、オプトイン ベースで利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Fleet Manager のプレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。
データ プレーン のネットワーク プレビューは、 networking.fleet.azure.com/v1beta1
API を使用してリリースされます。 プレビュー オブジェクトが表示されない場合は、Fleet Manager ハブ クラスターを操作するときに、 networking.fleet.azure.com/v1beta1
API を要求していることを確認します。
[前提条件]
Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
このドキュメントで参照されている オブジェクトと
TrafficManagerProfile
オブジェクトに関する説明を、TrafficManagerBackend
でお読みください。ハブ クラスターとマネージド ID を持つ Kubernetes Fleet Manager。 お持ちでない場合は、 Azure CLI を使用して Azure Kubernetes Fleet Manager を作成し、メンバー クラスターに参加させる方法に関するページを参照してください。
Fleet Manager のクラスター
aks-member-1
を使用して同じワークロードをデプロイする 2 つのメンバー クラスターaks-member-2
と。構成を完了するユーザーには、Azure ロールの割り当てを実行し、Fleet Manager ハブ クラスター Kubernetes API にアクセスするためのアクセス許可があります。 詳細については、 Kubernetes API へのアクセスに関する ページを参照してください。
プロビジョニングされた Azure Traffic Manager リソースをホストする既存の Azure リソース グループ。
以下の環境変数を設定します。
export SUBSCRIPTION_ID=<subscription> export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBER_CLUSTER_1=aks-member-1 export MEMBER_CLUSTER_2=aks-member-2 export TRAFFIC_MANAGER_GROUP=rg-flt-tm-demo export TRAFFIC_MANAGER_RG_ID="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${TRAFFIC_MANAGER_GROUP}
Fleet Manager ハブ クラスター Kubernetes API にアクセスするための資格情報を取得します。
az fleet get-credentials \ --resource-group ${GROUP} \ --name ${FLEET}
Fleet Manager のアクセス許可を構成する
プレビュー期間中は、Fleet Manager で Azure Traffic Manager リソースを作成および管理したり、メンバー クラスターで公開されているサービスのパブリック IP アドレスを取得したりするための追加の手順を実行する必要があります。
この手順を完了するには、マネージド ID を有効にして Fleet Manager を作成する必要があります。 ユーザーには、Azure RBAC ロールの割り当てアクセス許可が必要です。
Fleet Manager リソースの ID 情報を取得します。
az fleet show \ --resource-group ${GROUP} \ --name ${FLEET} \ --query identity
出力は、出力例のようになります。
{ "principalId": "<FLEET-PRINCIPAL-ID>", "tenantId": "<ENTRA-ID-TENANT>", "type": "SystemAssigned", "userAssignedIdentities": null }
Azure Kubernetes Fleet Manager Hub Agent
ロールを Fleet Manager ハブ クラスター ID に割り当て、Traffic Manager リソースが作成される既存のリソース グループにスコープを制限します。az role assignment create \ --assignee "<FLEET-PRINCIPAL-ID>" \ --role "de2b316d-7a2c-4143-b4cd-c148f6a355a1" \ --scope ${TRAFFIC_MANAGER_RG_ID}
Fleet Manager ハブ クラスター ID には、メンバー クラスターに対する Azure
Reader
ロールも必要です。そのため、Fleet Manager は、メンバー クラスターがTrafficMangerBackend
経由でServiceExport
に追加されたときに、メンバー クラスターのパブリック IP アドレスを読み取ることができます。az role assignment create \ --assignee "<FLEET-PRINCIPAL-ID>" \ --role "Reader" \ --scope /full/path/to/member-cluster
フリート リソースのメンバー クラスター間でワークロードをデプロイする
注
このハウツー ガイドの手順では、デモンストレーションのみを目的にサンプル アプリケーションを参照しています。 このワークロードは、既存の Deployment オブジェクトと Service オブジェクトのいずれかに置き換えることができます。
次の手順では、Fleet Manager のクラスター リソース配置 (CRP) を使用して、Fleet Manager ハブ クラスターからメンバー クラスターにサンプル ワークロードをデプロイします。 または、これらの Kubernetes 構成を各メンバー クラスターに 1 つずつ個別にデプロイすることもできます。
Fleet Manager ハブ クラスターに名前空間を作成します。
kubectl create namespace kuard-demo
出力は次のようになります。
namespace/kuard-demo created
以下を
kuard-export-service.yaml
という名前のファイルに保存して、デプロイ、Service、ServiceExport オブジェクトを Fleet Manager ハブ クラスターにステージングします。apiVersion: apps/v1 kind: Deployment metadata: name: kuard namespace: kuard-demo spec: replicas: 2 selector: matchLabels: app: kuard template: metadata: labels: app: kuard spec: containers: - name: kuard image: gcr.io/kuar-demo/kuard-amd64:blue resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi --- apiVersion: v1 kind: Service metadata: name: kuard-svc namespace: kuard-demo labels: app: kuard spec: selector: app: kuard ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: networking.fleet.azure.com/v1alpha1 kind: ServiceExport metadata: name: kuard-export namespace: kuard-demo annotations: networking.fleet.azure.com/weight: "50"
Fleet Manager ハブ クラスターでオブジェクトをステージングします。
kubectl apply -f kuard-export-service.yaml
サンプルの
ServiceExport
仕様では、メンバー クラスターから Fleet Manager ハブ クラスターにサービスをエクスポートできます。 2 つのクラスター間でトラフィックを均等に分割して、ServiceExport
重みの注釈を 50 に設定します。 正常にエクスポートされると、サービスとそのすべてのエンドポイントが Fleet Manager ハブ クラスターに同期され、これらのエンドポイント間で DNS 負荷分散を設定するために使用できます。 出力は次の例のようになります。deployment.apps/kuard created service/kuard-svc created serviceexport.networking.fleet.azure.com/kuard-export created
各サービスには、Azure Traffic Manager 経由で公開できるように、一意の DNS ラベルが必要です。 Fleet Manager クラスター リソース配置
ResourceOverride
を使用して、メンバー クラスターごとのサービス定義を変更し、Azure リージョンとクラスター名に基づいて一意の名前を作成します。 (この例では、Azure リージョンごとに) クラスター セレクターごとにオーバーライドを作成する必要があります。apiVersion: placement.kubernetes-fleet.io/v1alpha1 kind: ResourceOverride metadata: name: ro-kuard-demo-eastus namespace: kuard-demo spec: placement: name: crp-kuard-demo resourceSelectors: - group: "" kind: Service version: v1 name: kuard-svc policy: overrideRules: - clusterSelector: clusterSelectorTerms: - labelSelector: matchLabels: fleet.azure.com/location: eastus jsonPatchOverrides: - op: add path: /metadata/annotations value: {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}
注
"${MEMBER-CLUSTER-NAME}" は、リソース配置のオーバーライド 予約変数 であり、実行時にメンバー クラスターの名前に置き換えられます。
kubectl apply -f ro-kuard-demo-eastus.yaml
という名前のファイルに、次の Fleet Manager
crp-dns-demo.yaml
(CRP) を作成します。eastus
リージョンで最大 2 つのクラスターを選択していることに注意してください。apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: crp-dns-demo spec: resourceSelectors: - group: "" version: v1 kind: Namespace name: kuard-demo policy: placementType: PickN numberOfClusters: 2 affinity: clusterAffinity: requiredDuringSchedulingIgnoredDuringExecution: clusterSelectorTerms: - labelSelector: matchLabels: fleet.azure.com/location: eastus
CRP を適用します。
kubectl apply -f crp-dns-demo.yaml
成功した場合、出力は次のようになります。
clusterresourceplacement.placement.kubernetes-fleet.io/crp-dns-demo created
Azure Traffic Manager を使用して DNS 負荷分散を構成する
Traffic Manager で使用するパラメーターを定義する
TrafficManagerProfile
を定義し、ファイルkuard-atm-demo.yaml
に保存します。apiVersion: networking.fleet.azure.com/v1beta1 kind: TrafficManagerProfile metadata: name: kuard-atm-demo namespace: kuard-demo spec: resourceGroup: "rg-flt-tm-demo" monitorConfig: port: 80
構成を適用します。
kubectl apply -f kuard-atm-demo.yaml
メンバー クラスターからエクスポートされた
TrafficManagerBackend
エントリをまとめてグループ化するために使用する、対応するService
を定義します。apiVersion: networking.fleet.azure.com/v1beta1 kind: TrafficManagerBackend metadata: name: kuard-atm-demo-backend namespace: kuard-demo spec: profile: name: "kuard-atm-demo" backend: name: "kuard-svc" weight: 100
構成を適用します。
kubectl apply -f kuard-atm-demo-backend.yaml
次のコマンドを実行して、Azure Traffic Manager を介してサービスが使用可能であることを確認します。
nslookup kuard-atm-demo.trafficmanager.net
出力は次の例のようになるはずです。
Server: 10.X.X.254 Address: 10.X.X.254#53 Non-authoritative answer: Name: kuard-atm-demo.trafficmanger.net Address: 123.X.X.16 Name: kuard-atm-demo.trafficmanger.net Address: 74.X.X.78 Name: kuard-atm-demo.trafficmanger.net Address: 173.X.X.164
Web ブラウザーを使用して URL にアクセスし、Kuard がどのように応答するかを確認します。 DNS をフラッシュして再試行して、要求が別のクラスターの別のサービス インスタンスによって処理されるかどうかを確認してみてください。
Azure Kubernetes Service