LoginSignup
10
8

More than 3 years have passed since last update.

OCS(OpenShift Container Storage)をインターナルモードで作成する

Last updated at Posted at 2020-11-01

1. はじめに

既存の OpenShift Cluster の中に3本のWorkerノードを使ったOCS(OpenShift Container Storage)Clusterを作成してみます。
image.png

OCSのデータ領域は、各Storage Nodeに追加した内蔵ディスクを使用する事にします。

この手順は、OCS(OpenShift Container Storage) 4.5 を元に作成しています。また、公式ドキュメントの ベアメタルインフラストラクチャーを使用した OPENSHIFT CONTAINER STORAGE のデプロイを参考にしました。

この手順で使用したOCSのバージョンは、4.5です。

2. OCSノードのサイジング

OCSのデプロイ方法は、インターナルエクスターナルがありますが、ここではインターナルモードを使用します。
インターナルエクスターナルの違いは、既存のOpenShiftクラスターの内部にOCSがあるか外部に独立したクラスターとして存在するかの差です。

インターナルモードでは、OCSのストレージを持ったノードも、既存OpenShiftクラスター内のWorkerノードとして存在しています。
コンピュートもストレージも、OpenShift単一クラスター内のリソースとして扱う事ができ、シンプルな構成になります。

使用する ノードOSは、Red Hat CoreOSを使用します。

OCSには、最小要件として以下の要件があります。

  • 30vCPU(10vCPUx3)
  • 72GB(24GB x 3) Memory
  • 3(1 x 3) storage device

※ここでの vCPUは、Intel HyperThreading ON 時の仮想コアを示しています。

ですが、このリソースで実際に構成してみると、メモリが足りず、一部のPodが起動しない現象が見て取れたので(細かく確認してませんが、他のPodOCS用のノードに乱入してきたせいかもしれません) 、もう少し増やして、以下の構成にしました。

  • 48vCPU(16vCPUx3)
  • 96GB(32GB x 3) Memory
  • 3(1 x 3) storage device

さらに言うと、インストールの途中のUser Interfaceで、16CPU 64GB以上のノードを3本用意するように言ってくる部分があります。
が今回は、そこまで富豪な構成は用意できなかったので、メモリに関しては64GB32GBとしています。

各、ノードに、OSを導入するストレージ領域に追加して、データー領域として1TBの容量を追加しました。
ノード構成は以下の通りです。

サーバー vCPU(HT-on) Memory OS Disk 追加Disk OS ホスト名 IP Address
OCSノード 1 16vCPU 32GByte 60G 1024G CoreOS s1.ocp45.example.localdomain 172.16.0.51
OCSノード 2 16vCPU 32GByte 60G 1024G CoreOS s2.ocp45.example.localdomain 172.16.0.52
OCSノード 3 16vCPU 32GByte 60G 1024G CoreOS s3.ocp45.example.localdomain 172.16.0.53

Workerノード に、OCSの必要なコンテナを導入したノードをOCSノードと呼ぶ事にします。
この3本のOCSノードOCSとして分散ストレージを形成します。

OCSでは、最低3本の Workerノードが基本単位として必要になります。ストレージの容量を追加する場合も3本づつWorkerノードを追加していきます。

3. OCSノードのインストール

それでは、OCSノードを作成して行きます。

3.1. VMware を OCSノードに使用する場合の注意点

この手順では、ノードに追加した内蔵ディスクをOCSのデータ領域として構成します。

VMware の仮想マシンを OCSノード に使用する場合「仮想マシンオプション」で、disk.EnableUUIDtrue にしないと、構成に必要なディスクの by-idが表示されない場合があるようです。

image.png

3.2.Workerノードの作成

通常の Workerノード と同様に以下の手順になります。

1.ホスト名とIPアドレスの決定
2.DHCPサーバーに、MACアドレスに結びつけて固定IPを配れるように設定
3.DNSサーバーにOCSノードとして使用するWoker Nodeのホスト名を登録(逆引きも)
4.CoreOSをインストール開始。WorkerノードInginiton fileを使って Workerノードとして構成
5.Woker NodeCSRapprove

