Azure

Azure Kubernetes Fleet Manager でクラスタ間を連携する

はじめに

Kubernetesでクラスタ間での連携する場合にはマルチクラスタや、サービスメッシュが思い浮かぶと思います。ASKではAzure Kubernetes Fleet Managerという機能があります。

  • 同じサブスクリプション内の同じまたは異なるリソース グループにまたがる AKS クラスター
  • 同じ Azure AD テナントの異なるサブスクリプションにわたる AKS クラスター
  • リージョンは異なるが同じテナント内にある AKS クラスター

もっと詳細は公式ドキュメントを確認してください。

Azure Kubernetes Fleet Manager アーキテクチャの概要 | Microsoft Learn
Azure Kubernetes Fleet Manager アーキテクチャの概要 | Microsoft Learn

この記事では、Azure Kubernetes Fleet Manager のアーキテクチャの概要を示します

learn.microsoft.com

*プレビュー機能のため今後仕様の変更などが行われる可能性があります。

Azure Kuberntes Fleet Managerの作成

クイックスタートを元に作成していきます。

クイック スタート: Azure Kuberntes Fleet Manager リソースを作成し、メンバー クラスターを参加させる | Microsoft Learn
クイック スタート: Azure Kuberntes Fleet Manager リソースを作成し、メンバー クラスターを参加させる | Microsoft Learn

このクイック スタートでは、Azure Kuberntes Fleet Manager リソースを作成し、メンバー クラスターを参加させる方法について説明します。

learn.microsoft.com

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 を設定してみました。簡単に設定できるので試してみると良いでしょう。

 

-Azure
-