はじめに
Kubernetesでクラスタ間での連携する場合にはマルチクラスタや、サービスメッシュが思い浮かぶと思います。ASKではAzure Kubernetes Fleet Managerという機能があります。
- 同じサブスクリプション内の同じまたは異なるリソース グループにまたがる AKS クラスター
- 同じ Azure AD テナントの異なるサブスクリプションにわたる AKS クラスター
- リージョンは異なるが同じテナント内にある AKS クラスター

もっと詳細は公式ドキュメントを確認してください。
*プレビュー機能のため今後仕様の変更などが行われる可能性があります。
Azure Kuberntes Fleet Managerの作成
クイックスタートを元に作成していきます。
CLIの拡張機能を追加します。
az extension add --name fleet
環境変数を設定します。SUBSCRIPTION_IDは環境に合わせて入力します。GROUP、FLEETは任意の値です。
export SUBSCRIPTION_ID= export GROUP= export FLEET=
リソース グループを作成
az account set -s ${SUBSCRIPTION_ID}
az group create --name ${GROUP} --location eastus
Fleet Manager を作成
az fleet create --resource-group ${GROUP} --name ${FLEET} --location eastus
以上でFleet Managerの作成時代は完了です。
次に、メンバークラスタに参加させるためのAKSを作成します。
VNETを作成します。ドキュメントではwestcentralusが指定されていますがインスタンスサイズによってはクラスタが作成できない可能性があります。
export FIRST_VNET=first-vnet
export SECOND_VNET=second-vnet
export MEMBER_1_SUBNET=member-1
export MEMBER_2_SUBNET=member-2
export MEMBER_3_SUBNET=member-3
az network vnet create \
--name ${FIRST_VNET} \
--resource-group ${GROUP} \
--location eastus \
--address-prefixes 10.0.0.0/8
az network vnet create \
--name ${SECOND_VNET} \
--resource-group ${GROUP} \
--location westus \
--address-prefixes 10.0.0.0/8
az network vnet subnet create \
--vnet-name ${FIRST_VNET} \
--name ${MEMBER_1_SUBNET} \
--resource-group ${GROUP} \
--address-prefixes 10.1.0.0/16
az network vnet subnet create \
--vnet-name ${FIRST_VNET} \
--name ${MEMBER_2_SUBNET} \
--resource-group ${GROUP} \
--address-prefixes 10.2.0.0/16
az network vnet subnet create \
--vnet-name ${SECOND_VNET} \
--name ${MEMBER_3_SUBNET} \
--resource-group ${GROUP} \
--address-prefixes 10.1.0.0/16
一つ目のクラスターを作成します。
export MEMBER_CLUSTER_1=aks-member-1
az aks create \
--resource-group ${GROUP} \
--location eastus \
--name ${MEMBER_CLUSTER_1} \
--node-count 1 \
--network-plugin azure \
--vnet-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.Network/virtualNetworks/${FIRST_VNET}/subnets/${MEMBER_1_SUBNET}"
二つ目のクラスターを作成します。
export MEMBER_CLUSTER_2=aks-member-2
az aks create \
--resource-group ${GROUP} \
--location eastus \
--name ${MEMBER_CLUSTER_2} \
--node-count 1 \
--network-plugin azure \
--vnet-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.Network/virtualNetworks/${FIRST_VNET}/subnets/${MEMBER_2_SUBNET}"
メンバーに追加する前にメンバーがいるか確認してみます。
az fleet member list --resource-group ${GROUP} --fleet-name ${FLEET} -o table
何も表示されないと思います。
メンバーに参加させるために環境変数の設定します。
export MEMBER_CLUSTER_ID_1=/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.ContainerService/managedClusters/${MEMBER_CLUSTER_1}
export MEMBER_NAME_1=aks-member-1
export MEMBER_CLUSTER_ID_2=/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.ContainerService/managedClusters/${MEMBER_CLUSTER_2}
export MEMBER_NAME_2=aks-member-2
export MEMBER_CLUSTER_ID_3=/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.ContainerService/managedClusters/${MEMBER_CLUSTER_3}
export MEMBER_NAME_3=aks-member-3
クラスターをメンバーに追加します。
一つ目を追加します。
az fleet member create \
--resource-group ${GROUP} \
--fleet-name ${FLEET} \
--name ${MEMBER_NAME_1} \
--member-cluster-id ${MEMBER_CLUSTER_ID_1}
ここで追加されたか確認してみましょう。
az fleet member list --resource-group ${GROUP} --fleet-name ${FLEET} -o table
追加されたことが確認できます。
ClusterResourceId
Name ProvisioningState ResourceGroup
------------------------------------------------------------------------------------------------------------------------------------------ ------------ ------------------- ---------------
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/gorup/providers/Microsoft.ContainerService/managedClusters/aks-member-1 aks-member-1 Succeeded gorup
二つ目を追加します。
az fleet member create \
--resource-group ${GROUP} \
--fleet-name ${FLEET} \
--name ${MEMBER_NAME_2} \
--member-cluster-id ${MEMBER_CLUSTER_ID_2}
三つ目を追加します。
az fleet member create \
--resource-group ${GROUP} \
--fleet-name ${FLEET} \
--name ${MEMBER_NAME_3} \
--member-cluster-id ${MEMBER_CLUSTER_ID_3}
正常に追加されたかを確認します。
az fleet member list --resource-group ${GROUP} --fleet-name ${FLEET} -o table
Fleet Manager にアクセスします。
kubectlを利用できるようにクレデンシャルを取得します。
az fleet get-credentials --resource-group ${GROUP} --name ${FLEET}
この状態ではアクセスできません。Fleet 用にRBACを設定します。
最初にFleet のIDに対して環境変数を設定します。
export FLEET_ID=/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${GROUP}/providers/Microsoft.ContainerService/fleets/${FLEET}
RBACを設定します。
export IDENTITY=$(az ad signed-in-user show --query "id" --output tsv)
export ROLE="Azure Kubernetes Fleet Manager RBAC Cluster Admin"
az role assignment create --role "${ROLE}" --assignee ${IDENTITY} --scope ${FLEET_ID}
これでアクセスできるようになりました。
確認してみましょう。
kubectl get memberclusters
クラスタが確認できます。
NAME JOINED AGE aks-member-1 True 21m aks-member-2 True 14m aks-member-3 True 9m25s
以上でFeetの設定と確認が完了です。
まとめ
Azure Kubernetes Fleet Manager を設定してみました。簡単に設定できるので試してみると良いでしょう。