Core OSのインストール方法については、ISOイメージからインストールする方法と、iPXE等を使ったネットワークインストールする方法があります。いずれのケースでOpenShiftWoker Nodeとして構成する必要があります。

通常OCSインターナルモードで導入する場合は、既にOpenShiftクラスターが存在しており、Workerノードの導入手順は確立していると思いますので、ここでは、CoreOSをインストール・構成してWoker Nodeとして OpenShiftクラスターに追加する方法については省略します。

3.3.OCSインストール対象Nodeのラベリング

Workerノードが完成したら、完成した 3つの Workerノードに以下のコマンドで、ラベルをつけOCSノード化をして行きます。
インストール時に、このラベルがある所に、必要なPodがスケジュールされるようになっています。

oc label nodes <NodeNames> cluster.ocs.openshift.io/openshift-storage=''

この手順では、以下のようにコマンドを実行してラベルをつけます。

oc label nodes s1.ocp45.example.localdomain cluster.ocs.openshift.io/openshift-storage=''
oc label nodes s2.ocp45.example.localdomain cluster.ocs.openshift.io/openshift-storage=''
oc label nodes s3.ocp45.example.localdomain cluster.ocs.openshift.io/openshift-storage=''

ラベルが付いている事を確認します。

# oc get nodes -l cluster.ocs.openshift.io/openshift-storage -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}'
s1.ocp45.example.localdomain
s2.ocp45.example.localdomain
s3.ocp45.example.localdomain
# 

以上で、OCSをインストールするOCSノードの準備ができました。

4. OCS Operator のインストール

OperatorHubからOpenShift Container Storageを検索してクリックします。

image.png

Installをクリックします。
image.png

Install Operatorで必要な項目を入力します。
image.png
Enable operator recommended cluster monitoring on this namespace だけは、デフォルトでチェックが入ってないはずなので、チェックします。それ以外はデフォルトのままで大丈夫なはずですが、

Update Channel は、stable-4.5
Installation Mode は、A specific namespace on the cluster
Installed Namespace は、openshift-storage
Approval Strategy は、Automatic (※)

である事を確認します。

※この例ではApproval Strategy は、Automaticを選択しましたが、アップデート時はOCSクラスターが非常に不安定になります。実際の運用を考えるとこの部分は、個人的にはManualにしておき、意図せぬアップデートが起こらないようにしておくのが良いと思います。

確認したらIsntallをクリックします。

Installed Operatorsに自動で画面が遷移するはずです。

image.png

環境にも依存しますがOpenShift Container StorageSuccceededになるまで数分かかるはずです。

5.Local Storage Operator のインストール

続いてLocal Storage Operatorを導入します。

5.1. namespace の作成

OPERATORのインストール前の準備としてlocal-storageというnamespaceを作成します。
Administration->Namespaces に移動して、Create Namespaceをクリックします。

image.png

新しく作成する Namespace名として local-storageと入力します。Default Network Policyは、デフォルトでNo restrictionsが選択されていればOKです。
image.png

OperatorHubから、Local Storageを検索します。
image.png

Installをクリックします。
image.png

Install Operatorという画面に遷移します。
image.png

Installed Namespaceで、先ほど作成したlcoal-storageというNamespaceが選択されているのを確認します。

それ以外は、基本的にデフォルトで設定されているはずですが、

Update Channelが、4.5
Installation Modeが、A specific namespace on the cluster
Approval Stragegyが、Automatic (※)

である事を確認します。大丈夫であれば、Installをクリックします。

※この例ではApproval Strategy は、Automaticを選択しましたが、アップデート時はOCSクラスターが非常に不安定になります。実際の運用を考えるとこの部分は、個人的にはManualにしておき、意図せぬアップデートが起こらないようにしておくのが良いと思います。

Operators->Installed Operatorsに自動で画面が遷移するはずです。

image.png

Local Storageが、Succeededになれば完了です。すぐにSucceededになるはずです。

5.2. LocalVoume の作成

5.2.1. 利用可能なデバイスの検索

OCSノードから、データ領域に使用するデバイスの情報を集めて行きます。

まず、s1.ocp45.example.localdomain に対して、oc debug node/<OCSノード名>でログインして情報を集めます。

