IBMCloud IKS(Kubernetes)へのObject Storageの接続 Part3

## 目的
IBMCloudにてIKSクラスタへオブジェクトストレージを接続するには、サービスの注文から
セキュリティ設定、オブジェクトストレージ接続のプラグイン導入の設定が必要となる。
これらの操作について、スクリーンショットやCLIコマンドの交えて解説する

## 全体の流れ

1.IKSクラスタの作成（この部分は対象外とする）

[Part1の内容に関しては、こちらの記事で説明](https://qiita.com/khoshina/items/9ab45912b0433ca02d25)
2.[IBM Cloud Object Storage のセットアップ](https://cloud.ibm.com/docs/containerstopic=containers-storage-cos-understand)：Part1

[Part2の内容に関しては、こちらの記事で説明](https://qiita.com/khoshina/items/bb3ec07524df562834ed)
3.[IBM Cloud Object Storage プラグインのインストール](https://cloud.ibm.com/docs/containers?topic=containers-storage_cos_install)：Part2

<font color="red">**今回の記事は「4. アプリへのオブジェクト・ストレージの追加」の内容を記載**</font>
4.[アプリへのオブジェクト・ストレージの追加](https://cloud.ibm.com/docs/containers?topic=containers-storage_cos_apps): Part3

## アプリへのオブジェクト・ストレージの追加
### ①PVCの定義yamlファイルを作成する
:::note info
annotationsの詳細について[docsに記載がある](https://cloud.ibm.com/docs/containers?topic=containers-storage_cos_apps#create-cos-deployment-steps)ので必要に応じて記載する
:::


**secret-name**については、[Part1のこちらの手順](https://qiita.com/khoshina/items/9ab45912b0433ca02d25#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%B3%87%E6%A0%BC%E6%83%85%E5%A0%B1%E3%82%92%E4%BF%9D%E7%AE%A1%E3%81%99%E3%82%8B-kubernetes-%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90)で作成した名前とすること

```yaml:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: icos-pvc
  namespace: sample
  annotations:
    ibm.io/auto-create-bucket: "true"
    ibm.io/auto-delete-bucket: "true"
    ibm.io/quota-limit: "false"
    ibm.io/secret-name: "cos-write-access"
    ibm.io/secret-namespace: "xxxxx"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi 
  storageClassName: ibmc-s3fs-standard-regional 
```

### ②PVCの作成
```
kubectl apply -f pvc.yaml -n xxxxx
```

### ③PVCのバインド確認
問題なく作成された場合、status->Boundとなる
```
% kubectl get pvc -n xxxxx
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
icos-pvc   Bound    pvc-32ccca74-8c41-4afe-841f-xxxxx   10Gi       RWO            ibmc-s3fs-standard-regional   9m26s
```
### ICOS ~ Key Protecy間の権限不足のエラーの対処
pvc作成時に、権限が不足している場合、下記の様なエラーとなる
ICOSからKeyProtectへの参照権限がない状況
```
kubectl describe pvc -n xxxxx

略
  Type     Reason              Age    From                                                                                                   Message
  ----     ------              ----   ----                                                                                                   -------
  Warning  ProvisioningFailed  2m57s  ibm.io/ibmc-s3fs_ibmcloud-object-storage-plugin-5565fbd668-5zbs4_40fbfcc8-ac04-4a7a-8562-0d595c8b0e7a  failed to provision volume with StorageClass "ibmc-s3fs-standard-regional": icos-pvc:co9j451t0t7uths6kb10 :cannot create bucket tmp-s3fs-10202b8f-6b27-47c3-b3ba-483ae5944d2e: ServiceNotAuthorized: The specified COS Service Instance does not have sufficient permissions to access the resource associated with the KMS key CRN.
```

以下手順にて権限を付与する必要がある
IBMCloudポータル -> **管理** -> **アクセス(IAM)** -> **許可**を選択
![Pasted_Image_2024_04_16__15_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/bbd00da8-6512-4dea-cc96-f2bbb9ba2d32.png)

**作成**を選択
![Pasted_Image_2024_04_16__15_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/fc5af72c-74d3-ad3c-cfab-4976dfd01b4e.png)

ソース：Cloud Object Storage
ターゲット：Key Protect
役割：リーダー
その他は、環境に応じてリソースグループ単位であったり、リソース単体でで制御する

![Pasted_Image_2024_04_16__15_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c61787ff-f672-4ebe-8cba-2771624591fa.png)

作成後の画面
![Pasted_Image_2024_04_16__15_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/ecd63025-3343-6c44-68b5-a868f7713e87.png)

## サーバへのマウント
### ⑤PV をデプロイメントにマウント


**VolumeMounts**
volumeMountsセクションは、ボリュームをコンテナ内の特定のパスにマウントする方法を定義する

**volumes**
volumesセクションは、どのようなタイプのボリュームを使うか（PersistentVolumeClaim、ConfigMap、Secretなど）と、そのボリュームに対する詳細設定を定義する

YAMLファイルの例
```yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: icos-nginx 
  namespace: xxxx
  labels:
    app: icos-nginx
spec:
  selector:
    matchLabels:
      app: service1
  template:
    metadata:
      labels:
        app: service1
    spec:
      containers:
      - image: jp.icr.io/xxx/nginx:latest
        name: iks-enginx-icos
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: volume
          mountPath: /data
      volumes:
      - name: volume
        persistentVolumeClaim:
          claimName: icos-pvc
      imagePullSecrets:
        - name: myregistrykey
```

***persistentVolumeClaim***は作成したPVCの名前を指定する
```
% ku get pvc -n xxxxx
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
icos-pvc    Bound    pvc-32ccca74-8c41-4afe-841f-xxxxx   10Gi       RWO            ibmc-s3fs-standard-regional   6d17h
```

### 動作確認

実行中の Kubernetes ポッド内のコンテナで特定のコマンドを実行するためkubectl execコマンドを使用する。このコマンドは、ポッド内のコンテナに対してリモートでコマンドを実行する。

**-i**: このフラグはポッドの標準入力をオープンに保ち、ユーザがコンテナ内で対話式コマンドを実行する
**-t** (--tty): このフラグは疑似ターミナル（TTY）にてユーザーは通常のターミナルセッションと同様の対話型セッションを開く
**bash**: 実行するコマンドで、ここでは Bash シェルを開始します。これにより、ユーザーはコンテナ内で Bash セッションを開始し、様々なコマンドを対話的に実行できるようになる。

```
% ku get pod -n khoshina
NAME                          READY   STATUS    RESTARTS   AGE
icos-nginx-647c8b5f4b-445jh   1/1     Running   0          11m

% kubectl exec icos-nginx-647c8b5f4b-445jh -it bash -n xxxxx
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
```

ディスクスペースの使用状況を確認
Filesystemがs3fsとして/dataがマウントされていることがわかる
```
root@icos-nginx-647c8b5f4b-445jh:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          98G  6.5G   87G   7% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
s3fs            4.0G     0  4.0G   0% /data
/dev/vda2        98G  6.5G   87G   7% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           2.7G   16K  2.7G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /proc/scsi
tmpfs           1.9G     0  1.9G   0% /sys/firmware
```

/dataにアクセスし、aaaaテキストをtext.txtに書き込む
```
root@icos-nginx-647c8b5f4b-445jh:/# cd /data
root@icos-nginx-647c8b5f4b-445jh:/data# ls
dev  etc  var
root@icos-nginx-647c8b5f4b-445jh:/data# echo aaaa > test.txt
```

書き込んだファイルの中身が見えることを確認
```
root@icos-nginx-647c8b5f4b-445jh:/data# cat test.txt 
aaaa
root@icos-nginx-647c8b5f4b-445jh:/data# 
```