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

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

## 全体の流れ

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

<font color="red">**今回の記事は「2. [IBM Cloud Object Storage のセットアップ]」の内容を記載**</font>
2.[IBM Cloud Object Storage のセットアップ](https://cloud.ibm.com/docs/containers?topic=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

[Part3の内容に関しては、こちらの記事で説明](https://qiita.com/khoshina/items/5eada94a670cf8fac86f)
4.[アプリへのオブジェクト・ストレージの追加](https://cloud.ibm.com/docs/containers?topic=containers-storage_cos_apps): Part3

## IBM Cloud Object Storage のセットアップ
:::note info
基本的にIBMCloudドキュメントを参照して進めれば問題ない
一部説明が不足している箇所があるので補足しつつ進める
:::

### オブジェクト・ストレージ・サービス・インスタンスの作成
IBMCloud WebConsoleの検索メニューより「Object」で検索し、製品ページに遷移する
直接ページに飛ぶには[IBM Cloud Object Storage カタログ・ページ](https://cloud.ibm.com/objectstorage/create)を開く
![Pasted_Image_2024_04_12__13_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c852052a-c23f-9e7f-ab51-f16f184c7d31.png)

インフラストラクチャーの選択：IBMCloud内のリソースであるIKSから利用するため、**IBM Cloudを選択**
プラン：利用用途に応じてプランを選択する。今回はテストのため、**Freeを選択**
サービス名：任意の名前
リソースグループ：どのVPCリソースグループに作成するか選択
タグ：任意で設定

最後に**作成**を選択し、ICOSの注文を完了する

![Pasted_Image_2024_04_12__13_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3e0f7055-de0b-5783-ae05-8dea18675db1.png)

ICOSの注文が正常に完了すると、作成したインスタンス名のページに遷移する
![Pasted_Image_2024_04_12__13_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/76520960-c922-5fec-b1c7-3b11c5554abe.png)

### IBM Cloud Object Storage のサービス資格情報の作成
IBM Cloud Object Storage のサービス資格情報の作成とは、IBM Cloud 上の Object Storage サービスへのアクセスを許可するために必要な認証情報を生成するプロセスで、APIやアプリケーションがセキュアにストレージサービスにアクセスするために使用される。

* インスタンスのページより、**「サービス資格情報」**を選択し、続けて**「新規資格情報」**を選択
![Pasted_Image_2024_04_12__13_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/485ae8c4-6b66-1a7a-aa57-43a6cdfc24cb.png)

資格情報の作成ページ
名前：**任意の名前**
ロール：書き込みを許可するため、**ライター**とする
アクセス権の詳細は、下記ページを参照
[Identity and Access Management の役割](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-iam#iam-roles)

最後に**追加**を選択し、完了する
![Pasted_Image_2024_04_16__11_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e423b9a6-e673-23ae-c061-a6916748c6a3.png)


#### apikeyの確認
問題なく作成されると、サービス資格情報一覧に鍵が見えてくるので、apikeyをメモしておく
![Pasted_Image_2024_04_12__13_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/4779534f-3e53-03ce-4b73-c76ea6bc2d34.png)

画像上だと**bw~~~~~~~~~~~~~~~~~~~~~~~~~~M**の部分

### オブジェクト・ストレージ・サービス資格情報用のシークレットの作成
オブジェクトストレージサービス資格情報用のシークレットの作成とは、IKS環境で使用するために、サービス資格情報を安全に保存し、管理するもの。このシークレットには、アクセスキーやシークレットキーなど、オブジェクトストレージサービスにアクセスするために必要な機密情報が含まれる。

#### IBM Cloud Object Storage サービス・インスタンスの GUID を取得
service_nameは先ほど作成したICOSの名前を""で囲って記載する
```
コマンド
ibmcloud resource service-instance <service_name> | grep GUID

実際のコマンド結果
% ibmcloud resource service-instance "Cloud Object Storage-cg" | grep GUID
GUID:                  2e09a007-xxxx-xxxx-xxxx-xxxxxxxxxx
```

アカウント内リソース一覧を確認するには以下のコマンドで確認できる
```
% ibmcloud resource service-instances
OK
Name                                                                                                    Location   State    Type               Resource Group ID
Cloud Object Storage-acs-paas                                                                           global     active   service_instance   d72766061fce4e839ce2bdd1247e621c
Cloud Object Storage-cg                                                                                 global     active   service_instance   d72766061fce4e839ce2bdd1247e621c
```

#### サービス資格情報を保管する Kubernetes シークレットを作成
Kubernetesのシークレットは、パスワード、OAuthトークン、SSHキーなどの機密情報を保存するためのリソースで、これらの情報はプレーンテキストでPodの設定ファイルやソースコードに含めるのではなく、シークレットに安全に格納しておくことが推奨される

IKSクラスタにログインしておく
```
ibmcloud ks cluster config --cluster <ClusterID>
```

API キーを使用する 例
入力するapikeyは[ここで確認した](https://qiita.com/khoshina/items/9ab45912b0433ca02d25#apikey%E3%81%AE%E7%A2%BA%E8%AA%8D)値
```
コマンド
kubectl create secret generic cos-write-access --type=ibm/ibmc-s3fs --from-literal=api-key=<api_key> --from-literal=service-instance-id=<service_instance_guid> -n <名前空間>

実際のコマンド結果
kubectl create secret generic cos-write-access --type=ibm/ibmc-s3fs --from-literal=api-key=bwxxxxxxxxxxxxxxxxxxxM --from-literal=service-instance-id=2e09a007-xxxx-xxxx-xxxx-xxxxxxxxxx -n xxxxx
secret/cos-write-access created
```

### Key Protect IBM Cloud Object Storage s3fs プラグインを使用して作成されたバケットの暗号化の準備

<font color="red">**暗号化しない場合は、こちらの手順は不要**</font>

バケットの暗号化をすることで、保存されるデータが安全に暗号化されることが保証されるため実施しておく

#### KeyProtectインスタンスの作成

IBMCloud WebConsoleの検索メニューより「Key Protect」で検索し、製品ページに遷移する
直接ページに飛ぶには[IBM Cloud Key Protect カタログ・ページ](https://cloud.ibm.com/catalog/services/key-protect)を開く
![Pasted_Image_2024_04_12__14_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c6979dfc-6859-dce2-4ef7-c322ab266428.png)

インフラストラクチャーの選択：IBMCloud内のリソースであるIKSから利用するため、**IBM Cloudを選択**
プラン：プランは一つしかないので選択
サービス名：任意の名前
リソースグループ：どのVPCリソースグループに作成するか選択
タグ：任意で設定

![Screenshot_2024-04-12_at_14_53_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/0edbf275-ada4-a26a-10cb-468db4028ff1.png)

最後に**作成**を選択し、Key Protectの注文を完了する

#### ルート鍵の作成
注文完了後に、作成したKey Protectのページから**鍵** -> **追加**を選択
![Pasted_Image_2024_04_12__14_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/43f95e0a-dee3-ca2a-1ad8-02d55471f08d.png)

**ルート鍵** -> 鍵の名前（任意名） -> **鍵の追加**を選択
![Pasted_Image_2024_04_12__15_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/298c746b-cc12-1794-8e19-def2403cc968.png)

#### ルート鍵のCRNの確認

CLIによる確認
```
アカウントにあるKey Protectインスタンスの一覧を表示
% ibmcloud resource service-instances --service-name kms
OK
Name                   Location   State    Type               Resource Group ID
Key Protect-acs-paas   jp-tok     active   service_instance   d72766061fce4e839ce2bdd1247e621c

インスタンスのCRNを取得
% ibmcloud resource service-instance "Key Protect-acs-paas" --id
crn:v1:bluemix:public:kms:jp-tok:a/dbxxxxxxxxxxxxxx:xxxx699c-8xxe-4xxx-xxxx-7bxxxxxx:: 90xxxx9c-8xxe-xxx-xxx-xxxxxxx

UUIDをメモする
90xxxx9c-8xxe-xxx-xxx-xxxxxxxがUUID

ルート鍵一覧のIDを取得
% ibmcloud kp keys --instance-id "90xxxx9c-8xxe-xxx-xxx-xxxxxxx"

Targeting endpoint: https://jp-tok.kms.cloud.ibm.com
Retrieving keys...
OK
Key ID                                 Key Name
1xxa7e5d-xx1b-xx6f-9xxx-xxxxxxx07e5   iks-key

CRNを出力
% ibmcloud kp key show 1xxa7e5d-xx1b-xx6f-9xxx-xxxxxxx07e5 --instance-id "90xxxx9c-8xxe-xxx-xxx-xxxxxxx" --output json | grep crn

Targeting endpoint: https://jp-tok.kms.cloud.ibm.com
	"crn": "crn:v1:bluemix:public:kms:jp-tok:a/xxxxxxx0e468cbxxxxxxxdb82aee6fe:9xxxxxxx9c-882e-xxx0-a6bd-7ba0xxxxxxx914:key:1xxxxxxxd-1xxx-4xxx-xxxc-xxx1xxx07e5",
```

GUIによる確認
作成したルート鍵の右にあるボタンを選択
![Pasted_Image_2024_04_12__15_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/dd18af20-272b-5ccf-756e-b8f78bfde592.png)

**鍵の詳細**を選択
![Pasted_Image_2024_04_12__15_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a268069f-3621-b31b-5dd5-38f8e3eac8c0.png)

CRNが確認できる
![Pasted_Image_2024_04_12__15_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/5c20df2c-99c2-783b-06c9-6b0911fda5f6.png)

#### IBM Cloud Object Storage シークレットの YAML ファイルを作成
secret-key:前手順で作成したICOSインスタンスの資格情報で確認できるapikey
service-instance-id:前手順で確認したObject Storage サービス・インスタンスのGUID
kp-root-key-crn:前手順で作成したKey Protectルート鍵の詳細で確認できるCRN
name:前手順で作成したkubernetesシークレットの名前

<font color="red">access-key、secret-keyおよびkp-root-key-crnはbase64形式にエンコードする必要がある</font>

エンコードコマンド
```
echo -n 'エンコードしたいシークレットやCRN' | base64
```


```
apiVersion: v1
data:
    secret-key: <base64のapi-key>
    service-instance-id: <base64のservice-instance-id>
    kp-root-key-crn: <base64のCRN>
kind: Secret
metadata:
    name: cos-write-access
type: ibm/ibmc-s3fs
```

・シークレットのデプロイ
```
kubectl apply -f secret.yaml -n xxxxx
```

#### クラスター内のシークレットの確認
```
% kubectl get secret -n xxxxx
NAME                                                           TYPE                             DATA   AGE
cos-write-access                                               ibm/ibmc-s3fs                    3      3m2s
```

・kubectl create secretコマンドでやる場合（Base64形式にしないでOK）

```
% kubectl create secret generic cos-write-access --type=ibm/ibmc-s3fs --from-literal=api-key=bwxxxxxxxxxxxxxxxxxxxM --from-literal=service-instance-id=2e09a007-xxxx-xxxx-xxxx-xxxxxxxxxx --from-literal=kp-root-key-crn=crn:v1:bluemix:public:kms:jp-tok:a/xxxxxxx0e468cbxxxxxxxdb82aee6fe:9xxxxxxx9c-882e-xxx0-a6bd-7ba0xxxxxxx914:key:1xxxxxxxd-1xxx-4xxx-xxxc-xxx1xxx07e5 -n xxxxx
```

コマンドで実施した場合、下記のコマンドでyaml形式の状態を見ることができる
```
% kubectl get secret -n xxxxx -o yaml
```

```yaml:
apiVersion: v1
items:
- apiVersion: v1
  data:
    api-key: dEgxxxxx
    kp-root-key-crn: Y3JuOnYxOmJsdWVtaXgxxx==
    service-instance-id: xxxQxMGVh
  kind: Secret
  metadata:
    creationTimestamp: "2024-04-16T05:56:27Z"
    name: cos-write-access
    namespace: xxxxxx
    resourceVersion: "787308"
    uid: e3bb2d45-5884-448a-9f16-b9exxxx6f
  type: ibm/ibmc-s3fs

  略
```

<font color="red">続き</font>
[IBM Cloud Object Storage プラグインのインストール](https://qiita.com/khoshina/items/bb3ec07524df562834ed)