Help us understand the problem. What is going on with this article?

Rook/CephのBlockStorageで発生した不整合からの回復

はじめに

停電から回復したKubernetesクラスターの状態を確認していたところ、1つのPod(gitbucket)だけがContainerCreating状態のまま長時間停止していることが分かりました。

原因はPVCがmountできないことだったのですが、原因は停電によってext4のjournal dataが残ったままになっていた事にあります。

回復のためにfsck.ext4を実行すれば良いことはすぐに分かったのですが、どのボリュームに対して実行すれば良いのか直感的には分かりにくかったのでメモを残しておきます。

環境

  • Kubernetes v1.16.9 deployed by Kubespray
  • Rook/Ceph v1.1.9 with FlexVolumes (BlockStorage using ext4)

状態

kubectlコマンドで確認したところ次のような状態になっています。

停止しているPodを削除した後、やはり起動しない状態
$ kubectl -n gitbucket get all
NAME                         READY   STATUS              RESTARTS   AGE
pod/bucket-9b8d9799-khsm8    0/1     Init:1/2            1          27h
pod/mysql-84d459c89c-w8pb6   0/1     ContainerCreating   0          15m

Pod:bucketはinitContainersでmysqlの起動を待っているので、init状態のまま停止しています。

エラー

kubectl describeで起動時の状態を確認すると次のようになっていました。

$ kubectl -n gitbucket describe pod/mysql-84d459c89c-w8pb6
....
Events:
  Type     Reason       Age                  From               Message
  ----     ------       ----                 ----               -------
  Normal   Scheduled    16m                  default-scheduler  Successfully assigned gitbucket/mysql-84d459c89c-w8pb6 to node04
  Warning  FailedMount  15m (x5 over 16m)    kubelet, node04  MountVolume.SetUp failed for volume "pvc-8aaa318c-1212-415d-b00f-e88b9c3c3087" : mount command failed, status: Failure, reason: Rook: Mount volume failed: failed to attach volume pvc-8aaa318c-1212-415d-b00f-e88b9c3c3087 for pod gitbucket/mysql-84d459c89c-w8pb6. Volume is already attached by pod gitbucket/mysql-84d459c89c-rllg6. Status Pending
  Warning  FailedMount  2m46s (x3 over 11m)  kubelet, node04  Unable to attach or mount volumes: unmounted volumes=[mysql-persistent-storage], unattached volumes=[database-auth-conf default-token-txprc mysql-persistent-storage]: timed out waiting for the condition
  Warning  FailedMount  92s (x10 over 15m)   kubelet, node04  MountVolume.SetUp failed for volume "pvc-8aaa318c-1212-415d-b00f-e88b9c3c3087" : mount command failed, status: Failure, reason: failed to mount volume /dev/rbd2 [ext4] to /var/lib/kubelet/plugins/ceph.rook.io/rook-ceph/mounts/pvc-8aaa318c-1212-415d-b00f-e88b9c3c3087, error 'fsck' found errors on device /dev/rbd2 but could not correct them: fsck from util-linux 2.31.1
/dev/rbd2: Superblock needs_recovery flag is clear, but journal has data.
/dev/rbd2: Run journal anyway

/dev/rbd2: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
  (i.e., without -a or -p options)
. 
  Warning  FailedMount  32s (x4 over 14m)  kubelet, node04  Unable to attach or mount volumes: unmounted volumes=[mysql-persistent-storage], unattached volumes=[mysql-persistent-storage database-auth-conf default-token-txprc]: timed out waiting for the condition

このエラーメッセージから、ノードnode04/dev/rbd2で問題が発生していることが分かります。

node04上での修正

最初は、どう対応して良いか分からなかったのですが、node04にログインして/dev/を確認してみると、rbd2が存在しているので、これをfsck.ext4コマンドの引数に与えてみることにしました。

$ ssh node04
$ sudo fsck.ext4 /dev/rbd2
e2fsck 1.44.1 (24-Mar-2018)
Superblock needs_recovery flag is clear, but journal has data.
Run journal anyway<y>? yes
/dev/rbd2: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (5067650, counted=5067649).
Fix<y>? yes
Free inodes count wrong (1310519, counted=1310518).
Fix<y>? yes

/dev/rbd2: ***** FILE SYSTEM WAS MODIFIED *****
/dev/rbd2: 202/1310720 files (14.9% non-contiguous), 175231/5242880 blocks

このまま時間が経過すると無事にPodが動き始めました。

$ kubectl -n gitbucket get all
NAME                         READY   STATUS     RESTARTS   AGE
pod/bucket-9b8d9799-khsm8    0/1     Init:1/2   1          27h
pod/mysql-84d459c89c-w8pb6   0/1     Running    0          27m

xfsで構成した方が良かったかなと(xfsでも問題が発生する可能性はありますが)少し後悔しています。

以上

YasuhiroABE
元エンジニアの大学教員@会津大学。ここに投稿している内容は、個人的な動機・責任で編集しているもので、勤務先・業務には関係ありません。なお、LGTM(評価)・ストックされた記事は、その都度、可能な範囲で見直すようにしています。
https://www.yadiary.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした