APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Service Operator v2がGAされたので触ってみた

はじめに

先日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

本記事の投稿者: 谷合純也
AKS/ACAをメインにインフラ系のご支援を担当しています。
junya0530さんの記事一覧 | Zenn