2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Azure Kubernetes Service (AKS) で PersistentVolumeClaimResize による Persistent Volume (Azure Disk) の拡張

Last updated at Posted at 2019-01-27

やりたいこと

Kubernetes では PersistentVolumeClaimResize を用いることで PersistentVolumeClaim (PVC) の拡張が可能ですが、Azure 公式ドキュメントに現段階で手順の記載がないため検証を行います。

注意点

英語ですが、当機能について GitHub で Issue が作成されています。Azure Disk ではマウントされている状態でディスクの拡張は出来ません。そのため、2019 年 1 月時点では Pod の削除を行ってから PVC の拡張を行い、再作成する、という手順になります。

また、Azure Disk は 2019 年 1 月時点で拡張はできるものの縮小はできません。

手順

  1. yaml ファイルの準備
  2. PersistentVolumeClaimResize を有効にした Storage Class を作成する
  3. PVC を作成する
  4. PVC を使用した Pod を作成する
  5. Pod にマウントされている PV のサイズを確認する
  6. Pod を削除する
  7. PVC を編集する
  8. Pod を再作成する
  9. Pod にマウントされている PV のサイズを確認する

コマンド

1. yamlファイルの準備

以下の 3 ファイルを使用します。

sample-storageclass-resize-azure.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sample-storageclass-resize-azure
parameters:
  kind: Managed
  storageaccounttype: Premium_LRS
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Delete
allowVolumeExpansion: true
sample-pvc-resize-azure.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: sample-pvc-resize-azure
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8G
  storageClassName: sample-storageclass-resize-azure
sample-pvc-resize-pod-azure.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pvc-resize-pod-azure
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      ports:
        - containerPort: 80
          name: "http"
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: nginx-pvc
  volumes:
    - name: nginx-pvc
      persistentVolumeClaim:
       claimName: sample-pvc-resize-azure

2. PersistentVolumeClaimResize を有効にした Storage Class を作成する

Azure Kubernetes Service では以下のように記載することで Azure Managed Disk (管理ディスク) の Premium Storage を使用できます。 その他の指定の仕方はStorage Class の公式リファレンス をご参照ください。

sample-storageclass-resize-azure.yamlの抜粋
parameters:
  kind: Managed
  storageaccounttype: Premium_LRS
provisioner: kubernetes.io/azure-disk

最終行を以下のようにして頂くことで Volume Expansion (ボリュームの拡張) が可能になります。拡張させたくない場合は false にします。

sample-storageclass-resize-azure.yamlの抜粋
allowVolumeExpansion: true

Storage Class の作成を前述の yaml ファイルから行います。

kubectl apply -f sample-storageclass-resize-azure.yaml

3. PVC を作成する

PVC の yaml では storageClassName パラメータで用いる Storage Class を指定します。先ほど作成した Storage Class を指定しましょう。

sample-pvc-resize-azure.yamlから抜粋
  storageClassName: sample-storageclass-resize-azure

PVC の作成を前述の yaml ファイルから行います。

kubectl apply -f ./sample-pvc-resize-azure.yaml

4. PVC を使用した Pod を作成する

Pod の yaml では ClaimName で使用する PVC を指定します。先ほど作成した PVC を指定しましょう。

sample-pvc-resize-pod-azure.yamlから抜粋
      persistentVolumeClaim:
       claimName: sample-pvc-resize-azure

Pod の作成を前述の yaml ファイルから行います。

kubectl apply -f ./sample-pvc-resize-pod-azure.yaml

5. Pod にマウントされている PV のサイズを確認する

きちんと PVC で指定したサイズで作成されていることが確認できます。

# kubectl exec -it sample-pvc-resize-pod-azure -- df -h |grep nginx
/dev/sdc        7.8G   18M  7.8G   1% /usr/share/nginx/html

6. Pod を削除する

Azure での PVC の拡張には PVC をどこからもマウントされていない状態にしなくてはなりません。

