⚙️

SadServers解説#8 "Bilbao": Basic Kubernetes Problems

2024/04/20に公開

https://ja.wikipedia.org/wiki/ビルバオ

問題概要

シナリオ

基本的なKubernetesの問題

問題詳細

manifest.ymlファイル内でNginxポッドとロードバランサーが記述されている、Kubernetesの構成があります。しかし、ポッドが起動していません。ロードバランサーを介してNginxコンテナにアクセスできるように修正してください。sudoの権限はありません。

解決判定

Check My Solutionボタンをクリックしてください。

解答が正解かどうか、コマンドプロンプト上で確認することも可能です。以下のコマンドを実行し、Nginxのウェルカムページが表示されれば問題は解決できています。

# curl 10.43.216.196

実際の解決の判定方法は、以下のシェルスクリプトを見てください。

/home/admin/agent/check.sh

 

問題解決の方針

【表示する】

この問題では、Nginxに接続できない問題のトラブルシューティングを行います。
Kubernetesのログを見て、表示されている問題に対処していきます。

解決の手順を表示する
  1. Kubernetesのログを見る
  2. ログの問題が解決できるように設定を変更し適用する
  3. 1,2を繰り返す

 

ヒント

一部、SadServers公式のヒントを改変しています。

ヒント1

まずは、マニュアルのファイルを見てみましょう。

$ cat manifest.yml

いろいろとコンテナ化に関する設定が書いてあります。
 
続けて、podの状態を確認しましょう。Kubernetesのコンテナの状態は、kubectlコマンドで確認することができます。

$ kubectl get pod
$ kubectl descrive pod
ヒント2

以下のコマンドを実行し、現在のコンテナの状態を確認します。

$ kubectl describe pod

末尾に出力されるログを確認すると、以下の内容が出力されています。
Warningは二つ出力されていますが、内容は同じです(古い方のログは問題作成時のもので、新しい方のログは今回のサーバが起動したときに出力されたようなもののような気がします)。

default-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling..
【日本語訳と補足】
default-scheduler: このポッドのデフォルトのスケジューラーの名前。
0/2 nodes are available: ノードは2つありますが、いずれも利用可能ではありません。
1 node(s) didn't match Pod's node affinity/selector,:ポッドのノードアフィニティ(ポッドがどのノードに配置されるかを制御するための仕組み)やセレクタ(ポッドがどのようなノードにスケジュールされるかを決定するための仕組み)と一致しないノードが1つあります。
1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }:1つのノードが許容されていないtaint「node.kubernetes.io/unreachable」を持っています。これは、ノードが到達不能であることを示しています。
preemption: 0/2 nodes are available:ポッドのスケジューリングにおいて、いずれのノードも他のポッドを優先して利用できませんでした。
2 Preemption is not helpful for scheduling..:スケジューリングにはPreemption(優先度が高いPodを停止させてその場にスケジューリングする機能)は役立たないことを示しています。つまり、他のポッドを削除してリソースを確保することができなかったことを意味します。

まとめると、今回のKubernetesの構成には、以下の問題があります。

  • クラスタ内の2つのノードはどちらも使用できない状態
    • 1つのノードはポッドのノードアフィニティやセレクタと一致しない
    • もう1つのノードは{node.kubernetes.io/unreachable: }という許容できないテイントを持っている

一つ目の問題を解決するために、ノードに不足しているラベルを追加してください。
あるいは、ポッドを削除するか、マニフェストからnodeSelectorを削除してください。

実行コマンド

今回は、ノードに不足しているラベルを追加する方法を試してみます。

# kubectl label nodes node1 disk=ssd
node/node1 labeled
# kubectl apply -f manifest.yml
ヒント3

以下のコマンドを実行し、現在のコンテナの状態を確認します。

$ kubectl describe pod

末尾に出力されるログを確認すると、以下の内容が出力されています。

default-scheduler 0/2 nodes are available: 1 Insufficient memory, 1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }. preemption: 0/2 nodes are available: 1 No preemption victims found for incoming pod, 1 Preemption is not helpful for scheduling..
【日本語訳と補足】
default-scheduler: このポッドのデフォルトのスケジューラーの名前。
0/2 nodes are available: ノードは2つありますが、いずれも利用可能ではありません。
1 Insufficient memory,:ポッドのノードアフィニティ(ポッドがどのノードに配置されるかを制御するための仕組み)やセレクタ(ポッドがどのようなノードにスケジュールされるかを決定するための仕組み)と一致しないノードが1つあります。
1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }:1つのノードが許容されていないtaint「node.kubernetes.io/unreachable」を持っています。これは、ノードが到達不能であることを示しています。
preemption: 0/2 nodes are available:ポッドのスケジューリングにおいて、いずれのノードも他のポッドを優先して利用できませんでした。
2 Preemption is not helpful for scheduling..:スケジューリングにはPreemption(優先度が高いPodを停止させてその場にスケジューリングする機能)は役立たないことを示しています。つまり、他のポッドを削除してリソースを確保することができなかったことを意味します。

先ほどのエラーと見比べてみると、ノードがポッドのノードアフィニティやセレクタと一致しない問題は解決されましたが、今度はメモリ不足が発生しているようです。

Kubernetesの構成設定を変更し、要求メモリを半分にしてみましょう。

実行コマンド
# vi manifest.yml
spec.template.spec.containers.resources.requests.memoryの値を2000Miから1000Miに変更
# kubectl apply -f manifest.yml
# kubectl describe pod

ログを見ると、正常に起動しているようです!

 
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
https://zenn.dev/comf_nakamura/articles/linux_command

 

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion