【入門編】kubectlコマンド逆引きリファレンス:実務で本当によく使う基本・トラブルシューティング操作まとめ – インフラ構成管理(IaC)活用バイブル

Kubernetesの「あのコマンド、なんだっけ?」を卒業!初心者でもわかるkubectl逆引きリファレンス

やあ、みんな!クラウドインフラの最前線で奮闘している諸君、調子はどうかな?

君たちが今、Kubernetes (k8s) という強力なツールに触れ始めたばかりだとしたら、きっと「kubectl」というコマンドラインツールも毎日触っていることだろう。でも、正直、コマンドって覚えるのが大変だよね。「あれ、Podの状態を確認するコマンドって何だっけ?」「コンテナの中に入ってデバッグしたいんだけど、どうやるんだっけ?」なんて、毎日のように頭を抱えているんじゃないかな。

大丈夫、それは君だけじゃない。僕も同じ道を歩んできたし、今でも時々コマンドを検索することがあるさ。

でもね、kubectlの基本をしっかり押さえておけば、日々のKubernetes操作が劇的に楽になるんだ。まるで、暗闇の中に光が差し込むように、見通しが良くなる。そして、トラブルシューティングのスピードも格段に上がる。そうなれば、もっとクリエイティブな仕事に時間を割けるようになるはずだ。

この記事では、そんな君たちのために、実務で本当によく使うkubectlコマンドを「逆引き」形式で、しかも「なぜそうなるのか」という背景も踏まえながら、優しく丁寧に解説していく。まるで、隣で君のコードレビューをしている先輩エンジニアになったつもりで、じっくりと付き合っていくよ。

これをマスターすれば、君たちのKubernetesライフは、きっともっと楽しく、そして生産的になるはずさ。さあ、一緒にkubectlの深淵を覗いてみよう!

—

1. まずは基本!リソースの状態を「見る」コマンドたち

Kubernetesは、たくさんの「リソース」(Pod、Service、Deploymentなど)の集合体だ。まずは、これらのリソースが今どんな状態にあるのかを把握することが、全ての始まりだ。

1.1. 「今、何があるの?」を知りたいときは `kubectl get`

`kubectl get` は、指定したリソースのリストや、その概要を知りたいときに使う、まさに基本中の基本コマンドだ。

基本構文:

kubectl get <リソースの種類> [リソース名] -n

  • `<リソースの種類>`: `pods`, `services`, `deployments`, `nodes`, `namespaces` など、確認したいリソースの種類を指定します。複数指定することも可能です (例: `pods,services`)。
  • `[リソース名]`: 特定のリソースだけを確認したい場合に指定します。省略した場合は、その種類の全てのリソースが表示されます。
  • `-n `: 確認したいリソースが存在するNamespaceを指定します。省略すると、デフォルトのNamespace(通常は`default`)が対象になります。

よく使う例:

  • 全てのPodを表示する:

kubectl get pods

出力例:

NAME READY STATUS RESTARTS AGE
my-app-pod-abcdef 1/1 Running 0 5m
another-pod-ghijkl 0/1 Pending 0 1m

`READY`列は「コンテナ数/準備完了したコンテナ数」を示します。`STATUS`列は、Podの状態(`Running`, `Pending`, `Error`など)を表します。

  • 特定のDeploymentを表示する:

kubectl get deployment my-app-deployment

  • 特定のNamespaceにある全てのServiceを表示する:

kubectl get services -n production

  • 全てのNamespaceにある全てのNodeを表示する:

kubectl get nodes -A # -A は –all-namespaces の略

さらに詳しく知りたいときは `-o wide` オプション:

`kubectl get` は、オプションを付けることで、より詳細な情報を表示できる。特に `-o wide` は、IPアドレスやPodがどのNodeで動いているかなど、ネットワークやスケジューリングに関わる情報も表示してくれるので、重宝するぞ。

kubectl get pods -o wide

出力例(`IP`と`NODE`列が追加されている):

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-app-pod-abcdef 1/1 Running 0 5m 10.244.1.5 worker-node1

