APC 技術ブログ

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

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

[Cluster API] AKS on AKSを立ててみよう

こんにちは、ACS事業部の谷合です。

以下の記事の続きとなります。 techblog.ap-com.co.jp

弊社ではPlatform Engineeringに注目しており、その延長線上で私もKubernetesクラスタ(以降K8s)を宣言的に自動払い出しできるツールの調査を行っています。
※ここでいう宣言的とは、yaml形式などのマニフェストでクラスタ定義を記載し、管理を行うことを指します。

自動払い出しが可能なツールとして、SIG Cluster LifecycleのsubprojectであるCluster APIをご紹介します。なお、Cluster APIの詳細な説明については、前回の記事のCluster APIとはCluster APIコンセプトの章をご確認ください。

前回は、あらかじめ作成済のAzure Kubernetes Sevice(以降AKS)に、バニラなK8sを立ててみましたが、今回はAKS上にさらにAKSを立ててみます。

AKS払い出し

今回は以下のCluster API Provider AzureのAKSのページの手順に沿って作業を行います。 capz.sigs.k8s.io

前提

  • 以下のツールがインストールまたは作成されていること
  • サービスプリンシパルが作成されていること
    ※サービスプリンシパル作成後に出力される結果から、appIdとpasswordを控えておいてください。

環境変数設定

export CLUSTER_NAME="aks-capi-cluster"
export WORKER_MACHINE_COUNT=1
export KUBERNETES_VERSION="v1.26.3"
export AZURE_LOCATION="japaneast"
export AZURE_RESOURCE_GROUP="rg-capi"
export AZURE_SUBSCRIPTION_ID=$(az account show -o tsv --query id)
export AZURE_TENANT_ID=$(az account show -o tsv --query tenantId)
export AZURE_CLIENT_SECRET="<password>"
export AZURE_CLIENT_ID="<appId>"
export AZURE_NODE_MACHINE_TYPE="Standard_D2s_v3"
export AZURE_CLUSTER_IDENTITY_SECRET_NAME="cluster-identity-secret"
export AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE="default"
export CLUSTER_IDENTITY_NAME="cluster-identity"

# Azureのノードプールを使うため必須
export EXP_MACHINE_POOL=true

シークレット作成

上記で設定した環境変数を使用し、シークレットを作成します。

kubectl create secret generic "${AZURE_CLUSTER_IDENTITY_SECRET_NAME}" \
--from-literal=clientSecret="${AZURE_CLIENT_SECRET}" \
--namespace "${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE}"

初期化

clusterctl init --infrastructure azure

AKSクラスタyaml生成

以下のコマンドを実行することで、先に設定した環境変数に従ってマニフェストを作成してくれます。

clusterctl generate cluster ${CLUSTER_NAME} \
--kubernetes-version ${KUBERNETES_VERSION} \
--flavor aks > aks.yaml

yamlファイルは以下のようになります。

クラスタyaml適用

上記で作成したyamlファイルを適用することで、AKS上にAKSが作成されます。

kubectl apply -f aks.yaml
cluster.cluster.x-k8s.io/aks-capi-cluster created
azuremanagedcontrolplane.infrastructure.cluster.x-k8s.io/aks-capi-cluster created
azuremanagedcluster.infrastructure.cluster.x-k8s.io/aks-capi-cluster created
machinepool.cluster.x-k8s.io/aks-capi-cluster-pool0 created
azuremanagedmachinepool.infrastructure.cluster.x-k8s.io/aks-capi-cluster-pool0 created
machinepool.cluster.x-k8s.io/aks-capi-cluster-pool1 created
azuremanagedmachinepool.infrastructure.cluster.x-k8s.io/aks-capi-cluster-pool1 created
azureclusteridentity.infrastructure.cluster.x-k8s.io/cluster-identity created

クラスタ確認

プロビジョニングには数分かかるため、数分後に以下のコマンドでクラスタが確認可能となります。 また、Azure上のリソースグループを確認することでもAKSが新たに払い出されていることが確認できるはずです。

clusterctl describe cluster aks-capi-cluster
NAME                                                                   READY  SEVERITY  REASON  SINCE  MESSAGE 
Cluster/aks-capi-cluster                                               True                     2m54s           
├─ClusterInfrastructure - AzureManagedCluster/aks-capi-cluster                                           
├─ControlPlane - AzureManagedControlPlane/aks-capi-cluster             True                     2m54s           
└─Workers                                                                                                       
  ├─MachinePool/aks-capi-cluster-pool0                                 True                     2m43s           
  └─MachinePool/aks-capi-cluster-pool1                                 True                     2m43s           

New clusterctl version available: v1.4.1 -> v1.4.2
https://github.com/kubernetes-sigs/cluster-api/releases/tag/v1.4.2

AKS接続

まず以下コマンドでconfigを生成します。

az aks get-credentials --resource-group ${AZURE_RESOURCE_GROUP} --name ${CLUSTER_NAME}
kubectl config use-context <context name>

その後、以下にコマンドでnodeリソースが見えるはずです。

kubectl get node -owide
NAME                            STATUS   ROLES   AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-pool0-23829552-vmss000000   Ready    agent   15m   v1.26.3   10.240.0.4    <none>        Ubuntu 22.04.2 LTS   5.15.0-1036-azure   containerd://1.6.18+azure-1
aks-pool1-23829552-vmss000000   Ready    agent   15m   v1.26.3   10.240.0.33   <none>        Ubuntu 22.04.2 LTS   5.15.0-1036-azure   containerd://1.6.18+azure-1

また、Podを確認すると、以下のような結果が返るかと思います。

kubectl get po -A -owide
NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
kube-system   azure-ip-masq-agent-ckn2t             1/1     Running   0          14m   10.240.0.33   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   azure-ip-masq-agent-m88wl             1/1     Running   0          14m   10.240.0.4    aks-pool0-23829552-vmss000000   <none>           <none>
kube-system   cloud-node-manager-hblzp              1/1     Running   0          14m   10.240.0.4    aks-pool0-23829552-vmss000000   <none>           <none>
kube-system   cloud-node-manager-mgf44              1/1     Running   0          14m   10.240.0.33   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   coredns-6b9cb549f4-88c49              1/1     Running   0          15m   10.240.0.46   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   coredns-6b9cb549f4-npb6m              1/1     Running   0          14m   10.240.0.38   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   coredns-autoscaler-7ffb46d56f-t5zqk   1/1     Running   0          15m   10.240.0.44   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   csi-azuredisk-node-545m8              3/3     Running   0          14m   10.240.0.4    aks-pool0-23829552-vmss000000   <none>           <none>
kube-system   csi-azuredisk-node-6s6wj              3/3     Running   0          14m   10.240.0.33   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   csi-azurefile-node-pdjcv              3/3     Running   0          14m   10.240.0.4    aks-pool0-23829552-vmss000000   <none>           <none>
kube-system   csi-azurefile-node-wdzpp              3/3     Running   0          14m   10.240.0.33   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   konnectivity-agent-67597fcb-hl4x8     1/1     Running   0          14m   10.240.0.37   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   konnectivity-agent-67597fcb-m7t6h     1/1     Running   0          14m   10.240.0.36   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   kube-proxy-vbhvh                      1/1     Running   0          14m   10.240.0.33   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   kube-proxy-z5jc7                      1/1     Running   0          14m   10.240.0.4    aks-pool0-23829552-vmss000000   <none>           <none>
kube-system   metrics-server-59996b9895-8cvdl       2/2     Running   0          14m   10.240.0.53   aks-pool1-23829552-vmss000000   <none>           <none>
kube-system   metrics-server-59996b9895-x7lh4       2/2     Running   0          14m   10.240.0.34   aks-pool1-23829552-vmss000000   <none>           <none>

Azure Service Operatorとの比較

前回の記事にも書きましたが、Cluster APIを使わずともAzure Service Operator(以降ASO)でもAKS on AKSは実現可能です。
また設定可能項目もほぼ差異はありません。前回の記事に記載の通り、ASOの方がAKSの更新に素早く追従しているため、新機能を試したいなどの要望があれば優位でしょう。
ただ、現在ASOとCluster API Provider Azureとの統合も進んできています。
近い将来Cluster API Provider AzureにPluginとして実装されるかもしれませんね。
楽しみにウォッチしていきたいと思います。

github.com

github.com

さいごに

いかがでしたでしょうか?
前回と引き続き、Cluster APIでのK8sの払い出しをしてみました。
宣言的にクラスタの管理ができることを考えると非常に便利なツールだと思います。
次回からはProviderの実装をしてみたいと思いますので、お楽しみに!

ACS事業部のご紹介

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
www.ap-com.co.jp また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp

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