銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure Container Service (AKS) でAzure Managed DiskをVolumeとして試してみる

Azureのマネージドなkubernetesサービス Azure Container Service (AKS) がpreviewとしてリリースされました。

azure.microsoft.com

デフォルトでkubernetes 1.7が使われるのですが、このバージョンからAzure Managed DiskがVolumeとして使えるはずなので試してみました*1

github.com

Azure PD (Managed/Blob) by khenidak · Pull Request #46360 · kubernetes/kubernetes · GitHub

AKSのセットアップ手順はこのドキュメントに従います。

docs.microsoft.com

注意事項として現時点では、ukwestとwestus2しか利用可能でないので、それ以外のlocationを指定するとエラーになります。

$ az group create --name myK8sGroup --location japaneast
$ az aks create --resource-group  myK8sGroup --name myK8sCluster --agent-count 1 --generate-ssh-keys
//中略
The provided location 'japaneast' is not available for resource type 'Microsoft.ContainerService/managedClusters'. List of available regions for the resource type is 'ukwest,westus2'.

locationが正しいのに、リソースタイプがーというエラーが出ることがあります。

$ az aks create --resource-group  myK8sGroup --name myK8sCluster --agent-count 1 --generate-ssh-keys
The subscription is not registered for the resource type 'managedClusters'. Please re-register for this provider in order to have access to this resource type.

この場合、Azure Portalで自分のsubscriptionのResource Providerを開き、Microsoft.Container*なプロバイダーをre-registerすると動きました。re-register押してもUIに変化がないのですが、AKSが作れるようにはなりました。

f:id:tanaka733:20171025171045p:plain

また、az aksコマンドは最新のAzure CLI 2.0でしか使えないのでアップデートするかCloud Shellを使いましょう。ただ、Cloud Shellで1回permissionエラーが出ましたが、2回目は出なかったので、何度か試すとよいかもしれません。

$ az --version
azure-cli (2.0.20)

$ az aks install-cli
Downloading client to /usr/local/bin/kubectl from https://storage.googleapis.com/kubernetes-release/release/v1.8.2/bin/linux/amd64/kubectl
Connection error while attempting to download client ([Errno 13] Permission denied: '/usr/local/bin/kubectl')

セットアップするとkubernetesのバージョンが1.7.7なことがわかります。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.1", GitCommit:"f38e43b221d08850172a9a4ea785a86a3ffa3b3a", GitTreeState:"clean", BuildDate:"2017-10-11T23:27:35Z", GoVersion:"go1.8
.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.7", GitCommit:"8e1552342355496b62754e61ad5f802a0f3f1fa7", GitTreeState:"clean", BuildDate:"2017-09-28T23:56:03Z", GoVersion:"go1.8
.3", Compiler:"gc", Platform:"linux/amd64"}

また仮想マシン一覧を見ると以前のものとは違って、別のリソースグループでAgentのみが自分のサブスクリプションの仮想マシンとして起動していることがわかります。また所属するリソースグループは、AKSを作成するときに指定したリソースグループとは別のものです。

さて、Managed Diskの利用ですが、ここにexampleがあるのでつかってみます。

examples/staging/volumes/azure_disk/claim/managed-disk/managed-hdd at master · kubernetes/examples · GitHub

$ wget https://raw.githubusercontent.com/kubernetes/examples/master/staging/volumes/azure_disk/claim/managed-disk/managed-hdd/storageclass-managed-hdd.yaml
$ wget https://raw.githubusercontent.com/kubernetes/examples/master/staging/volumes/azure_disk/claim/managed-disk/managed-hdd/pvc-on-managed-hdd.yaml
$ wget https://raw.githubusercontent.com/kubernetes/examples/master/staging/volumes/azure_disk/claim/managed-disk/managed-hdd/pod-uses-managed-hdd.yaml

$ kubectl create -f storageclass-managed-hdd.yaml
storageclass "managedhdd" created
$ kubectl create -f pvc-on-managed-hdd.yaml
persistentvolumeclaim "dd-managed-hdd-5g" created
$ kubectl create -f pod-uses-managed-hdd.yaml
pod "pod-uses-managed-hdd-5g" created

$ kubectl get pod -w
NAME                                READY     STATUS    RESTARTS   AGE
azure-vote-back-4149398501-59g50    1/1       Running   0          15m
azure-vote-front-1874756303-3f2rw   1/1       Running   0          15m
pod-uses-managed-hdd-5g             0/1       Pending   0          6s
pod-uses-managed-hdd-5g   0/1       Pending   0         1m
pod-uses-managed-hdd-5g   0/1       ContainerCreating   0         1m
pod-uses-managed-hdd-5g   1/1       Running   0         1m

kubernetesのagentの仮想マシンが所属するリソースグループの一覧を見ていると、まず新たにDiskが作成され、PodのStatusがContainerCreatingになったところでそのDiskが仮想マシンにマウントされたことがわかります。

f:id:tanaka733:20171025170043p:plain

つまりこのPluginで必要に応じたDiskの自動生成とマウントまでしてくれることがわかりました。ではこのPodを削除してみましょう。

$ kubectl delete pod pod-uses-managed-hdd-5g 
$ kubectl get event -w

eventでKilling container with id docker://az-c-01:Need to kill Podといったメッセージが出た直後に仮想マシンのDiskを見ると、DiskがアンマウントされUpdatingの状態になっていることがわかります。

f:id:tanaka733:20171025170553p:plain

つまり、Podが削除され不要になったらDiskのアンマウントリクエストが開始されます。というわけでAzure Managed Diskが使えるようになって便利になったkubernetes 1.7がAKSで使えるようになりました。

*1:それ以前はunmanaged diskしかサポートしていないので、kubernetesをインストールする仮想マシンをunmanagedにしないと、Azure DiskをVolumeとして使えないのでした