IBMCloud ROKS (Redhat Openshift) におけるICOS接続 -Part3-

## 概要

IBMCloud上のRedhat Openshift環境にてPV（PersistentVolume:外部ストレージ）としてICOSオブジェクトストレージを利用する方法をまとめました。

以下の３つのステップで記載します。

* IBM Cloud Object Storage のセットアップ [[Link]](https://qiita.com/naoki_fisher/items/f9aeeb23390710267c07)
* IBM Cloud Object Storage プラグインのインストール [[Link]](https://qiita.com/naoki_fisher/items/13ee88d754e8bfab90d4)
* アプリへのオブジェクト・ストレージの追加 <font color="DeepPink"><- この記事の範囲 (part3)</font>
　 [(参考) IBMCloud Docs - アプリへのオブジェクト・ストレージの追加](https://cloud.ibm.com/docs/openshift?topic=openshift-storage_cos_apps)

## 前提条件
* 事前に概要に記載している以下の２ステップが完了していること
    * IBM Cloud Object Storage のセットアップ [[Link]](https://qiita.com/naoki_fisher/items/f9aeeb23390710267c07)
    * IBM Cloud Object Storage プラグインのインストール [[Link]](https://qiita.com/naoki_fisher/items/13ee88d754e8bfab90d4)

## アプリへのオブジェクトストレージ追加手順

### 1. PVC構成ファイル準備、PVC作成

* 永続ボリューム請求 (PVC) を定義した構成ファイルを作成
    * 以下のpvc.ymlファイルを作成
    * PVC名は"nginx-pvc"とした
    * cosとの接続では"cos-write-access-test"をシークレットに指定する(part1記事で用意したSecret)
    * 容量は1GBとしています

```python
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
  namespace: default # Enter the namespace where you want to create the PVC. The PVC must be created in the same namespace where you created the Kubernetes secret for your service credentials and where you want to run your pod.
  annotations:
    ibm.io/auto-create-bucket: "true"
    ibm.io/auto-delete-bucket: "true"
    ibm.io/bucket: ""
    ibm.io/object-path: ""
    ibm.io/quota-limit: "true" # Disable or enable a quota limit for your PVC. To use this annotation you must specify the -set quotaLimit=true option during installation.
    ibm.io/endpoint: "https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints"
    ibm.io/tls-cipher-suite: "default"
    ibm.io/secret-name: "cos-write-access-test" # The name of your Kubernetes secret that you created.
    ibm.io/secret-namespace: "default" # By default, the COS plug-in searches for your secret in the same namespace where you create the PVC. If you created your secret in a namespace other than the namespace where you want to create your PVC, enter the namespace where you created your secret.
#    ibm.io/add-mount-param: "<option-1>,<option-2>" # s3fs mount options
#    ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX" # A csv of allow listed IPs.
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: ibmc-s3fs-standard-cross-region
```

* クラスター内にPVCを作成する

```python
% oc apply -f pvc.yml                              
persistentvolumeclaim/nginx-pvc created
% 
```

* PVCが作成されたことを確認

```python
% oc get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                      AGE
nginx-pvc   Bound    pvc-4df5d9e3-eee4-478b-8f27-bc5c2970c69c   1Gi        RWO            ibmc-s3fs-standard-cross-region   1d
% 
```

### 2. Deploymentファイルの準備(Nginx)
* 今回はNginxを利用したICOS接続を実施する
* 以下のDeployment Yamlファイルを準備する

```python
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: jp.icr.io/xxxx-cr/nginx:latest  ## 自身のContainerRegistryを参照してください。
        ports:
        - containerPort: 80  ## 外部向け通信ポートを80としている
        volumeMounts:
        - name: storage
          mountPath: "/usr/share/nginx/html" ## nginxのhtmlファイル参照フォルダをI
      volumes:
      - name: storage
        persistentVolumeClaim:
          claimName: nginx-pvc ##先ほどの手順で指定したPVC名を指定する
```

### 3.デプロイメントの実行

* deploy.ymlをapplyする


```python
% oc apply -f deploy.yml 
deployment.apps/nginx-deployment created
% 
```

* PVが正常にマウントされたことを確認

```python
% oc describe deployment nginx
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Sun, 16 Jun 2024 20:53:47 +0900
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        jp.icr.io/xxxx-cr/nginx:latest
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:
      /usr/share/nginx/html from storage (rw)
  Volumes:
   storage:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  nginx-pvc
    ReadOnly:   false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-7f9cd899d (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  2m1s  deployment-controller  Scaled up replica set nginx-deployment-7f9cd899d to 1

% 
```
* Descriptionから、/usr/share/nginx/htmlフォルダが無事Mountされていることが確認できます