Support for Kubernetes volume clones in OKE

CSIボリュームプラグインでは現在、Kubernetes Volume Clone を使用して、新しい永続ボリューム( Block Volume )の提供をサポートしています。

- CSI ボリュームプラグインのアップデート: 
Kubernetes のボリューム( PersistentVolume と紐づく Block Volume )クローンをサポート
- ボリュームクローンの使用: 
Block Volume サービスによる Block Volume クローンを利用して、新しい永続ボリュームを提供
- クローンの特徴:
既存の永続 Block Volume の完全な複製を作成
ソースとなる Block Volume のデータを含む新しい永続 Block Volume を独立して提供
- 利用シナリオ:
本番環境に影響を与えずに設定変更を迅速にテスト可能
データの整合性を保ちながら新しい Block Volume への迅速なデータ移行を実現

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/23252e01-ecc2-fbae-eec2-f884488724c7.png)

# ソースとなる Block Volume 環境

50GiB のブロックボリュームをプロビジョニングして、PersistetVolume と紐づけます。

マニフェスト:csi-mysourcepvc.yaml
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-source-pvc
spec:
  storageClassName: "oci-bv"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
```

```sh
kubectl apply -f csi-mysourcepvc.yaml
```
```sh
persistentvolumeclaim/my-source-pvc created
```

作成した PersistentVolumeClaim を要求して、Nginx のボリュームマウント先とするサンプル Pod をデプロイします。

マニフェスト:my-source-pod.yaml
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: source-pod
spec:
  containers:
    - name: source-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: my-source-pvc
```

```sh
kubectl apply -f my-source-pod.yaml
```
```sh
persistentvolumeclaim/my-source-pvc created
```
```sh
pod/source-pod created
```

Pod, PersistentVolumeClaim, PersistentVolume が Bound 状態にあることを確認します。

```sh
kubectl get pv,pvc,pod
```
```sh
NAME                                  READY   STATUS    RESTARTS   AGE
pod/source-pod                        1/1     Running   0          74s

NAME                                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/my-source-pvc   Bound    csi-7de707b5-f2cd-4b39-b608-418146cd3694   50Gi       RWO            oci-bv         97s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
persistentvolume/csi-7de707b5-f2cd-4b39-b608-418146cd3694   50Gi       RWO            Delete           Bound    default/my-source-pvc   oci-bv                  58s
```

# クローンとして作成された Block Volume 環境

Ngix Pod のコンテナ内（/usr/share/nginx/html/）にテストファイル（hello.txt）を作成します。クローンされて、新たな Block Volume でもこのテストファイルがあることになります。

```sh
kubectl exec -it source-pod -- sh -c 'echo "Hello World!" > /usr/share/nginx/html/hello.txt'
```

テストファイルが作成されたことを確認します。

```sh
kubectl exec -it source-pod -- sh -c 'cat /usr/share/nginx/html/hello.txt'
```
```sh
Hello World!
```

同じ形式で新たに Nginx Pod, PersistentVolume, PersistentVolumeClaim をデプロイします。

dataSource で my-source-pvc を指定します。

マニフェスト:csi-myclonepvc.yaml
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-clone-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "oci-bv"
  resources:
    requests:
      storage: 50Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: my-source-pvc
```

新たに作成した PersistentVolumeClaim を要求して、Nginx のボリュームマウント先とするサンプル Pod をデプロイします。

マニフェスト:my-clone-pod.yaml
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: clone-pod
spec:
  containers:
    - name: clone-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: my-clone-pvc
```

```sh
kubectl apply -f csi-myclonepvc.yaml
```
```sh
persistentvolumeclaim/my-clone-pvc created
```

```sh
kubectl apply -f my-clone-pod.yaml
```
```sh
pod/clone-pod created
```

新たに作成した Pod, PersistentVolumeClaim, PersistentVolume が Bound 状態にあることを確認します。(pod/clone-pod, persistentvolumeclaim/my-clone-pvc, persistentvolume/csi-b44b918a-0877-4544-b1ad-44cb9f403622)

```sh
kubectl get pv,pvc,pod
```
```sh
NAME                                  READY   STATUS    RESTARTS   AGE
pod/clone-pod                         1/1     Running   0          3m38s
pod/source-pod                        1/1     Running   0          14m

NAME                                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/my-clone-pvc    Bound    csi-b44b918a-0877-4544-b1ad-44cb9f403622   50Gi       RWO            oci-bv         4m9s
persistentvolumeclaim/my-source-pvc   Bound    csi-7de707b5-f2cd-4b39-b608-418146cd3694   50Gi       RWO            oci-bv         15m

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
persistentvolume/csi-7de707b5-f2cd-4b39-b608-418146cd3694   50Gi       RWO            Delete           Bound    default/my-source-pvc   oci-bv                  14m
persistentvolume/csi-b44b918a-0877-4544-b1ad-44cb9f403622   50Gi       RWO            Delete           Bound    default/my-clone-pvc    oci-bv                  3m27s
```

テストファイル(hello.txt)があることを確認します。

```sh
kubectl exec -it clone-pod -- sh -c 'cat /usr/share/nginx/html/hello.txt'
```
```sh
Hello World!
```

以上です。

[Official Documents](https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim_topic-Provisioning_PVCs_on_BV.htm#contengcreatingpersistentvolumeclaim_topic-Provisioning_PVCs_on_BV-PV_From_Clone_CSI
)