1.2. 「具体的にどうなっているの?」を深掘りする `kubectl describe`

`kubectl get` で概要は掴めた。でも、「なぜかPodが起動しないんだ…」とか、「Serviceにアクセスできない…」といった、もう少し踏み込んだ原因を調査したいときは、`kubectl describe` の出番だ。

`kubectl describe` は、指定したリソースの詳細な情報、イベントログ、状態遷移の履歴などを表示してくれる。これを見れば、大抵の原因究明の糸口が見つかるはずだ。

基本構文:

kubectl describe <リソースの種類> <リソース名> -n

よく使う例:

  • 特定のPodの詳細情報を表示する:

kubectl describe pod my-app-pod-abcdef

出力例(一部抜粋):

Name: my-app-pod-abcdef
Namespace: default
Priority: 0
Node: worker-node1/192.168.1.100
Start Time: Tue, 26 Oct 2023 10:00:00 +0900
Labels: app=my-app
pod-template-hash=abcdef
Annotations:
Status: Running
IP: 10.244.1.5
IPs:
IP: 10.244.1.5
Containers:
my-app-container:
Container ID: containerd://…
Image: nginx:latest
Image ID: docker.io/library/nginx@sha256:…
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 26 Oct 2023 10:00:05 +0900
Ready: True
Restart Count: 0
Liveness: http-get http://localhost:80/ delay=30s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://localhost:80/ delay=10s timeout=1s period=10s #success=1 #failure=3
Environment:
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-xxxxx (ro)
… (省略) …
Events:
Type Reason Age From Message
—- —— —- —- ——-
Normal Scheduled 5m default-scheduler Successfully assigned default/my-app-pod-abcdef to worker-node1
Normal Pulling 5m kubelet Pulling image “nginx:latest”
Normal Pulled 5m kubelet Successfully pulled image “nginx:latest” in 2s
Normal Created 5m kubelet Created container my-app-container
Normal Started 5m kubelet Started container my-app-container

特に注目してほしいのは、出力の一番下にある `Events` セクションだ。ここに、Podの生成、スケジューリング、コンテナの作成・起動といった一連のイベントが時系列で記録されている。Podが `Pending` のまま進まない場合は、`Events` にスケジューリングの失敗理由などが書かれていることが多い。「`FailedScheduling`」といった理由が出てきたら、リソース不足やNodeの制約などが原因だと推測できる。

  • Serviceの詳細を確認する:

kubectl describe service my-app-service

Serviceの場合、`Endpoints` の項目に、どのPodにトラフィックが転送されているかが表示される。ここにIPアドレスが表示されていない場合は、ServiceとPodが正しく紐づいていない可能性がある。

—

2. コンテナの中に入って、生の声を聞くコマンドたち

Podの状態が「Running」なのに、アプリケーションが期待通りに動いていない。そんな時は、コンテナの中に入って直接調査する必要がある。

2.1. 「元気にしてる?」ログを覗く `kubectl logs`

アプリケーションの動作状況やエラーメッセージは、ログに集約されている。`kubectl logs` は、コンテナの標準出力・標準エラー出力をリアルタイムで取得したり、過去のログを確認したりできるコマンドだ。

基本構文:

kubectl logs [-c <コンテナ名>] [-n ] [オプション]

  • ``: ログを取得したいPodの名前を指定します。
  • `[-c <コンテナ名>]`: Pod内に複数のコンテナがある場合に、対象のコンテナを指定します。省略すると、Pod内の最初のコンテナが対象になります。
  • `[-n ]`: 対象のNamespaceを指定します。

よく使うオプション:

  • `-f` または `–follow`: リアルタイムでログを追跡(ストリーミング)します。`tail -f` のように使えるので、アプリケーションの起動時やエラー発生時の確認に非常に便利だ。
  • `–previous`: 直前に終了したコンテナのログを表示します。Podがクラッシュして再起動した場合などに、その原因となったログを確認するのに役立つ。
  • `–tail=<行数>`: 最新の指定した行数だけログを表示します。

