目的
IBMCloudにてIKSクラスタへオブジェクトストレージを接続するには、サービスの注文から
セキュリティ設定、オブジェクトストレージ接続のプラグイン導入の設定が必要となる。
これらの操作について、スクリーンショットやCLIコマンドの交えて解説する
全体の流れ
1.IKSクラスタの作成(この部分は対象外とする)
Part1の内容に関しては、こちらの記事で説明
2.IBM Cloud Object Storage のセットアップ:Part1
Part2の内容に関しては、こちらの記事で説明
3.IBM Cloud Object Storage プラグインのインストール:Part2
今回の記事は「4. アプリへのオブジェクト・ストレージの追加」の内容を記載
4.アプリへのオブジェクト・ストレージの追加: Part3
アプリへのオブジェクト・ストレージの追加
①PVCの定義yamlファイルを作成する
annotationsの詳細についてdocsに記載があるので必要に応じて記載する
secret-nameについては、Part1のこちらの手順で作成した名前とすること
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) -> 許可を選択
ソース:Cloud Object Storage
ターゲット:Key Protect
役割:リーダー
その他は、環境に応じてリソースグループ単位であったり、リソース単体でで制御する
サーバへのマウント
⑤PV をデプロイメントにマウント
VolumeMounts
volumeMountsセクションは、ボリュームをコンテナ内の特定のパスにマウントする方法を定義する
volumes
volumesセクションは、どのようなタイプのボリュームを使うか(PersistentVolumeClaim、ConfigMap、Secretなど)と、そのボリュームに対する詳細設定を定義する
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#