SadServers解説#8 "Bilbao": Basic Kubernetes Problems
問題概要
シナリオ
基本的なKubernetesの問題
問題詳細
manifest.yml
ファイル内でNginxポッドとロードバランサーが記述されている、Kubernetesの構成があります。しかし、ポッドが起動していません。ロードバランサーを介してNginxコンテナにアクセスできるように修正してください。sudo
の権限はありません。
解決判定
Check My Solution
ボタンをクリックしてください。
解答が正解かどうか、コマンドプロンプト上で確認することも可能です。以下のコマンドを実行し、Nginxのウェルカムページが表示されれば問題は解決できています。
# curl 10.43.216.196
実際の解決の判定方法は、以下のシェルスクリプトを見てください。
/home/admin/agent/check.sh
問題解決の方針
【表示する】
この問題では、Nginxに接続できない問題のトラブルシューティングを行います。
Kubernetesのログを見て、表示されている問題に対処していきます。
解決の手順を表示する
- Kubernetesのログを見る
- ログの問題が解決できるように設定を変更し適用する
- 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の問題に取り掛かってみてはいかがでしょうか。
問題一覧はこちら
Discussion