# oc debug node/s1.ocp45.example.localdomain
Starting pod/s1ocp45examplelocaldomain-debug ...
To use host binaries, run `chroot /host`
Pod IP: 172.16.0.51
If you don't see a command prompt, try pressing enter.
sh-4.2# chroot /host                               <== 入力
sh-4.4# lsblk                                  <== 入力
NAME                         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   60G  0 disk
|-sda1                         8:1    0  384M  0 part /boot
|-sda2                         8:2    0  127M  0 part /boot/efi
|-sda3                         8:3    0    1M  0 part
`-sda4                         8:4    0 59.5G  0 part
  `-coreos-luks-root-nocrypt 253:0    0 59.5G  0 dm   /sysroot
sdb                            8:16   0    1T  0 disk
sr0                           11:0    1 1024M  0 rom

上記の例でsdbが、データ領域用に追加したdiskです。このdiskby-idを調べます。
※1) VMWareの場合は、同じデバイスに対して複数のby-idが表示される事があるようですが、以下のサンプルのフォーマットと同じものをメモして下さい
※2) 記事公開後、by-id の簡単な集め方として、kubectl logsを使用する方法を教えて頂きました!以下のKBが出ています。How to list the local disk IDs for every OCS worker in Openshift 4.x

sh-4.4# ls -l /dev/disk/by-id/ | grep sdb 
lrwxrwxrwx. 1 root root  9 Oct 22 15:47 scsi-36000c290ef83f5ddee94f3e43dcb6197 -> ../../sdb

同様の作業を残り2本のOCSノードに対しても行います。

s2.ocp45.example.localdomain に対して同様の確認を行います。

sh-4.4#  ls -l /dev/disk/by-id/ | grep sdb 
lrwxrwxrwx. 1 root root  9 Oct 22 15:57 scsi-36000c29af3872df29dc0cf11fc1b0e08 -> ../../sdb
sh-4.4#

s3.ocp45.example.localdomain に対して同様の確認を行います。

sh-4.4# ls -l /dev/disk/by-id/ | grep sdb 
lrwxrwxrwx. 1 root root  9 Oct 22 15:57 scsi-36000c294793b7f8acdd6584ff588cecc -> ../../sdb
sh-4.4#

以上でそれぞれのOCSノードdiskby-idがわかりました。
次のステップで使用するのでパスを含めて以下のように整形してメモしておきます。

/dev/disk/by-id/scsi-36000c290ef83f5ddee94f3e43dcb6197    # OCSノード 1
/dev/disk/by-id/scsi-36000c29af3872df29dc0cf11fc1b0e08    # OCSノード 2
/dev/disk/by-id/scsi-36000c294793b7f8acdd6584ff588cecc    # OCSノード 3

次のステップでは、集めた情報を使ってyamlファイルを作成します。

5.2.2. Custom Resource (LocalVolume) の作成

前のステップで集めたdiskの情報を使ってOCSCR(Custom Resource)を作成します。
local-storage-block.yamlという名前の以下のファイルを作成します。

local-storage-block.yaml
apiVersion: local.storage.openshift.io/v1
kind: LocalVolume
metadata:
  name: local-block
  namespace: local-storage
  labels:
    app: ocs-storagecluster
spec:
  nodeSelector:
    nodeSelectorTerms:
    - matchExpressions:
        - key: cluster.ocs.openshift.io/openshift-storage
          operator: In
          values:
          - ""
  storageClassDevices:
    - storageClassName: localblock
      volumeMode: Block
      devicePaths:
        - /dev/disk/by-id/scsi-36000c290ef83f5ddee94f3e43dcb6197   # OCSノード 1
        - /dev/disk/by-id/scsi-36000c29af3872df29dc0cf11fc1b0e08    # OCSノード 2
        - /dev/disk/by-id/scsi-36000c294793b7f8acdd6584ff588cecc   # OCSノード 3
  tolerations:                              
  - effect: NoSchedule                     
    key: node.ocs.openshift.io/storage 
    value: "true"                       

作成したファイルをapplyします。

oc create -f local-storage-block.yaml

Podが作成されているか確認します。

# oc get pod -n local-storage
NAME                                      READY   STATUS    RESTARTS   AGE
local-block-local-diskmaker-mv5xb         1/1     Running   0          50s
local-block-local-diskmaker-nkfdw         1/1     Running   0          50s
local-block-local-diskmaker-r8gg2         1/1     Running   0          50s
local-block-local-provisioner-542k6       1/1     Running   0          50s
local-block-local-provisioner-cxhcl       1/1     Running   0          50s
local-block-local-provisioner-pnlhb       1/1     Running   0          50s
local-storage-operator-588b4686c6-2kllz   1/1     Running   0          126m
# 

PV(Persistent Volume)の作成を確認します。

# oc get pv
NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
local-pv-73dc6977   1Ti        RWO            Delete           Available           localblock              51s
local-pv-a3a35d00   1Ti        RWO            Delete           Available           localblock              40s
local-pv-b7abec06   1Ti        RWO            Delete           Available           localblock              40s
# 

locakblockというStorage Classの生成を確認します。

[root@bastion openshift]# oc get sc 
NAME         PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
localblock   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  63s
[root@bastion openshift]# 

5.3.Cluster Serviceの作成

OpenShiftコンソールに移動し、Installed Operatorsで、Projectで、openshift-storageを選択します。
OpenShift Constainer Storageをクリックします。

image.png

Create OCS Cluster Serviceをクリックします。
image.png

Create Storage Clusterの設定画面に遷移します。
image.png

Select Modeは、Internalが選択されている事を確認します。
Nodesの項目では、OCSノードとして作成した3本のノードが選択されている事を確認します。
Storage Classは、localblockを選択します。

確認ができたらCreateをクリックします。

6. OCS 作成の確認

6.1.Podの起動確認

oc get pod -n openshift-storage で、Pod が RunningCompletedになるのを確認します。

[root@bastion openshift]# oc get pod -n openshift-storage
NAME                                                              READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-7w52w                                            3/3     Running     0          7m26s
csi-cephfsplugin-b2lcg                                            3/3     Running     0          7m26s
csi-cephfsplugin-bq8s6                                            3/3     Running     0          7m26s
csi-cephfsplugin-n68pn                                            3/3     Running     0          7m26s
csi-cephfsplugin-provisioner-55d77c5b99-knr7h                     5/5     Running     0          7m25s
csi-cephfsplugin-provisioner-55d77c5b99-szs29                     5/5     Running     0          7m25s
csi-cephfsplugin-qfwhn                                            3/3     Running     0          7m26s
csi-cephfsplugin-rb6tr                                            3/3     Running     0          7m26s
csi-rbdplugin-69rll                                               3/3     Running     0          7m27s
csi-rbdplugin-fcvnb                                               3/3     Running     0          7m27s
csi-rbdplugin-ffbb7                                               3/3     Running     0          7m27s
csi-rbdplugin-kjcnq                                               3/3     Running     0          7m27s
csi-rbdplugin-provisioner-86d4877dd5-f8sl9                        5/5     Running     0          7m26s
csi-rbdplugin-provisioner-86d4877dd5-pld7c                        5/5     Running     0          7m26s
csi-rbdplugin-r5z7n                                               3/3     Running     0          7m27s
csi-rbdplugin-xslrh                                               3/3     Running     0          7m27s
noobaa-core-0                                                     1/1     Running     0          3m34s
noobaa-db-0                                                       1/1     Running     0          3m34s
noobaa-endpoint-65dcff66c5-dlnpf                                  1/1     Running     0          54s
noobaa-operator-54fd4c8b7b-269bn                                  1/1     Running     0          33m
ocs-operator-84bdd64c68-g2tqf                                     0/1     Running     0          33m
rook-ceph-crashcollector-s1.ocp45.example.localdomain-7f976xj2z   1/1     Running     0          6m51s
rook-ceph-crashcollector-s2.ocp45.example.localdomain-75b4vr5hp   1/1     Running     0          6m42s
rook-ceph-crashcollector-s3.ocp45.example.localdomain-57c82x9gk   1/1     Running     0          4m20s
rook-ceph-drain-canary-s1.ocp45.example.localdomain-67b469hmxcr   1/1     Running     0          3m37s
rook-ceph-drain-canary-s2.ocp45.example.localdomain-65f8bbhh8z9   1/1     Running     0          3m38s
rook-ceph-drain-canary-s3.ocp45.example.localdomain-cdd8b5kxrj2   1/1     Running     0          3m36s
rook-ceph-mds-ocs-storagecluster-cephfilesystem-a-5d48864cj72pg   1/1     Running     0          3m20s
rook-ceph-mds-ocs-storagecluster-cephfilesystem-b-6897d49fkfr72   1/1     Running     0          3m19s
rook-ceph-mgr-a-5f558b7854-zxx6w                                  1/1     Running     0          3m53s
rook-ceph-mon-a-74584cb98-g64dd                                   1/1     Running     0          6m51s
rook-ceph-mon-b-67c75d95f5-msm98                                  1/1     Running     0          6m42s
rook-ceph-mon-c-686b895696-pjxfb                                  1/1     Running     0          4m20s
rook-ceph-operator-75598ffcd9-hxb6b                               1/1     Running     0          33m
rook-ceph-osd-0-54f7bccc4f-4fdzr                                  1/1     Running     0          3m38s
rook-ceph-osd-1-6f8b5c7477-bhwcm                                  1/1     Running     0          3m37s
rook-ceph-osd-2-7fbffd4fc9-5wbgh                                  1/1     Running     0          3m36s
rook-ceph-osd-prepare-ocs-deviceset-0-data-0-dz69c-wws8c          0/1     Completed   0          3m49s
rook-ceph-osd-prepare-ocs-deviceset-1-data-0-5jtvr-tlxq4          0/1     Completed   0          3m48s
rook-ceph-osd-prepare-ocs-deviceset-2-data-0-ghnsr-dp7nk          0/1     Completed   0          3m47s
rook-ceph-rgw-ocs-storagecluster-cephobjectstore-a-568854f4fvgq   1/1     Running     0          2m48s
rook-ceph-rgw-ocs-storagecluster-cephobjectstore-b-5479655np5w7   1/1     Running     0          2m46s
[root@bastion openshift]# oc get pod -n openshift-storage | grep -v NAME | wc -l
42
[root@bastion openshift]#