# kubectl describe pvc sample-pvc-resize-azure |grep Mount
Mounted By:  sample-pvc-resize-pod-azure

そのため、一度 Pod を削除します。 PVC がどこからもマウントされていないことが確認できるかと思います。

# kubectl delete -f ./sample-pvc-resize-pod-azure.yaml
pod "sample-pvc-resize-pod-azure" deleted
# kubectl describe pvc sample-pvc-resize-azure |grep Mount
Mounted By:  <none>

7. PVC を編集する

以下のように PVC のサイズを変更します。

# kubectl patch pvc sample-pvc-resize-azure --patch '{"spec": {"resources": {"requests": {"storage": "16G"}}}}'
persistentvolumeclaim/sample-pvc-resize-azure patched

検証環境では PVC への反映には若干時間がかかったのですが、実体として PV のサイズはすぐに拡張が確認できました。CAPACITY が15 Gi になっているのがわかります。16G ではないのは 1G=1000M で 1Gi=1024Mi による差異だと思います。

# kubectl get pvc sample-pvc-resize-azure
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                       AGE
sample-pvc-resize-azure   Bound    pvc-292e15a1-220f-11e9-8174-ee11fdbb22d1   8Gi        RWO            sample-storageclass-resize-azure   6m
# kubectl get pv pvc-292e15a1-220f-11e9-8174-ee11fdbb22d1
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                             STORAGECLASS                       REASON   AGE
pvc-292e15a1-220f-11e9-8174-ee11fdbb22d1   15Gi       RWO            Delete           Bound    default/sample-pvc-resize-azure   sample-storageclass-resize-azure            6m

8. Pod を再作成する

Pod を再作成します。PVC を使用しているのがわかります。

# kubectl apply -f sample-pvc-resize-pod-azure.yaml
pod/sample-pvc-resize-pod-azure created
# kubectl describe pvc sample-pvc-resize-azure | grep Mount
Mounted By:  sample-pvc-resize-pod-azure

9. Pod にマウントされている PV のサイズを確認する

きちんと拡張できているのがわかります。PVC を見ても拡張されています。

# kubectl exec -it sample-pvc-resize-pod-azure -- df -h |grep nginx
/dev/sdc         15G   20M   15G   1% /usr/share/nginx/html
# kubectl get pvc sample-pvc-resize-azure
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                       AGE
sample-pvc-resize-azure   Bound    pvc-292e15a1-220f-11e9-8174-ee11fdbb22d1   15Gi       RWO            sample-storageclass-resize-azure   15m

エラー時のメッセージ

Pod を削除しないで PVC のサイズを変更しようとすると、以下のように PVC でエラーメッセージが確認できます。

# kubectl describe pvc sample-pvc-resize-azure
###############################################
### 中略
###############################################
Events:
  Type       Reason                 Age                From                         Message
  ----       ------                 ----               ----                         -------
  Normal     ProvisioningSucceeded  5m32s              persistentvolume-controller  Successfully provisioned volume pvc-b02dceae-2205-11e9-8174-ee11fdbb22d1 using kubernetes.io/azure-disk
  Warning    VolumeResizeFailed     36s (x2 over 90s)  volume_expand                Error expanding volume "default/sample-pvc-resize" of plugin kubernetes.io/azure-disk : compute.DisksClient#CreateOrUpdate: Failure sending request: StatusCode=409 -- Original Error: failed request: autorest/azure: Service returned an error. Status=<nil> Code="OperationNotAllowed" Message="Cannot resize disk kubernetes-dynamic-pvc-b02dceae-2205-11e9-8174-ee11fdbb22d1 while it is attached to running VM /subscriptions/xxxxxxxxxxx/resourceGroups/MC_aks-rg_testaks_japaneast/providers/Microsoft.Compute/virtualMachines/aks-agentpool-18627786-1."

参考

※ 使用しているyamlファイルのほとんどは 「Kubernetes 完全ガイド (青山 真也)」で使用されている GitHub リポジトリ を参考にさせて頂いております。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?