Kubernetes(k8s)の学習として、Windows 11のDocker Desktop上にnginxをデプロイし、ブラウザアクセスとログ確認を試しました。実行したコマンドと、途中で学んだポイントをまとめます。
1. 学習環境
今回使用した構成は以下です。
| 項目 | 内容 |
|---|---|
| OS | Windows 11 |
| 実行環境 | Docker Desktop(WSL2) |
| Kubernetesの構築方式 | kind |
| ノード数 | 1 |
| Kubernetesバージョン | v1.34.3 |
| 操作端末 | PowerShell |
| Webサーバ | nginx |
Docker DesktopのKubernetes画面から「Create cluster」を選び、kind・1ノードで作成しました。kindを使うには、Settings → Generalの「Use containerd for pulling and storing images」が有効になっている必要があります。
初回は起動に少し時間がかかりましたが、待つと「Kubernetes running」になりました。
2. kubectlの接続先を確認する
kubectl config get-contexts
kubectl config use-context docker-desktop
kubectl get nodes
use-contextは、kubectlの操作先を切り替えるコマンドです。Kubernetes自体を起動する操作ではありません。
contextは、接続先クラスタ・認証に使うユーザー・デフォルトのNamespaceなどをまとめた接続設定です。現在の接続先は以下でも確認できます。
kubectl config current-context
get nodesでノードのSTATUSがReadyなら準備完了です。
3. nginxをデプロイする
kubectl create namespace k8s-study
kubectl -n k8s-study create deployment web --image=nginx:stable
kubectl -n k8s-study rollout status deployment/web
kubectl -n k8s-study get pods
主な用語の意味は以下です。
| 用語 | 役割 |
|---|---|
| Node | Podを動かす実行環境 |
| Namespace | クラスタ内のリソースを分ける区画 |
| Pod | コンテナを動かす単位 |
| Deployment | 指定した数のPodが動くように管理する仕組み |
Deploymentを作成すると、その管理下でPodが作られます。Podが失われた場合は、必要な数を維持するために新しいPodが作られます。
rollout statusはデプロイの進捗を確認するコマンドで、起動を開始するコマンドではありません。
PodのREADYが1/1、STATUSがRunningになれば、nginxが動いています。
4. Serviceを作り、ブラウザでアクセスする
まず、Podへのアクセス窓口となるServiceを作成します。
kubectl -n k8s-study expose deployment web --port=80 --target-port=80
この指定は、Serviceの80番ポートから対象Podの80番ポートへ転送する設定です。
Podは作り直されると名前やIPが変わることがあります。Serviceは、その変化を隠して安定したアクセス窓口を提供します。通常のService経由の通信では、対象となる複数Podへの振り分けも担います。
次に、PCからアクセスできるようにします。
kubectl -n k8s-study port-forward service/web 8080:80
このPowerShellを開いたまま、ブラウザで以下へアクセスします。
「Welcome to nginx!」が表示されれば成功です。
port-forwardで学んだこと
8080:80は「PCの8080番ポートから、転送先の80番ポートへ」という意味です。
ただし、port-forward service/webはServiceのIPを経由して負荷分散する動作ではありません。Serviceに対応するPodを1つ選び、kubectlとKubernetes APIサーバーなどを経由して、そのPodへ転送します。
そのため、Podを複数に増やしても、この接続でブラウザを更新すると、基本的には選ばれた1つのPodにアクセスが届きます。
5. アクセスログを確認する
別のPowerShellを開いて実行します。
kubectl -n k8s-study logs deployment/web --tail=20 -f
ブラウザを更新するとアクセスログが流れます。
-
--tail=20:末尾20行を表示 -
-f:新しいログを継続して表示 -
Ctrl+C:ログの追跡を終了
ここで表示されるのは、基本的にコンテナの標準出力・標準エラーです。今回のnginxイメージは、アクセスログなどをそこへ出力するため、kubectl logsで確認できます。
6. Podを2つに増やす
kubectl -n k8s-study scale deployment/web --replicas=2
kubectl -n k8s-study get pods
ここで注意したいのは、以下のコマンドでは通常、Deployment配下の1つのPodのログが選ばれる点です。
kubectl -n k8s-study logs deployment/web --tail=20 -f
複数Podをまとめて確認するには、ラベルで指定できます。
kubectl -n k8s-study get pods --show-labels
kubectl -n k8s-study logs -l app=web --tail=20 --prefix=true -f
-l app=webは、そのラベルを持つPodを対象にする指定です。--prefix=trueを付けると、各行にPod名とコンテナ名が表示されます。
今回の環境では、Deploymentに対して--all-pods=trueを指定する方法も使えます。
kubectl -n k8s-study logs deployment/web --all-pods=true --tail=20 -f
なお、port-forwardの接続先は1つのPodなので、アクセスログが片方だけ増えても正常です。
7. 実際の障害調査ではどう絞り込むか
多数のPodがある環境では、以下の順に対象を絞ります。
-
Namespaceを特定する
-
Deploymentやラベルでアプリを特定する
-
Podの状態を確認する
-
問題のあるPod・コンテナのログを見る
対象と状態の確認
kubectl get deployments -A
kubectl -n k8s-study get pods -l app=web -o wide
主にREADY、STATUS、RESTARTSを確認します。
| 状態 | 主に確認すること |
|---|---|
| Pending | ノードのリソース不足、ストレージなど |
| ImagePullBackOff | イメージ名、取得先への通信、認証など |
| CrashLoopBackOff | アプリが異常終了して再起動を繰り返す原因 |
| RunningでもREADY不足 | ヘルスチェックなど |
起動できない場合はdescribe
以下の<Pod名>などは、実際の値に置き換えます。
kubectl -n k8s-study describe pod <Pod名>
State、Last State、終了コード、末尾のEventsを確認します。
イメージを取得できないなど、アプリが起動する前の問題は、アプリログよりEventsが手掛かりになります。
時間と表示量を絞ってログを見る
kubectl -n k8s-study logs -l app=web --since=10m --tail=100 --timestamps=true --prefix=true
これは、対象Podについて直近10分、各対象コンテナの末尾100行を時刻付きで表示する例です。
1つのPodに複数コンテナがある場合は、コンテナ名も指定します。
kubectl -n k8s-study logs <Pod名> -c <コンテナ名> --tail=100
再起動している場合は、直前に終了したコンテナのログを確認します。
kubectl -n k8s-study logs <Pod名> -c <コンテナ名> --previous --tail=100
--previousは、同じPod内の直前のコンテナ実行のログを見る指定です。削除された別のPodのログを取得する機能ではありません。
通信や設定も確認する
Podが動いているのにアクセスできない場合は、Serviceと転送先も調べます。
kubectl -n k8s-study describe service web
kubectl -n k8s-study get endpointslices -l kubernetes.io/service-name=web
必要に応じて、コンテナ内でコマンドを実行できます。例えば、nginxの設定確認は以下です。
kubectl -n k8s-study exec <Pod名> -- nginx -T
8. ログの保存場所と保持期間
標準出力・標準エラーのログは、コンテナランタイムによってノード側のファイルに記録されます。kubectl logsは、そのログを取得する仕組みです。
一方、アプリが独自のファイルだけに出力しているログは、通常そのままではkubectl logsに表示されません。
また、kubectl logsに「必ず何時間分見られる」という固定の保持期間はありません。
-
ログはサイズなどに応じてローテーションされる
-
kubectl logsで取得できるのは、基本的に最新のログファイル -
Podが削除されると、そのPodのログを通常の
kubectl logsでは取得できない
このため、実運用ではログ集約基盤へ転送し、長期保存や検索を行います。普段は集約ログを検索し、デプロイ直後や起動失敗の調査ではkubectl logsやdescribeを使う、という使い分けになります。
複数のアプリにまたがる処理では、リクエストIDやTrace IDをログに含めると、同じ処理を追いやすくなります。
9. 学習環境の片付け
今回作ったアプリをまとめて削除するには、Namespaceを削除します。
kubectl delete namespace k8s-study
このNamespace内のDeployment、Pod、Serviceなどが削除されます。Kubernetesクラスタ自体は残ります。