上記の環境では、約8分くらいで全てのPodが起動しました。

csi plugin は、この時点でMasterノード以外の全ノードに配られるので Node数によって出力行数は変わります。上記の環境は (Workerノード x 6, OCSノード x 3) の環境なので、csi-cephfsplugin-xxxxcsi-rbdplugin-xxxx が6個づつ存在しています

Podの役割については、マニュアルに記載があるので、必要な数が起動してきているか確認します。

特に以下の部分は、比較的後から表示されます。

rook-ceph-osd-xxxxx
rook-ceph-osd-xxxxx
rook-ceph-osd-xxxxx

また、以下のPodは、0/1が最終的に1/1になります。

ocs-operator-84bdd64c68-g2tqf                                     0/1     Running     0          33m

6.2.OCS Clusterのステータスの確認

OpenShiftコンソールより、OCS Clusterの状態を確認します。
Home->OvervirewからPersistent Storageを選びます。
Detailsに内容が表示されていて、Statusもグリーンになっている事を確認します。

image.png

6.3.Multicloud Object Gatewayの正常性の確認

OpenShiftコンソールより、Multicloud Object Gatewayの状態を確認します。
Home->OvervirewからObject Serviceを選びます。
Detailsに内容が表示されていて、Statusもグリーンになっている事を確認します。

image.png

6.4.OCS の Storage Class の確認

4つのStorage Classが作成されているはずなので、確認します。

ocs-storagecluster-ceph-rbd  
ocs-storagecluster-cephfs
openshift-storage.noobaa.io
ocs-storagecluster-ceph-rgw

が作成されている事を確認します。

Storage->Storage Classesから確認できます。

image.png

CLIでも確認できます。その場合は、oc get storageclasses を実行します。

[root@bastion ~]# oc get storageclasses
NAME                          PROVISIONER                             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
localblock                    kubernetes.io/no-provisioner            Delete          WaitForFirstConsumer   false                  2d10h
ocs-storagecluster-ceph-rbd   openshift-storage.rbd.csi.ceph.com      Delete          Immediate              true                   2d10h
ocs-storagecluster-ceph-rgw   openshift-storage.ceph.rook.io/bucket   Delete          Immediate              false                  2d10h
ocs-storagecluster-cephfs     openshift-storage.cephfs.csi.ceph.com   Delete          Immediate              true                   2d10h
openshift-storage.noobaa.io   openshift-storage.noobaa.io/obc         Delete          Immediate              false                  2d10h
[root@bastion ~]# 