よく使う例:

  • Podの最新ログを表示する:

kubectl logs my-app-pod-abcdef

  • Podのログをリアルタイムで追跡する:

kubectl logs -f my-app-pod-abcdef

「Ctrl+C」で追跡を終了できる。

  • クラッシュしたPodの直前のログを表示する:

kubectl logs –previous my-app-pod-abcdef

  • 複数のコンテナを持つPodで、特定のコンテナのログを表示する:

kubectl logs my-multi-container-pod -c sidecar-container

2.2. 「ちょっと失礼して…」コンテナにログインする `kubectl exec`

ログだけでは分からない、あるいは、ファイルシステムの中身を確認したり、コマンドを実行してデバッグしたりしたい場合は、`kubectl exec` を使ってコンテナ内に直接入り込もう。

基本構文:

kubectl exec -it [-c <コンテナ名>] [-n ] — <実行したいコマンド>

  • `-i` (`–stdin`): 標準入力を開いたままにします。
  • `-t` (`–tty`): 疑似TTY(ターミナル)を割り当てます。この2つを組み合わせることで、対話型のシェル(例: `bash`, `sh`)を実行できるようになる。
  • `–`: これ以降を、コンテナ内で実行したいコマンドとして解釈させます。

よく使う例:

  • Pod内のコンテナにログインし、対話型シェルを起動する (bashがある場合):

kubectl exec -it my-app-pod-abcdef — bash

これで、コンテナ内のシェルプロンプトが表示される。`exit` コマンドでシェルを閉じられる。

  • Pod内のコンテナにログインし、対話型シェルを起動する (shしかない場合):

kubectl exec -it my-app-pod-abcdef — sh

  • コンテナ内で特定のコマンドを実行し、その結果を表示する (例: ファイル一覧):

kubectl exec my-app-pod-abcdef — ls /app

この場合、`-it` は不要だ。

  • 複数のコンテナを持つPodで、特定のコンテナにログインする:

kubectl exec -it my-multi-container-pod -c app-container — bash

—

3. アプリケーションを「更新」し、「元に戻す」コマンドたち

デプロイしたアプリケーションは、バグ修正や新機能追加のために更新する必要がある。Kubernetesでは、この更新プロセスを安全かつ柔軟に行うことができる。

3.1. 「新しいバージョンに更新!」 `kubectl apply` と `kubectl set image`

アプリケーションの更新は、主にYAMLマニフェストファイルを変更して適用する方法と、コンテナイメージを直接指定して更新する方法がある。

1. YAMLマニフェストファイルを更新して適用する (`kubectl apply`)

Deploymentなどのリソース定義を記述したYAMLファイルを変更し、`kubectl apply` コマンドで適用するのが最も一般的で推奨される方法だ。`apply` は、宣言的な設定を実現するためのコマンドで、現在のリソースの状態と、指定したYAMLファイルの状態を比較し、差分のみを適用してくれる。

基本構文:

kubectl apply -f <ファイル名.yaml> [-n ]

例:

`deployment.yaml` というファイルに、最新のコンテナイメージを指定したDeployment定義があるとしよう。

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:

  • name: my-app-container

image: my-registry/my-app:v1.1.0 # <-- ここを v1.0.0 から v1.1.0 に変更した ports:

  • containerPort: 80

このファイルを適用するには:

kubectl apply -f deployment.yaml

Kubernetesは、`my-app-deployment` というDeploymentが存在していることを認識し、`template.spec.containers[0].image` が `my-registry/my-app:v1.0.0` から `my-registry/my-app:v1.1.0` に変更されたことを検知する。そして、Deploymentのローリングアップデート戦略に従って、Podを段階的に新しいイメージのPodに置き換えていく。

2. コンテナイメージを直接更新する (`kubectl set image`)

DeploymentやStatefulSetなどのPodテンプレートを持つリソースに対して、コンテナイメージだけを直接更新したい場合に便利なのが `kubectl set image` だ。

基本構文:

