はじめに
先日Azure Service Operator v2(以降ASO)がGAとなりました。 github.com
今回のバージョンでは、以下のリソースが新しくサポートされます。
個人的にはAKSのサポートが嬉しいです!
New resources - Support new AKS ManagedCluster version 20230201 (#2727) - Support Azure SQL and 20+ associated resources (#2698) - Support PrivateLinkService (#2733) - Support PrivateEndpoint (#2733) - Support PrivateDNSZone Records (#2733) - Support Synapse Workspace and BigDataPool (#2860)
そこで、今回はAKSにASOをデプロイし、ASOからさらにAKSを作成してみます。
ちなみに以前、v1当時にも同じように検証ブログを執筆しておりました。
こちらも是非ご覧ください!
techblog.ap-com.co.jp
ASOデプロイ
前述したASOのリポジトリの手順にてデプロイを行います。
前提条件
- Kubernetesクラスタ(少なくともバージョン1.16)が作成され、稼働していること。 Kindでも可。
- Helmがインストールされていること
- リソースをプロビジョニングするためのAzureサブスクリプションが作成されていること。
- Operatorが使用するAzure Service Principalを作成する。 作成方法については、次節で説明します。
デプロイ
まず、cert-manager をデプロイし、すべての
PodがRunnigとなるのを待ちます。cert-managerはOperatorのAdmission Webhookとkube-apiserverとのmTLS通信にて使用します。
$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.8.2/cert-manager.yaml $ kubectl get pods -n cert-manager -w
次にAzure Service Principalを作成します。
Azure Service Principalはsubscription内のリソースを作成するためのAzure Service Operatorの権限を
付与するために使用します。今回はContributorロールを付与しています。
# テナントID取得 $ AZURE_TENANT_ID=$(az account show -o tsv --query tenantId) # サブスクリプションID取得 $ AZURE_SUBSCRIPTION_ID=$(az account show -o tsv --query id) # Service Principalの作成 $ az ad sp create-for-rbac -n azure-service-operator --role contributor \ --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID
Service Principalを作成すると以下の出力があります。
次のステップでappIdとpasswordの値を使用するので控えておいてください。
{ "appId": "xxxxxxxxxx", "displayName": "azure-service-operator", "name": "http://azure-service-operator", "password": "xxxxxxxxxxx", "tenant": "xxxxxxxxxxxxx" }
上記のappIdとpasswordの値を用いて、以下環境変数を設定します。
$ AZURE_CLIENT_ID=<appIdの値> $ AZURE_CLIENT_SECRET=<passwordの値>
helmコマンドでASOをデプロイします。 ASOは今回は、azureserviceoperator-system namespaceにデプロイルされるように指定しています。
$ helm repo add aso2 https://raw.githubusercontent.com/Azure/azure-service-operator/main/v2/charts $ helm upgrade --install --devel aso2 aso2/azure-service-operator \ --create-namespace \ --namespace=azureserviceoperator-system \ --set azureSubscriptionID=$AZURE_SUBSCRIPTION_ID \ --set azureTenantID=$AZURE_TENANT_ID \ --set azureClientID=$AZURE_CLIENT_ID \ --set azureClientSecret=$AZURE_CLIENT_SECRET
以上で、ASOのデプロイは完了です。
使い方
ASOを使ったAzureリソースのデプロイしていきます。
今回は以下のサンプルマニフェストを用いて、AKSをデプロイしてみます。
github.com
以下コマンドを実行し、ResourceGroupとAKSを宣言的に記載したKubernetes CustomResourceを
デプロイします。これらをデプロイすることで、ASOがAzureにResource GroupとAKSをデプロイします。
cat << EOT | k apply -f - apiVersion: v1 kind: Namespace metadata: creationTimestamp: null name: aso-aks spec: {} status: {} --- apiVersion: resources.azure.com/v1beta20200601 kind: ResourceGroup metadata: name: rg-aso-aks namespace: aso-aks spec: location: japaneast --- apiVersion: containerservice.azure.com/v1api20230202preview kind: ManagedCluster metadata: name: samplemanagedcluster202221preview namespace: aso-aks spec: location: japaneast owner: name: rg-aso-aks dnsPrefix: aso agentPoolProfiles: - name: pool1 count: 1 vmSize: Standard_DS2_v2 osType: Linux mode: System identity: type: SystemAssigned EOT
managedclustersリソースがREADY = trueとなれば作成成功です。
$ k -n aso-aks get managedclusters NAME READY SEVERITY REASON MESSAGE samplemanagedcluster202221preview True Succeeded
以下コマンドでAKSが作成されていることが確認できます。
$ az aks list -o table | head -1 ; az aks list -o table | grep samplemanagedcluster202221preview Name Location ResourceGroup KubernetesVersion CurrentKubernetesVersion ProvisioningState Fqdn samplemanagedcluster202221preview japaneast rg-aso-aks 1.24.10 1.24.10 Succeeded aso-n0cv8jhv.hcp.japaneast.azmk8s.io
冪等性の担保
ASOはOperatorとして実装されています。
OperatorはCustomResourceに宣言された定義に沿って、常に管理対象リソースを監視し
冪等性を保つように設計されています。これをReconcile Loopという仕組みで実現しています。
つまり、Azure側でAKSの定義を変更した場合、CustomResourceの定義に戻るようにASOが
Azure側のAKS定義を更新します。
実際の動作を確認してみます。
今回はノードプールのノード数を1から5に変更してみます。
まず、Azure側でノード数を変更します。
しばらくすると、ノード数が5になります。
また、しばらくするとASOのReconcile Loopによりノード数が1に戻ったことが確認できるかと思います。
AKSのアクティビティログよりASOが定義を更新したことが確認できます。
ここで確認したReconcile Loopにより、ASOはAzureリソースを宣言的にKuberenetes(AKS)で
管理できるというわけです。
さいごに
IaCではありませんが、Azureリソースを宣言的に管理でき、冪等性を担保できるツールということを
考えると、ASOは十分に魅力的なツールであると思います。AKSのほかにもASOはAzureリソースを
デプロイ可能です。以下にサンプルのyamlのディレクトリを記載しますので、是非ご活用いただけると
嬉しいです!!!
github.com
ACS事業部のご紹介
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
www.ap-com.co.jp
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。
www.ap-com.co.jp