お世話になっております。チーム word-unknown-tsukuba-otaku です。
結論から申し上げますと、各ノードでの Ceph のための LVM の論理ボリュームが inactive になっていたことが原因で種々の問題が発生しておりました。
まず、魔王様が仰られていた「nginx が動作しない」という症状は、nginx の Pod が Unknown 状態になっており、Running ではないことが直接の原因です。
user@k8s-master:~$ kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-bc7c9f854-kxw4l 0/1 Unknown 0 2d17h
nginx-deployment-bc7c9f854-rqcwv 0/1 Unknown 0 2d17h
さて、Unknown 状態である理由を見ると、Pod にボリュームがアタッチできていないことがわかります。
user@k8s-master:~$ kubectl describe pod -l app=nginx
...
Warning FailedMount 2d16h kubelet MountVolume.MountDevice failed for volume "pvc-408ddef0-3604-4521-bb85-ad3f7eb6d250" : rpc error: code = DeadlineExceeded desc = context deadline exceeded
Warning FailedMount 2d16h (x4 over 2d16h) kubelet Unable to attach or mount volumes: unmounted volumes=[nginx-data], unattached volumes=[nginx-data kube-api-access-hc8tq]: timed out waiting for the condition
Warning FailedMount 2d16h kubelet Unable to attach or mount volumes: unmounted volumes=[nginx-data], unattached volumes=[kube-api-access-hc8tq nginx-data]: timed out waiting for the condition
...
さて、該当クラスターには Rook Ceph を用いたストレージシステムが rook-ceph
名前空間に構築されており、nginx の Pod はこのストレージシステムから PVC を使ってボリュームを利用しようとするもそれが失敗していました。
user@k8s-master:~$ kubectl -n rook-ceph get cephcluster
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL
rook-ceph /var/lib/rook 3 2d17h Ready Cluster created successfully HEALTH_WARN
HEALTH_WARN
とあることからこのストレージシステムになんらかの異常があってボリュームがアタッチできていないことが予想できます。
そこで rook-ceph
の Pod を見ると、rook-ceph-osd-{0,1,2}
の Pod が正常に起動できていないことがわかります。
user@k8s-master:~$ kubectl get pods -n rook-ceph
...
rook-ceph-osd-0-868b447786-vwp7t 0/1 Init:CrashLoopBackOff 7 (30s ago) 2d17h
rook-ceph-osd-1-6b59ddf599-vqlkw 0/1 Init:CrashLoopBackOff 7 (30s ago) 2d17h
rook-ceph-osd-2-cf97ddf6f-gd2p7 0/1 Init:CrashLoopBackOff 7 (42s ago) 2d17h
...
rook-ceph-osd-0
Deployment を例にとってログから原因を確認すると、/dev/ceph-...
というパスがないことが原因のようです。なお、今回は init container でのエラーということで init container である activate
のログを確認しています。
user@k8s-master:~$ kubectl -n rook-ceph logs deploy/rook-ceph-osd-0 -c activate
...
stderr: failed to read label for /dev/ceph-2fa13f0a-1abb-4029-b99d-2f43ddb5ef89/osd-block-1ac35bdb-9d75-4cf1-b7e1-64efe618758e: (2) No such file or directory
...
さて、/dev/ceph-...
のパスは、各ノードにおける LVM の論理ボリュームです。しかし、inactive (NOT available) であるためにブロックデバイスとして利用することができなくなっています。
rook-ceph-osd-0
が実行されているノードである k8s-node-2
で確認します。
user@k8s-node-2:~$ sudo apt update && sudo apt install -y lvm2 # lvdisplay 等のために必要
user@k8s-node-2:~$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/ceph-2fa13f0a-1abb-4029-b99d-2f43ddb5ef89/osd-block-1ac35bdb-9d75-4cf1-b7e1-64efe618758e
LV Name osd-block-1ac35bdb-9d75-4cf1-b7e1-64efe618758e
VG Name ceph-2fa13f0a-1abb-4029-b99d-2f43ddb5ef89
LV UUID myzDdW-mHlq-BZDR-YZdk-jo8O-kCZc-ohy0Ea
LV Write Access read/write
LV Creation host, time rook-ceph-osd-prepare-k8s-node-2-svwlf, 2023-03-02 18:26:51 +0900
LV Status NOT available
LV Size <20.00 GiB
Current LE 5119
Segments 1
Allocation inherit
Read ahead sectors auto
user@k8s-node-2:~$ ls /dev/ceph-2fa13f0a-1abb-4029-b99d-2f43ddb5ef89/osd-block-1ac35bdb-9d75-4cf1-b7e1-64efe618758e
ls: cannot access '/dev/ceph-2fa13f0a-1abb-4029-b99d-2f43ddb5ef89/osd-block-1ac35bdb-9d75-4cf1-b7e1-64efe618758e': No such file or directory
そのため、各ノードで論理ボリュームを activate した後に rook-ceph-operator
を再起動することでストレージシステムを復旧することができました。
具体的には、それぞれのノードで次のコマンドを実行しました。
user@k8s-node-1:~$ sudo apt update && sudo apt install -y lvm2
user@k8s-node-1:~$ sudo lvchange -ay ceph-cbc782ab-41ec-4534-a4d2-5d52e4933387/osd-block-22ae25ff-b4d5-4562-b329-12b08a0bbfd3
user@k8s-node-2:~$ sudo apt update && sudo apt install -y lvm2
user@k8s-node-2:~$ sudo lvchange -ay ceph-2fa13f0a-1abb-4029-b99d-2f43ddb5ef89/osd-block-1ac35bdb-9d75-4cf1-b7e1-64efe618758e
user@k8s-node-3:~$ sudo apt update && sudo apt install -y lvm2
user@k8s-node-3:~$ sudo lvchange -ay ceph-99240cb9-24bf-4a88-a77b-f05521c03d55/osd-block-0f86f995-122c-424c-8e1f-7afd8b46fd22
user@k8s-master:~$ kubectl -n rook-ceph rollout restart deploy/rook-ceph-operator
deployment.apps/rook-ceph-operator restarted
程なくして、rook-ceph-osd
の Pod が復旧し、Ceph のクラスタが HEALTH_OK
に復旧します。
user@k8s-master:~$ kubectl -n rook-ceph get pods -l app=rook-ceph-osd
NAME READY STATUS RESTARTS AGE
rook-ceph-osd-0-868b447786-vwp7t 1/1 Running 1 (28m ago) 2d17h
rook-ceph-osd-1-6b59ddf599-vqlkw 1/1 Running 1 (29m ago) 2d17h
rook-ceph-osd-2-cf97ddf6f-gd2p7 1/1 Running 1 (28m ago) 2d17h
user@k8s-master:~$ kubectl -n rook-ceph get cephcluster/rook-ceph
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL
rook-ceph /var/lib/rook 3 2d17h Ready Cluster created successfully HEALTH_OK
この状態で nginx の Pod を入れ替えることで、正しくボリュームがアタッチされるようになり、nginx が復旧します。
user@k8s-master:~$ kubectl rollout restart deploy/nginx-deployment
deployment.apps/nginx-deployment restarted
user@k8s-master:~$ kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-6c649bd7cb-hpvq2 1/1 Running 0 68s
nginx-deployment-6c649bd7cb-hrzlk 1/1 Running 0 66s
nginx が正常に動作していることを確認します。
user@k8s-master:~$ curl $(kubectl get svc/nginx -o jsonpath='{.spec.externalIPs[]}')
<a>ICTSC2022</a>
魔王様が作成された求人ページにページを差し替え、正しくそれが配信されることを確認します。
user@k8s-master:~$ kubectl cp /home/user/prob/index.html $(kubectl get pod -l "app=nginx" -o jsonpath='{.items[0].metadata.name}'):/usr/share/nginx/html/index.html
user@k8s-master:~$ curl $(kubectl get svc/nginx -o jsonpath='{.spec.externalIPs[]}')
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ICTSC2023 求人</title>
</head>
<body>
<h2>運営スタッフ大募集!!!</h2>
<h1>ICTSCはあなたの参加を待っています!</h1>
<p>※ICTSC2023が必ず開催されるわけではございません。</br>
運営不足やその他の原因によって開催しない可能性がございます。</br>
また、運営方法や待遇などが変更される可能性がございます。
</p>
<h3>運営のやること</h3>
<ul>
<li>全員やること</li>
<ul>
<li>問題アイデアをだす</li>
<li>問題作成</li>
<li>ほかの人の問題レビュー</li>
</ul>
<li>希望者ができること</li>
<ul>
<li>問題インフラの作成 参考:</br>
<a
href="https://blog.icttoracon.net/2021/04/26/ictsc2020-%e3%82%a4%e3%83%b3%e3%83%95%e3%83%a9%e8%a7%a3%e8%aa%ac-%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e7%b7%a8/">ICTSC2020
インフラ(2022は物理機材はありませんでした)</a>
</li>
<li>問題掲示をおこなうスコアサーバーの開発:</br>
<a href="https://github.com/ictsc/ictsc-rikka"> スコアサーバー バックエンド</a>、
<a href="https://github.com/ictsc/ictsc-sachiko-v3"> スコアサーバー フロントエンド</a>
</li>
<li>監視基盤やスコアサーバーをのせるk8s基盤の開発 参考: </br>
<a
href="https://blog.icttoracon.net/2021/04/25/ictsc2020-k8s%e9%81%8b%e7%94%a8%e8%a7%a3%e8%aa%ac-%e5%89%8d%e7%b7%a8%ef%bc%9a%e6%a7%8b%e7%af%89%e3%81%a8%e6%a7%8b%e6%88%90/">ICTSC2020
k8s運用 前編</a>、
<a
href="https://blog.icttoracon.net/2021/04/25/ictsc2020-k8s%e9%81%8b%e7%94%a8%e8%a7%a3%e8%aa%ac-%e5%be%8c%e7%b7%a8%ef%bc%9a%e9%81%8b%e7%94%a8%e7%b7%a8/">ICTSC2020
k8s運用 後編</a>
</li>
</ul>
</ul>
<h3>2022での待遇</h3>
<ul>
<li>給与等なし</li>
<li>開催場所への交通費提供</li>
<li>開催場所での宿泊場所提供</li>
</ul>
<h3>参考: ICTSC2022開催までの流れ</h3>
11月ごろキックオフ</br>
↓</br>
年末までに問題アイデア</br>
↓</br>
二月末まで 問題作成</br>
↓</br>
二月末~三月初め ホットステージ</br>
(開催場所に集まって問題作成やインフラ構築)</br>
</br></br></br>
<h3>応募などは閉会式で</h3>
</body>
</html>
魔王様が作成されたこのような素晴らしい求人ページが正しく配信されるようになったことを喜ばしく思います。これで希望者が続出するに違いありません(なにしろ魔王の元で働けるのですから)。 確認のほどよろしくお願いいたします。