以上でOCSのインストール確認は完了です。

7.ラベル、taint、tolerationの設計

実際の環境には、役割の違うノードが混在します。

ここでは、以下のような構成を考えます。

image.png

Masterノード : コントロールプレーン
ユーザーアプリ専用 Node : ユーザーのコンテナが稼働するWorkerノード
Infraノード : 監視やログ収集のコンポーネントが稼働するWorkerノード
OCSノード : OCS(OopenShift Container Storage)が稼働するWokrer Node

で構成されています。

図の中でOCSノードcluster.ocs.openshift.io/openshift-storage=''というラベルを貼っていますが、これはセクション「3.3. OCSインストール対象Nodeのラベリング」で、行った手順です。OCSのメインのコンポーネントは、このラベルがある所にインストールされています。

7.1.Infra ラベルを貼る

動作に影響はしませんが、OpenShiftは、ユーザーのアプリケーションを動かすWorkerノードと、運用用途に使われるWorkerノードを内部的に認識しています。

OpenShiftからOCSノードinfra(Infrastructure)用のノードと認識されるようにinfraと言う role ラベルをつけておきます。

以下のコマンドで、Infraノードとしてのラベルを振ります。

oc label node s1.ocp45.example.localdomain node-role.kubernetes.io/infra=
oc label node s2.ocp45.example.localdomain node-role.kubernetes.io/infra=
oc label node s3.ocp45.example.localdomain node-role.kubernetes.io/infra=

Workerノードとしてのラベルはつけたままにします。Workerノード のラベルを削除する事もできますが、単純に削除しただけだと、OpenShiftからWoker Nodeとみなされなくなるため自動アップデート等の運用に問題が発生します。

[root@bastion openshift]# oc get nodes
NAME                           STATUS   ROLES          AGE   VERSION        
i1.ocp45.example.localdomain   Ready    worker         14h   v1.18.3+47c0e71
i2.ocp45.example.localdomain   Ready    worker         14h   v1.18.3+47c0e71
i3.ocp45.example.localdomain   Ready    worker         14h   v1.18.3+47c0e71
m1.ocp45.example.localdomain   Ready    master         15h   v1.18.3+47c0e71
m2.ocp45.example.localdomain   Ready    master         15h   v1.18.3+47c0e71
m3.ocp45.example.localdomain   Ready    master         15h   v1.18.3+47c0e71
s1.ocp45.example.localdomain   Ready    infra,worker   27m   v1.18.3+47c0e71
s2.ocp45.example.localdomain   Ready    infra,worker   28m   v1.18.3+47c0e71
s3.ocp45.example.localdomain   Ready    infra,worker   28m   v1.18.3+47c0e71
w1.ocp45.example.localdomain   Ready    worker         14h   v1.18.3+47c0e71
w2.ocp45.example.localdomain   Ready    worker         14h   v1.18.3+47c0e71
w3.ocp45.example.localdomain   Ready    worker         14h   v1.18.3+47c0e71
[root@bastion openshift]# 

7.2.toleration と taint を付ける

OCSノードに、ユーザーアプリの Podがスケジュールされる可能性があります。
OCSノードtaintをつける事で、tolerationを持っているPodしかスケジュールされないようにします。

予期せぬ事態を防ぐために、先に toleration をつけて、その後に taint を付ける事をおすすめします。

7.2.1.LocalVolume に toleration を付ける

以前作成したOCSCR(Custom Resource)であるLocalVolumelocal-block を編集して、tolerationを付けます。

 oc edit LocalVolume local-block -n local-storage

node.ocs.openshift.io/storage="true":NoSchedule と言うtaintがあってもスケジュールされるように編集します。

実際には、この手順ではLocalVolumeリソースを作成した時に、既にtolerationの定義を追加しているので、定義が存在している事を確認します。