kubectl set image <リソースの種類>/<リソース名> <コンテナ名>=<新しいイメージ名> [-n ]

例:

`my-app-deployment` というDeploymentの、`my-app-container` というコンテナイメージを `my-registry/my-app:v1.1.0` に更新する。

kubectl set image deployment/my-app-deployment my-app-container=my-registry/my-app:v1.1.0

これも `kubectl apply` と同様に、ローリングアップデートを実行してくれる。

3.2. 「やっぱり前のバージョンに戻りたい!」ロールバック操作 (`kubectl rollout undo`)

更新を適用した結果、問題が発生したり、ユーザーからのフィードバックが悪かったりした場合、すぐに前のバージョンに戻せるのは非常に重要だ。`kubectl rollout undo` は、Deploymentなどのローリングアップデートの履歴を辿って、以前の状態にロールバックするためのコマンドだ。

基本構文:

kubectl rollout undo <リソースの種類>/<リソース名> [-n ] [オプション]

よく使う例:

  • 最新の1つ前のバージョンにロールバックする:

kubectl rollout undo deployment/my-app-deployment

このコマンドを実行すると、DeploymentのPodテンプレートが、一つ前のリビジョン(バージョン)の状態に戻される。Kubernetesは、再びローリングアップデートを実行し、Podを新しい(古い)イメージのPodに置き換えていく。

  • 特定の履歴リビジョン番号にロールバックする:

まず、ロールバックできる履歴を確認する。

kubectl rollout history deployment/my-app-deployment

出力例:

REVISION SOURCE REVISION_ID TIME_STAMP
3 … 2023-10-26 11:00:00 …
2 … 2023-10-26 10:30:00 …
1 … 2023-10-26 10:00:00 …

例えば、リビジョン `2` に戻したい場合は、以下のように指定する。

kubectl rollout undo deployment/my-app-deployment –to-revision=2

—

4. トラブル発生!「まず最初に」確認すべき診断コマンド一覧

本番環境でインシデントが発生した時、パニックにならず、迅速かつ冷静に原因を特定するためには、いくつかの「お決まり」の診断コマンドを知っておくことが不可欠だ。ここでは、「まず最初に」確認すべき、実戦的なコマンドをいくつか紹介しよう。

4.1. Podの「状態」と「イベント」を総ざらい `kubectl get pods` & `kubectl describe pod`

これは基本中の基本だが、トラブル発生時はまずここからだ。

  • Podの状態確認:

# 問題が発生しているNamespaceのPodを全て確認
kubectl get pods -n <問題のNamespace>

`CrashLoopBackOff` や `Error` になっているPodはないか? `Pending` のまま進んでいないPodはないか? `READY` 列は期待通りか?

  • Podの詳細とイベント確認:

# 問題のPodの詳細を掘り下げる
kubectl describe pod <問題のPod名> -n <問題のNamespace>

特に `Events` セクションに注目!スケジューリングの失敗、イメージのpullエラー、Liveness/Readiness Probeの失敗などが記録されていることが多い。

4.2. コンテナの「生の声」を聞く `kubectl logs`

Podが `Running` になっていても、アプリケーションがエラーを起こしている可能性は十分にある。

  • 最新ログの確認:

kubectl logs <問題のPod名> -n <問題のNamespace>

エラーメッセージが出ていないか?

  • リアルタイムログでの確認:

kubectl logs -f <問題のPod名> -n <問題のNamespace>

アプリケーションの動作をリアルタイムで追いながら、どこで問題が発生しているのかを特定する。

  • クラッシュ原因の究明 (`–previous`):

kubectl logs –previous <問題のPod名> -n <問題のNamespace>

`CrashLoopBackOff` になっているPodの原因究明には必須。

4.3. Pod間の通信やServiceの疎通確認 `kubectl exec` & `kubectl port-forward`

Podは動いている、ログも異常なし。でも、他のPodからアクセスできない、あるいは外部からアクセスできない。そんな時は、ネットワーク周りの問題が疑われる。

  • コンテナ内から疎通確認:

まずは、問題のPod、あるいは通信元となるPodのコンテナに入り、`ping` や `curl` コマンドで疎通確認を行う。

# 問題のPodのコンテナにログイン
kubectl exec -it <問題のPod名> -n <問題のNamespace> — bash

# コンテナ内でcurlを実行
curl http://<別のPodのIPアドレス>:<ポート番号>
curl http://..svc.cluster.local:<ポート番号>

コンテナ内に `curl` や `ping` がない場合は、`busybox` などの軽量イメージでPodを一時的に作成して試す、という手もある。

  • ローカルからPodにアクセスして確認 (`kubectl port-forward`):

ローカル開発環境から、Kubernetesクラスタ内のPodに一時的にアクセスしたい場合や、Podに直接デバッグ用のポートフォワーディングをしたい場合に便利だ。

# ローカルの8080ポートを、Podの80ポートに転送
kubectl port-forward pod/<問題のPod名> 8080:80 -n <問題のNamespace>

このコマンドを実行したターミナルを開いたままにしておけば、ローカルの `localhost:8080` 経由でPodの80ポートにアクセスできる。

curl http://localhost:8080

Serviceに対しても同様にポートフォワーディングできる。

kubectl port-forward service/ 8080:80 -n <問題のNamespace>

4.4. Nodeの状態確認 `kubectl get nodes` & `kubectl describe node`

Podが `Pending` のままだったり、Podが `Unknown` 状態になっていたりする場合、Node自体の問題が考えられる。

  • Nodeの状態確認:

kubectl get nodes
kubectl get nodes -o wide # IPアドレスなども表示

`NotReady` になっているNodeはないか?

  • Nodeの詳細とイベント確認:

kubectl describe node <問題のNode名>

`Conditions` や `Events` セクションに、Nodeの異常を示す情報(ディスク容量不足、メモリ不足、Kubeletの停止など)が記録されていることがある。

4.5. デプロイメントの履歴と状態確認 `kubectl rollout status` & `kubectl rollout history`

ローリングアップデートがうまくいっていない、あるいは、いつから問題が発生したのかを調べる際に役立つ。

  • デプロイメントの現在の進行状況を確認:

kubectl rollout status deployment/ -n

ローリングアップデートが完了したか、あるいはどこかで詰まっているかを確認できる。

  • デプロイメントの履歴を確認:

kubectl rollout history deployment/ -n

いつ、どのような変更が行われたかの履歴を確認できる。ロールバックの判断材料になる。

—

まとめ:kubectlマスターへの道は、実践の中にあり!

どうだったかな? 今回は、Kubernetesを日々使う上で「これだけは押さえておきたい!」というkubectlの基本コマンドと、トラブルシューティングに役立つコマンドを、実例を交えながら解説してみた。

  • `kubectl get`: リソースの「全体像」を把握する。
  • `kubectl describe`: リソースの「詳細」と「イベント」を深掘りする。
  • `kubectl logs`: コンテナの「生の声」を聞く。
  • `kubectl exec`: コンテナの中に入り込んで「直接調査」する。
  • `kubectl apply`, `kubectl set image`, `kubectl rollout undo`: アプリケーションの「更新」と「復旧」を安全に行う。
  • `kubectl port-forward`, `kubectl rollout status`, `kubectl rollout history`: トラブルシューティングの「強力な武器」となる。

これらのコマンドは、単に覚えるだけでなく、実際に手を動かして、様々な状況で使ってみることが何よりも大切だ。まずは、手元の開発環境で、色々なリソースを作ったり消したり、Podを意図的に壊してみたりして、これらのコマンドがどう反応するかを試してみてほしい。

君たちがこれらのコマンドを使いこなせるようになれば、Kubernetesの運用が格段に楽になるだけでなく、日々の開発プロセスにおいても、より自信を持って、そして迅速に対応できるようになるはずだ。

さあ、君たちのKubernetesマスターへの道は、ここから始まる! 応援しているよ!

タイトルとURLをコピーしました