<省略>
  name: local-block
  namespace: local-storage
  resourceVersion: "7632465"
  selfLink: /apis/local.storage.openshift.io/v1/namespaces/local-storage/localvolumes/local-block
  uid: ef7774a6-1496-484f-b50d-d47bc36456a5
spec:
  logLevel: Normal
  managementState: Managed
  nodeSelector:
    nodeSelectorTerms:
    - matchExpressions:
      - key: cluster.ocs.openshift.io/openshift-storage
        operator: In
        values:
        - ""
  storageClassDevices:
  - devicePaths:
    - /dev/disk/by-id/scsi-36000c290ef83f5ddee94f3e43dcb6197
    - /dev/disk/by-id/scsi-36000c29af3872df29dc0cf11fc1b0e08
    - /dev/disk/by-id/scsi-36000c294793b7f8acdd6584ff588cecc
    storageClassName: localblock
    volumeMode: Block
  tolerations:                               # toleration 追加されている事を確認
  - effect: NoSchedule                       # 追加を確認
    key: node.ocs.openshift.io/storage       # 追加を確認
    value: "true"                            # 追加を確認
<省略>

7.2.2.CSIプラグインPodに toleration を付ける

CSIプラグイン(Pod)は、OCSのストレージにアクセスするためにクラスターの全てのノードに必要なPodです。
taintが付いているノードにもCSIプラグインをインストールするには、tolerationを付けてあげる必要があります。
以下のコマンドで、rook-ceph-operatorConfigMapを編集します。

oc edit configmap rook-ceph-operator-config -n openshift-storage

#の所がこの手順で変更した所です。

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
       data:
        CSI_PLUGIN_TOLERATIONS: |2-

         - key: node.ocs.openshift.io/storage
           operator: Equal
           value: "true"
           effect: NoSchedule
         - key: infra                # tolerationの追加
           effect: NoSchedule        #
           value: reserved           #
         - key: infra                #
           effect: NoExecute         #
           value: reserved           #

 CSI_PROVISIONER_TOLERATIONS: |2-
         - key: node.ocs.openshift.io/storage
           operator: Equal
           value: "true"
           effect: NoSchedule

kind: ConfigMap
metadata:
 creationTimestamp: "2020-10-28T03:16:56Z"
 managedFields:
 - apiVersion: v1
 fieldsType: FieldsV1
 fieldsV1:
 f:data:
 .: {}
 f:CSI_PROVISIONER_TOLERATIONS: {}
 manager: ocs-operator
 operation: Update
 time: "2020-10-28T03:16:56Z"
 - apiVersion: v1
 fieldsType: FieldsV1
 fieldsV1:
 f:data:
 f:CSI_PLUGIN_TOLERATIONS: {}
 manager: oc
 operation: Update
 time: "2020-10-28T06:13:35Z"
 name: rook-ceph-operator-config
 namespace: openshift-storage
 resourceVersion: "572973"
 selfLink: /api/v1/namespaces/openshift-storage/configmaps/rook-ceph-operator-config
 uid: 9db6a13c-abc5-4623-9af3-a447a6dd9588

7.2.3.OCSノードに taint を付ける

node.ocs.openshift.io/storage="true":NoSchedule というtaintOCSノードに付けます。

以下のコマンドで、OCSノードtaintを付けます。

oc adm taint node s1.ocp45.example.localdomain node.ocs.openshift.io/storage="true":NoSchedule
oc adm taint node s2.ocp45.example.localdomain node.ocs.openshift.io/storage="true":NoSchedule
oc adm taint node s3.ocp45.example.localdomain node.ocs.openshift.io/storage="true":NoSchedule

taintは以下のコマンドで確認できます。

oc describe node <node名>
<省略>
Annotations:        machineconfiguration.openshift.io/currentConfig: rendered-infra-c5316746ee6f0621645031486cad5c02
                    machineconfiguration.openshift.io/desiredConfig: rendered-infra-c5316746ee6f0621645031486cad5c02
                    machineconfiguration.openshift.io/reason:
                    machineconfiguration.openshift.io/state: Done
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Thu, 22 Oct 2020 22:24:13 +0900
Taints:             node.ocs.openshift.io/storage=true:NoSchedule
Unschedulable:      false
<省略>

7.2.4.taint の削除

taintを付け間違った時は、最期に-を付ける事で消す事ができます。

oc adm taint node s1.ocp45.example.localdomain node.ocs.openshift.io/storage="true":NoSchedule-

8.補則

インストールを行ってみて、知っておいた方が良いと思った事を書いておきます。

8.1.OCSのuninstall

OCSのインストールは、基本 Operator によるインストールですが、これらの行った手順を単純に取り消しても、ゴミが残ってしまい、基本、元の状態に戻りません。

OCS4.5の時点で、OCSのアンインストールは、例えまだPVCを作成してアプリケーションからボリュームを使用してない状態でも、コマンドラインから行う必要があります。OpenShift Console から、アンインストールをしても、インストール手順を逆になぞるだけでは完全に削除できないので、注意してください。

マニュアルにアンインストールの章があるので、それに沿って作業します。
OPENSHIFT CONTAINER PLATFORM のアンインストール(Red Hat マニュアル)

マニュアルの手順では、local-storagenamespaceが残るので以下のコマンドで削除します。

oc delete namespace local-storage

8.2. HPA(Horizontal Pod Autoscaler)のWarning

OCS4.5では、インストール暫くすると以下のような、 HPA(Horizontal Pod Autoscaler)が出すWarningOpenShift Consoleに出る事が確認されています。これはBugとして扱われており、OCS`4.6で一部修正されたような記述が見えますが、4.6用の別のチケットもオープンしており詳細な状況は未確認です。(2020/10/29時点)

image.png

コマンドラインでも以下のようにoc get events -n openshift-storageで確認できます。

[root@bastion openshift]# oc get events -n openshift-storage
LAST SEEN   TYPE      REASON                         OBJECT                                    MESSAGE
70m         Warning   FailedGetResourceMetric        horizontalpodautoscaler/noobaa-endpoint   unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: an error on the server ("Internal Server Error: \"/apis/metrics.k8s.io/v1beta1/namespaces/openshift-storage/pods?labelSelector=noobaa-s3%3Dnoobaa\": subjectaccessreviews.authorization.k8s.io is forbidden: User \"system:serviceaccount:openshift-monitoring:prometheus-adapter\" cannot create resource \"subjectaccessreviews\" in API group \"authorization.k8s.io\" at the cluster scope") has prevented the request from succeeding (get pods.metrics.k8s.io)
70m         Warning   FailedComputeMetricsReplicas   horizontalpodautoscaler/noobaa-endpoint   invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: an error on the server ("Internal Server Error: \"/apis/metrics.k8s.io/v1beta1/namespaces/openshift-storage/pods?labelSelector=noobaa-s3%3Dnoobaa\": subjectaccessreviews.authorization.k8s.io is forbidden: User \"system:serviceaccount:openshift-monitoring:prometheus-adapter\" cannot create resource \"subjectaccessreviews\" in API group \"authorization.k8s.io\" at the cluster scope") has prevented the request from succeeding (get pods.metrics.k8s.io)
[root@bastion openshift]# 

8.3. OCSをインターナルモードで作成する事について

通常時は問題を感じなかったのですが、OCSをインターナルモードで、OpenShfit クラスター内に配置する場合、OpenShift(Kubernetes)のアップデートに OCS自体も影響を受ける事に気づきました。

実際、クラスターのアップデート中は、クラスター全体が不安定な状況になりますが、ストレージであるOCSもインターナルモードで作っている場合は、OpenShiftの一部ですので、MasterノードWorkerノードと一緒にアップデートが走り、ストレージも含めてシステム全体が不安定な状況になります。

一般的にサーバーやアプリのアップデートと、ストレージのファームウェアのアップデートを同時に行うのは、リスク管理として良い方法ではないと思います。

そして現状ではKubernetesは、およそ3ヶ月に1回新しいマイナー・バージョンがリリースされ、一つのマイナーバージョンのサポート期間はおよそ1年です。

ストレージは企業活動の資産でもあるので、こう言った頻繁なアップデートにおけるリスクを減らすためには、OCSインターナルモードを使うのはテスト環境にするか、バックアップを別のストレージシステムに取得している事を前提とするのが良いと感じました。

10
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8