k9s
k9s 完全ガイド — ターミナルベース Kubernetes UI の全貌
本ドキュメントは SRE エンジニア向けに、k9s の機能・設定・運用ノウハウを網羅的に解説する技術記事です。
目次
- k9s とは何か
- インストール方法
- コアコンセプト
- 設定ファイル詳解
- ナビゲーションとビュー
- リソース別キー操作
- ログ表示機能
- ポートフォワード
- フィルタリングと検索
- Pulses ビュー
- XRay ビュー
- Popeye 統合
- ベンチマーク機能
- プラグインシステム
- スキンとテーマ
- マルチクラスタ管理
- 他ツールとの比較
- Tips & Tricks
- SRE ベストプラクティス
1. k9s とは何か
1.1 概要
k9s は、Kubernetes クラスタをターミナルから直感的に操作・監視するためのオープンソースツールである。Go 言語で実装されており、Vim スタイルのキーバインドによる高速ナビゲーション、リアルタイムのリソース監視、そして豊富なカスタマイズ機能を備えている。
従来、Kubernetes クラスタの操作には kubectl コマンドを逐一入力する必要があったが、k9s はそれを TUI (Terminal User Interface) として抽象化し、マウス不要のキーボードドリブンな操作体験を提供する。
1.2 主な特徴
| 特徴 | 説明 |
|---|---|
| リアルタイム監視 | クラスタリソースの状態をリアルタイムに表示。デフォルト2秒ごとに自動更新 |
| Vim スタイル操作 | j/k による上下移動、/ による検索、: によるコマンドモードなど |
| マルチクラスタ対応 | kubeconfig に定義された複数クラスタ間をシームレスに切り替え |
| 豊富なリソースビュー | Pod、Deployment、Service、Node、ConfigMap、Secret、CRD など幅広いリソースに対応 |
| プラグインシステム | カスタムコマンドを定義して機能を拡張可能 |
| スキン/テーマ | 配色をカスタマイズ可能。暗い背景・明るい背景に対応 |
| ログビューア | Pod ログのリアルタイム表示、検索、マルチコンテナ対応 |
| ポートフォワード | GUI 不要で Pod/Service へのポートフォワードを管理 |
1.3 なぜ k9s が必要か
SRE エンジニアの日常業務では、以下のようなタスクが頻繁に発生する。
- 障害発生時のPod ステータス確認とログ調査
- デプロイメントのスケーリングとロールバック
- ノードの状態確認とメンテナンス操作
- ConfigMap / Secret の確認と編集
- リソース使用量のモニタリング
これらすべてを kubectl コマンドで行うと、コマンドの入力・出力の確認に多くの時間を費やすことになる。k9s はこれらの操作を数キーストロークで完了させ、SRE の生産性を大幅に向上させる。
1.4 アーキテクチャ概要
+--------------------------------------------------+
| k9s TUI |
| +--------------------------------------------+ |
| | Header (Context / Cluster / Namespace) | |
| +--------------------------------------------+ |
| | Command Bar (:pods, :deploy, :svc ...) | |
| +--------------------------------------------+ |
| | | |
| | Resource Table View | |
| | (リアルタイム更新) | |
| | | |
| | NAME READY STATUS RESTARTS AGE | |
| | nginx-abc 1/1 Running 0 5m | |
| | redis-xyz 1/1 Running 0 10m | |
| | | |
| +--------------------------------------------+ |
| | Filter Bar (/ で検索モード) | |
| +--------------------------------------------+ |
| | Footer (キーバインドヘルプ) | |
| +--------------------------------------------+ |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| Kubernetes API Server |
| (kubeconfig 経由で接続) |
+--------------------------------------------------+
k9s は kubeconfig ファイル(通常 ~/.kube/config)を読み込み、Kubernetes API サーバーと通信する。すべてのリソース情報は API サーバーから取得され、k9s のインメモリキャッシュに保持される。画面の更新は設定可能なリフレッシュレート(デフォルト2秒)で行われる。
2. インストール方法
2.1 Homebrew (macOS / Linux)
最も簡単なインストール方法である。
# macOS
brew install derailed/k9s/k9s
# または
brew install k9s
# アップデート
brew upgrade k9s
2.2 バイナリダウンロード
GitHub Releases ページから直接バイナリをダウンロードする方法。
# Linux (amd64)
curl -sL https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz | tar xz -C /usr/local/bin k9s
# macOS (arm64 / Apple Silicon)
curl -sL https://github.com/derailed/k9s/releases/latest/download/k9s_Darwin_arm64.tar.gz | tar xz -C /usr/local/bin k9s
# macOS (amd64 / Intel)
curl -sL https://github.com/derailed/k9s/releases/latest/download/k9s_Darwin_amd64.tar.gz | tar xz -C /usr/local/bin k9s
# 実行権限の付与(必要に応じて)
chmod +x /usr/local/bin/k9s
2.3 Go Install
Go の開発環境がある場合、go install で直接ビルドできる。
go install github.com/derailed/k9s@latest
# GOPATH/bin にパスが通っていることを確認
export PATH=$PATH:$(go env GOPATH)/bin
2.4 Docker
Docker コンテナ内で k9s を実行する方法。kubeconfig をマウントして使う。
docker run --rm -it \
-v $HOME/.kube/config:/root/.kube/config \
quay.io/derailed/k9s
特定のコンテキストを指定して起動する場合:
docker run --rm -it \
-v $HOME/.kube/config:/root/.kube/config \
quay.io/derailed/k9s --context my-cluster
2.5 各種パッケージマネージャ
# Arch Linux (pacman)
pacman -S k9s
# Windows (Chocolatey)
choco install k9s
# Windows (Scoop)
scoop install k9s
# Snap
sudo snap install k9s --devmode
# MacPorts
sudo port install k9s
# Nix
nix-env -iA nixpkgs.k9s
2.6 インストール確認
# バージョン確認
k9s version
# 出力例
# ____ __.________
# | |/ _/ __ \______
# | < \____ / ___/
# | | \ / /\___ \
# |____|__ \ /____//____ >
# \/ \/
#
# Version: v0.32.5
# Commit: abc1234
# Date: 2024-01-15
2.7 起動オプション
# 基本起動
k9s
# 特定のコンテキストで起動
k9s --context production-cluster
# 特定のネームスペースで起動
k9s -n kube-system
# 特定のリソースビューで起動
k9s --command pods
# 読み取り専用モードで起動
k9s --readonly
# ヘッドレスモード(ヘッダー非表示)
k9s --headless
# 全ネームスペースを表示して起動
k9s -A
# ログレベルを指定して起動(デバッグ用)
k9s -l debug
# kubeconfig ファイルを指定
k9s --kubeconfig /path/to/kubeconfig
# クラスタ情報を表示して起動
k9s info
3. コアコンセプト
3.1 リソースビューモデル
k9s のインターフェースは「ビュー」という概念を中心に構成されている。各ビューは特定の Kubernetes リソースタイプに対応し、テーブル形式でリソース一覧を表示する。
┌─────────────────────────────────────────────────────┐
│ Context: prod-cluster Cluster: prod NS: default│
├─────────────────────────────────────────────────────┤
│ Pods(default) [20] <namespace> │
├─────────────────────────────────────────────────────┤
│ NAME READY STATUS RESTARTS AGE CPU│
│▶ api-server-1 2/2 Running 0 2d 50m│
│ api-server-2 2/2 Running 0 2d 45m│
│ worker-abc 1/1 Running 3 5d 20m│
│ redis-master 1/1 Running 0 10d 10m│
│ nginx-proxy 1/1 Running 0 1d 5m │
├─────────────────────────────────────────────────────┤
│ /filter │
├─────────────────────────────────────────────────────┤
│ <d>describe <l>logs <s>shell <y>yaml <e>edit │
│ <ctrl-d>delete <shift-f>port-forward │
└─────────────────────────────────────────────────────┘
3.2 コマンドモード(: プレフィックス)
: キーを押すと、コマンドモードに入る。ここでリソースタイプを入力してビューを切り替える。
| コマンド | 説明 | エイリアス |
|---|---|---|
:pods | Pod ビュー | :po |
:deployments | Deployment ビュー | :dp, :deploy |
:services | Service ビュー | :svc |
:nodes | Node ビュー | :no |
:namespaces | Namespace ビュー | :ns |
:configmaps | ConfigMap ビュー | :cm |
:secrets | Secret ビュー | :sec |
:statefulsets | StatefulSet ビュー | :sts |
:daemonsets | DaemonSet ビュー | :ds |
:replicasets | ReplicaSet ビュー | :rs |
:jobs | Job ビュー | :job |
:cronjobs | CronJob ビュー | :cj |
:ingresses | Ingress ビュー | :ing |
:persistentvolumes | PV ビュー | :pv |
:persistentvolumeclaims | PVC ビュー | :pvc |
:storageclasses | StorageClass ビュー | :sc |
:events | Event ビュー | :ev |
:contexts | Context ビュー | :ctx |
:aliases | エイリアス一覧 | :alias |
:popeye | Popeye サニタイザー | :pop |
:pulses | Pulses ビュー | :pu |
:xray | XRay ビュー | :xr |
:rbac | RBAC ビュー | なし |
:clusterroles | ClusterRole | :cr |
:clusterrolebindings | ClusterRoleBinding | :crb |
:roles | Role | :ro |
:rolebindings | RoleBinding | :rb |
:serviceaccounts | ServiceAccount | :sa |
:networkpolicies | NetworkPolicy | :np |
:horizontalpodautoscalers | HPA | :hpa |
:verticalpodautoscalers | VPA | :vpa |
:helm | Helm リリース | なし |
:portforwards | PF 管理 | :pf |
:screendumps | スクリーンダンプ | :sd |
:references | リファレンス | :ref |
3.3 フィルタモード(/ プレフィックス)
/ キーを押すとフィルタモードに入り、表示されているリソースをリアルタイムに絞り込める。
/nginx → 名前に「nginx」を含むリソースを表示
/!nginx → 「nginx」を含まないリソースを表示(逆フィルタ)
/-l app=web → ラベル app=web を持つリソースを表示
/-f status=run → フィールドセレクタによるフィルタ
/Running → STATUS 列に「Running」を含むリソースを表示
3.4 Vim スタイルキーバインド
k9s は Vim ユーザーに馴染みのあるキーバインドを採用している。
| キー | 動作 |
|---|---|
j / ↓ | 下に移動 |
k / ↑ | 上に移動 |
g | リストの先頭に移動 |
G | リストの末尾に移動 |
Enter | 選択/詳細表示 |
Esc | 前の画面に戻る / フィルタクリア |
/ | フィルタモード |
: | コマンドモード |
? | キーバインドヘルプ表示 |
Ctrl-a | 全リソースの表示切り替え |
q | 終了 / 前の画面に戻る |
Ctrl-c | k9s を終了 |
3.5 ネームスペースの切り替え
k9s では、現在表示しているリソースのネームスペーススコープを簡単に変更できる。
数字キーによるネームスペース切り替え:
0 → 全ネームスペースを表示
1 → default ネームスペース
2 → kube-system ネームスペース
3 → 設定で定義した任意のネームスペース
...
:namespace コマンドでネームスペース一覧を表示し、Enter で選択することも可能。
4. 設定ファイル詳解
k9s の設定ファイルは以下のディレクトリに配置される。
- macOS:
~/Library/Application Support/k9s/または$XDG_CONFIG_HOME/k9s/ - Linux:
~/.config/k9s/ - Windows:
%LOCALAPPDATA%\k9s\
4.1 config.yaml — メイン設定
config.yaml は k9s の全般的な動作を制御する設定ファイルである。
# config.yaml
k9s:
# リフレッシュレート(秒)
refreshRate: 2
# 最大接続リトライ回数
maxConnRetry: 5
# 読み取り専用モード
readOnly: false
# 変更確認ダイアログの表示
noExitOnCtrlC: false
# UI 設定
ui:
# 有効なスキン名
skin: dracula
# ヘッダーレスモード
enableMouse: false
headless: false
# ロゴ表示
logoless: false
# Crumbsの表示
crumbsless: false
# リソースカウント表示
noIcons: false
# スクリーンダンプの保存先
screenDumpDir: /tmp/k9s-screens
# ログ設定
logger:
# ログの表示行数
tail: 100
# バッファサイズ
buffer: 5000
# テキストの折り返し
textWrap: false
# タイムスタンプの表示
showTime: false
# ログをファイルに出力
sinceSeconds: 60
# 全コンテナログの表示
fullScreen: false
# 現在のコンテキスト
currentContext: production-cluster
# 現在のクラスタ
currentCluster: production-cluster
# クラスタ固有の設定
clusters:
production-cluster:
namespace:
# アクティブネームスペース
active: default
# ロックされたネームスペース(切り替え不可)
locked: false
# お気に入りネームスペース
favorites:
- default
- kube-system
- monitoring
- ingress-nginx
view:
# 起動時に表示するリソース
active: pod
# 機能ゲート
featureGates:
# ノードシェルの有効化
nodeShell: false
# シェル設定
shellPod:
image: busybox:1.35.0
namespace: default
limits:
cpu: 100m
memory: 100Mi
# ポートフォワードアドレス
portForwardAddress: localhost
staging-cluster:
namespace:
active: default
favorites:
- default
- staging
view:
active: pod
# スレッショルド設定(リソース使用量の色分け)
thresholds:
cpu:
critical: 90
warn: 70
memory:
critical: 90
warn: 70
4.2 skin.yaml — テーマ・配色設定
skin.yaml で k9s の外観をカスタマイズできる。
# skin.yaml — Dracula テーマの例
k9s:
body:
fgColor: "#f8f8f2"
bgColor: "#282a36"
logoColor: "#bd93f9"
prompt:
fgColor: "#f8f8f2"
bgColor: "#282a36"
suggestColor: "#bd93f9"
info:
fgColor: "#ff79c6"
sectionColor: "#f8f8f2"
dialog:
fgColor: "#f8f8f2"
bgColor: "#282a36"
buttonFgColor: "#f8f8f2"
buttonBgColor: "#bd93f9"
buttonFocusFgColor: "#f8f8f2"
buttonFocusBgColor: "#ff79c6"
labelFgColor: "#8be9fd"
fieldFgColor: "#f8f8f2"
frame:
border:
fgColor: "#6272a4"
focusColor: "#bd93f9"
menu:
fgColor: "#f8f8f2"
keyColor: "#ff79c6"
numKeyColor: "#50fa7b"
crumbs:
fgColor: "#f8f8f2"
bgColor: "#44475a"
activeColor: "#bd93f9"
title:
fgColor: "#bd93f9"
bgColor: "#282a36"
highlightColor: "#f1fa8c"
counterColor: "#ff79c6"
filterColor: "#50fa7b"
status:
newColor: "#8be9fd"
modifyColor: "#f1fa8c"
addColor: "#50fa7b"
pendingColor: "#ff79c6"
errorColor: "#ff5555"
highlightColor: "#f1fa8c"
killColor: "#6272a4"
completedColor: "#50fa7b"
views:
table:
fgColor: "#f8f8f2"
bgColor: "#282a36"
cursorFgColor: "#282a36"
cursorBgColor: "#44475a"
markColor: "#ffb86c"
header:
fgColor: "#6272a4"
bgColor: "#282a36"
sorterColor: "#8be9fd"
xray:
fgColor: "#f8f8f2"
bgColor: "#282a36"
cursorColor: "#44475a"
graphicColor: "#bd93f9"
showIcons: false
yaml:
keyColor: "#ff79c6"
colonColor: "#f8f8f2"
valueColor: "#50fa7b"
logs:
fgColor: "#f8f8f2"
bgColor: "#282a36"
indicator:
fgColor: "#f8f8f2"
bgColor: "#bd93f9"
toggleOnColor: "#50fa7b"
toggleOffColor: "#ff5555"
4.3 plugin.yaml — プラグイン設定
# plugin.yaml
plugins:
# Pod のログを stern で表示
stern:
shortCut: Shift-L
description: "Stern ログビューア"
scopes:
- pods
command: stern
background: false
args:
- --tail
- "50"
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
# Pod の YAML を kubectl で表示
get-yaml:
shortCut: Shift-Y
description: "kubectl で YAML を取得"
scopes:
- pods
- deployments
- services
command: kubectl
background: false
args:
- get
- $RESOURCE_NAME
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
- -o
- yaml
# Pod のリソース使用量を表示
resource-usage:
shortCut: Shift-T
description: "Pod リソース使用量"
scopes:
- pods
command: kubectl
background: false
args:
- top
- pod
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
- --containers
# ノードのデバッグシェル
debug-node:
shortCut: Shift-D
description: "ノードデバッグシェル"
scopes:
- nodes
command: kubectl
background: false
args:
- debug
- node/$NAME
- -it
- --image=busybox:1.35.0
- --context
- $CONTEXT
# Pod を jq でフィルタリング
jq-filter:
shortCut: Shift-J
description: "jq でPod情報をフィルタ"
scopes:
- pods
command: sh
background: false
args:
- -c
- "kubectl get pod $NAME -n $NAMESPACE --context $CONTEXT -o json | jq '.status.conditions'"
# イメージのセキュリティスキャン
trivy-scan:
shortCut: Shift-V
description: "Trivy イメージスキャン"
scopes:
- pods
command: sh
background: false
args:
- -c
- "kubectl get pod $NAME -n $NAMESPACE --context $CONTEXT -o jsonpath='{.spec.containers[0].image}' | xargs trivy image"
# Pod の Events だけ表示
pod-events:
shortCut: Shift-E
description: "Pod Events"
scopes:
- pods
command: sh
background: false
args:
- -c
- "kubectl get events --field-selector involvedObject.name=$NAME -n $NAMESPACE --context $CONTEXT --sort-by='.lastTimestamp'"
4.4 hotkey.yaml — ホットキー設定
# hotkey.yaml
hotKeys:
# Shift-1 で Pod ビューに切り替え
shift-1:
shortCut: Shift-1
description: "Pod ビュー"
command: pods
# Shift-2 で Deployment ビューに切り替え
shift-2:
shortCut: Shift-2
description: "Deployment ビュー"
command: deployments
# Shift-3 で Service ビューに切り替え
shift-3:
shortCut: Shift-3
description: "Service ビュー"
command: services
# Shift-4 で Node ビューに切り替え
shift-4:
shortCut: Shift-4
description: "Node ビュー"
command: nodes
# Shift-5 で Event ビューに切り替え
shift-5:
shortCut: Shift-5
description: "Event ビュー"
command: events
# Shift-6 で ConfigMap ビューに切り替え
shift-6:
shortCut: Shift-6
description: "ConfigMap ビュー"
command: configmaps
# Shift-7 で Namespace ビューに切り替え
shift-7:
shortCut: Shift-7
description: "Namespace ビュー"
command: namespaces
# Shift-8 で HPA ビューに切り替え
shift-8:
shortCut: Shift-8
description: "HPA ビュー"
command: hpa
# Shift-9 で CronJob ビューに切り替え
shift-9:
shortCut: Shift-9
description: "CronJob ビュー"
command: cronjobs
# Shift-0 で Pulses ビューに切り替え
shift-0:
shortCut: Shift-0
description: "Pulses ビュー"
command: pulses
4.5 aliases.yaml — エイリアス設定
# aliases.yaml
aliases:
# カスタムエイリアス
pp: v1/pods
dd: apps/v1/deployments
ss: v1/services
nn: v1/nodes
cm: v1/configmaps
sec: v1/secrets
ing: networking.k8s.io/v1/ingresses
sa: v1/serviceaccounts
np: networking.k8s.io/v1/networkpolicies
pdb: policy/v1/poddisruptionbudgets
# CRD のエイリアス(例: Istio VirtualService)
vs: networking.istio.io/v1beta1/virtualservices
dr: networking.istio.io/v1beta1/destinationrules
gw: networking.istio.io/v1beta1/gateways
# CRD のエイリアス(例: cert-manager)
cert: cert-manager.io/v1/certificates
issuer: cert-manager.io/v1/issuers
cissuer: cert-manager.io/v1/clusterissuers
# CRD のエイリアス(例: Argo CD)
app: argoproj.io/v1alpha1/applications
appset: argoproj.io/v1alpha1/applicationsets
# CRD のエイリアス(例: Prometheus Operator)
prom: monitoring.coreos.com/v1/prometheuses
sm: monitoring.coreos.com/v1/servicemonitors
pm: monitoring.coreos.com/v1/podmonitors
ar: monitoring.coreos.com/v1/alertmanagers
pr: monitoring.coreos.com/v1/prometheusrules
5. ナビゲーションとビュー
5.1 クラスタビュー
k9s 起動後、:ctx コマンドでクラスタコンテキスト一覧を表示できる。
┌──────────────────────────────────────────────────────┐
│ Contexts │
├──────────────────────────────────────────────────────┤
│ NAME CLUSTER AUTHINFO │
│▶production-cluster prod-k8s-cluster admin-user │
│ staging-cluster stg-k8s-cluster admin-user │
│ development-cluster dev-k8s-cluster dev-user │
│ monitoring-cluster mon-k8s-cluster admin-user │
├──────────────────────────────────────────────────────┤
│ Enter でコンテキスト切り替え │
└──────────────────────────────────────────────────────┘
Enterで選択したコンテキストに切り替え- 切り替え後は、そのクラスタのデフォルトネームスペースが表示される
5.2 ネームスペースビュー
:ns コマンドでネームスペース一覧を表示する。
┌──────────────────────────────────────────────────────┐
│ Namespaces [12] │
├──────────────────────────────────────────────────────┤
│ NAME STATUS AGE │
│▶default Active 365d │
│ kube-system Active 365d │
│ kube-public Active 365d │
│ monitoring Active 200d │
│ ingress-nginx Active 180d │
│ cert-manager Active 150d │
│ argocd Active 120d │
│ istio-system Active 100d │
│ app-production Active 90d │
│ app-staging Active 90d │
│ logging Active 60d │
│ database Active 30d │
├──────────────────────────────────────────────────────┤
│ <Enter> 選択 <d> describe <y> yaml │
└──────────────────────────────────────────────────────┘
5.3 Pod ビュー
最も頻繁に使用するビュー。:pods または :po で表示する。
┌──────────────────────────────────────────────────────────────────────┐
│ Pods(all) [42] CPU MEM│
├──────────────────────────────────────────────────────────────────────┤
│ NAMESPACE NAME READY STATUS RESTARTS AGE │
│ default api-srv-6b8d9-abc12 2/2 Running 0 5d │
│ default api-srv-6b8d9-def34 2/2 Running 0 5d │
│ default worker-7c4e8-ghi56 1/1 Running 2 10d │
│ default redis-master-0 1/1 Running 0 30d │
│ kube-system coredns-5c98db-jkl78 1/1 Running 0 90d │
│ kube-system etcd-master-1 1/1 Running 0 90d │
│ monitoring prometheus-0 2/2 Running 0 7d │
│ monitoring grafana-abc12 1/1 Running 0 7d │
│ ingress-nginx nginx-ctrl-mno90 1/1 Running 0 3d │
├──────────────────────────────────────────────────────────────────────┤
│ <l>logs <s>shell <d>desc <y>yaml <e>edit <Shift-F>pf <c>copy │
└──────────────────────────────────────────────────────────────────────┘
Pod の STATUS カラーコード:
- 緑: Running(正常稼働)
- 黄: Pending, ContainerCreating(起動中)
- 赤: CrashLoopBackOff, Error, OOMKilled(異常)
- 灰: Completed, Terminated(終了済み)
5.4 Deployment ビュー
:deploy または :dp で Deployment ビューを表示する。
┌──────────────────────────────────────────────────────────────────────┐
│ Deployments(default) [8] │
├──────────────────────────────────────────────────────────────────────┤
│ NAME READY UP-TO-DATE AVAILABLE AGE LABELS │
│ api-server 3/3 3 3 30d app=api │
│ web-frontend 2/2 2 2 30d app=web │
│ worker 5/5 5 5 25d app=worker │
│ redis 1/1 1 1 60d app=redis │
│ nginx-proxy 2/2 2 2 15d app=nginx │
│ batch-job 1/1 1 1 10d app=batch │
│ cache-service 3/3 3 3 20d app=cache │
│ auth-service 2/2 2 2 45d app=auth │
├──────────────────────────────────────────────────────────────────────┤
│ <Enter>pods <d>desc <s>scale <r>restart <y>yaml <e>edit │
│ <b>rollback │
└──────────────────────────────────────────────────────────────────────┘
5.5 Service ビュー
:svc で Service ビューを表示する。
┌──────────────────────────────────────────────────────────────────────┐
│ Services(default) [6] │
├──────────────────────────────────────────────────────────────────────┤
│ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) │
│ api-server ClusterIP 10.0.0.100 <none> 8080 │
│ web-frontend LoadBalancer 10.0.0.101 203.0.113.10 80,443 │
│ redis ClusterIP 10.0.0.102 <none> 6379 │
│ nginx-proxy NodePort 10.0.0.103 <none> 80:31234│
│ cache-service ClusterIP 10.0.0.104 <none> 11211 │
│ auth-service ClusterIP 10.0.0.105 <none> 9090 │
├──────────────────────────────────────────────────────────────────────┤
│ <d>desc <y>yaml <Shift-F>port-forward │
└──────────────────────────────────────────────────────────────────────┘
5.6 Node ビュー
:no で Node ビューを表示する。
┌──────────────────────────────────────────────────────────────────────────┐
│ Nodes [5] CPU% MEM% │
├──────────────────────────────────────────────────────────────────────────┤
│ NAME STATUS ROLES VERSION CPU MEM PODS │
│ master-1 Ready control-plane v1.28.0 45% 60% 32/110 │
│ master-2 Ready control-plane v1.28.0 40% 55% 28/110 │
│ worker-1 Ready <none> v1.28.0 70% 75% 45/110 │
│ worker-2 Ready <none> v1.28.0 65% 70% 42/110 │
│ worker-3 Ready <none> v1.28.0 30% 45% 20/110 │
├──────────────────────────────────────────────────────────────────────────┤
│ <d>desc <y>yaml <c>cordon <u>uncordon <r>drain │
└──────────────────────────────────────────────────────────────────────────┘
5.7 ConfigMap / Secret ビュー
:cm で ConfigMap、:sec で Secret を表示する。
ConfigMap ビュー:
┌──────────────────────────────────────────────────────┐
│ ConfigMaps(default) [5] │
├──────────────────────────────────────────────────────┤
│ NAME DATA AGE │
│ app-config 8 30d │
│ nginx-config 3 15d │
│ prometheus-config 12 7d │
│ grafana-dashboards 5 7d │
│ fluent-bit-config 4 10d │
├──────────────────────────────────────────────────────┤
│ <d>desc <y>yaml <e>edit <u>use(show data) │
└──────────────────────────────────────────────────────┘
Secret ビュー:
┌──────────────────────────────────────────────────────┐
│ Secrets(default) [8] │
├──────────────────────────────────────────────────────┤
│ NAME TYPE DATA AGE│
│ db-credentials Opaque 3 60d│
│ tls-certificate kubernetes.io/tls 2 30d│
│ docker-registry kubernetes.io/docker.. 1 90d│
│ api-token Opaque 1 45d│
│ oauth-secret Opaque 4 20d│
├──────────────────────────────────────────────────────┤
│ <d>desc <x>decode <y>yaml <e>edit │
│ Secret の decode(x) で Base64 デコード値を表示 │
└──────────────────────────────────────────────────────┘
5.8 Event ビュー
:ev で Event ビューを表示する。障害調査時に非常に有用。
┌──────────────────────────────────────────────────────────────────────────┐
│ Events(all) [156] │
├──────────────────────────────────────────────────────────────────────────┤
│ NAMESPACE LAST SEEN TYPE REASON OBJECT MSG │
│ default 2m Warning BackOff pod/api-srv-abc Back..│
│ default 5m Normal Scheduled pod/worker-xyz Succ..│
│ default 5m Normal Pulling pod/worker-xyz Pull..│
│ default 5m Normal Created pod/worker-xyz Crea..│
│ default 5m Normal Started pod/worker-xyz Star..│
│ kube-system 10m Warning NodeNotReady node/worker-2 Node..│
│ monitoring 15m Normal ScalingReplicaS deploy/prom Scal..│
├──────────────────────────────────────────────────────────────────────────┤
│ /Warning で Warning イベントだけフィルタ可能 │
└──────────────────────────────────────────────────────────────────────────┘
5.9 RBAC ビュー
:rbac でクラスタの RBAC 設定を確認できる。
RBAC 関連リソース:
:clusterroles → ClusterRole 一覧
:clusterrolebindings → ClusterRoleBinding 一覧
:roles → Role 一覧(ネームスペーススコープ)
:rolebindings → RoleBinding 一覧
:serviceaccounts → ServiceAccount 一覧
各リソースで Enter を押すとポリシールール詳細が表示される。
5.10 CRD / カスタムリソースビュー
k9s はクラスタにインストールされている CRD (Custom Resource Definition) を自動検出し、表示可能。
# CRD 一覧を表示
:crd
# 特定の CRD リソースを表示(エイリアス設定済みの場合)
:vs # Istio VirtualService
:cert # cert-manager Certificate
:app # ArgoCD Application
# API グループ/バージョン付きで直接指定
:networking.istio.io/v1beta1/virtualservices
6. リソース別キー操作
6.1 Pod 操作
Pod は k9s で最も操作頻度が高いリソースである。以下のキーバインドが利用可能。
| キー | 操作 | 説明 |
|---|---|---|
l | ログ表示 | Pod のログをリアルタイム表示。マルチコンテナの場合、コンテナ選択画面が表示される |
s | シェル接続 | Pod 内のコンテナにシェル接続(exec)。コンテナ選択後 /bin/sh で接続 |
d | Describe | kubectl describe pod 相当の詳細情報を表示 |
y | YAML 表示 | Pod の完全な YAML 定義を表示 |
e | 編集 | Pod の定義を $EDITOR で編集(通常は変更不可だがアノテーション等は編集可能) |
Shift-F | ポートフォワード | Pod へのポートフォワードを設定 |
Ctrl-D | 削除 | Pod を削除(確認ダイアログあり) |
c | コピー | Pod 名をクリップボードにコピー |
Enter | コンテナ詳細 | Pod 内のコンテナ一覧を表示 |
Ctrl-K | Kill | Pod を強制削除(Grace Period なし) |
f | ポートフォワード表示 | アクティブなポートフォワード一覧を表示 |
Shift-R | ソート切り替え | 各列でのソートを切り替え |
a | アタッチ | 実行中のコンテナにアタッチ |
Ctrl-W | トグル幅 | 列幅を切り替え(ワイド表示) |
ログ表示の詳細操作:
Pod ログ表示中のキー操作:
┌──────────────────────────────────────────────────────┐
│ Logs: pod/api-server-abc12 [container: app] │
├──────────────────────────────────────────────────────┤
│ 2024-01-15 10:00:01 INFO Starting server... │
│ 2024-01-15 10:00:02 INFO Listening on :8080 │
│ 2024-01-15 10:05:30 WARN Slow query detected: 2.5s │
│ 2024-01-15 10:10:45 ERROR Connection timeout to DB │
│ 2024-01-15 10:10:46 INFO Retrying connection... │
│ 2024-01-15 10:10:48 INFO Connection restored │
├──────────────────────────────────────────────────────┤
│ <s>Toggle auto-scroll <w>Toggle wrap │
│ <t>Toggle timestamp <f>Full screen │
│ </>Search <n>Next match <N>Prev match │
│ <0>All containers <1-9>Select container │
│ <c>Copy <Ctrl-S>Save to file │
│ <g>Top <G>Bottom │
└──────────────────────────────────────────────────────┘
シェル接続(exec)の流れ:
1. Pod ビューで対象 Pod を選択
2. 's' キーを押す
3. マルチコンテナの場合、コンテナ選択ダイアログが表示
4. シェルが起動(デフォルト: /bin/sh)
5. 通常のシェル操作が可能
6. exit または Ctrl-D でシェルを終了し k9s に戻る
注意: シェルのデフォルトコマンドは config.yaml で変更可能
shellPod:
command: ["/bin/bash"] # bash を使用
6.2 Deployment 操作
| キー | 操作 | 説明 |
|---|---|---|
Enter | Pod 一覧 | この Deployment が管理する Pod の一覧を表示 |
d | Describe | Deployment の詳細情報を表示 |
y | YAML 表示 | 完全な YAML 定義を表示 |
e | 編集 | Deployment 定義を $EDITOR で編集 |
s | スケール | レプリカ数を変更するダイアログを表示 |
r | リスタート | Rolling restart を実行(kubectl rollout restart 相当) |
b | ロールバック | 前のリビジョンにロールバック |
Ctrl-D | 削除 | Deployment を削除 |
l | ログ表示 | Deployment 配下全 Pod のログを表示 |
スケーリングの流れ:
1. Deployment ビューで対象を選択
2. 's' キーを押す
3. スケールダイアログが表示される:
┌─────────────────────────┐
│ Scale Deployment │
│ │
│ Replicas: [3 ] │
│ │
│ [OK] [Cancel] │
└─────────────────────────┘
4. 新しいレプリカ数を入力して OK
5. リアルタイムでスケーリングの進行状況を確認可能
ロールバックの流れ:
1. Deployment ビューで対象を選択
2. 'b' キーを押す
3. ReplicaSet のリビジョン一覧が表示される
4. ロールバック先のリビジョンを選択して Enter
5. ロールバックが実行される
6.3 Service 操作
| キー | 操作 | 説明 |
|---|---|---|
d | Describe | Service の詳細情報を表示 |
y | YAML 表示 | 完全な YAML 定義を表示 |
e | 編集 | Service 定義を編集 |
Shift-F | ポートフォワード | Service へのポートフォワードを設定 |
Ctrl-D | 削除 | Service を削除 |
6.4 Node 操作
| キー | 操作 | 説明 |
|---|---|---|
d | Describe | Node の詳細情報を表示 |
y | YAML 表示 | 完全な YAML 定義を表示 |
c | Cordon | Node をスケジュール不可にする |
u | Uncordon | Node をスケジュール可能に戻す |
r | Drain | Node から Pod を退避(ドレイン) |
s | SSH | Node にシェルアクセス(nodeShell 有効時) |
ドレインの流れ:
1. Node ビューで対象ノードを選択
2. 'r'(drain)キーを押す
3. 確認ダイアログが表示される:
┌─────────────────────────────────┐
│ Drain Node: worker-2? │
│ │
│ --ignore-daemonsets=true │
│ --delete-emptydir-data=true │
│ │
│ [OK] [Cancel] │
└─────────────────────────────────┘
4. OK で drain 実行
5. 完了後、Node の STATUS が SchedulingDisabled に変わる
6.5 ConfigMap / Secret 操作
| キー | 操作 | 説明 |
|---|---|---|
d | Describe | 詳細情報を表示 |
y | YAML 表示 | 完全な YAML 定義を表示 |
e | 編集 | データを $EDITOR で編集 |
u | Use/Data表示 | ConfigMap/Secret のデータ内容を表示 |
x | Decode | Secret の Base64 エンコードされた値をデコードして表示 |
Ctrl-D | 削除 | リソースを削除 |
Secret のデコード表示:
Secret ビューで 'x' を押すと:
┌──────────────────────────────────────────────────────┐
│ Decode: secret/db-credentials │
├──────────────────────────────────────────────────────┤
│ Key: username │
│ Value: admin │
│ │
│ Key: password │
│ Value: MyS3cretP@ssw0rd! │
│ │
│ Key: connection-string │
│ Value: postgresql://admin:MyS3cretP@ssw0rd!@db:5432/ │
├──────────────────────────────────────────────────────┤
│ <Esc> 戻る │
└──────────────────────────────────────────────────────┘
7. ログ表示機能
7.1 基本的なログ表示
Pod ビューで l キーを押すと、選択した Pod のログをリアルタイムに表示する。
ログ表示画面:
┌──────────────────────────────────────────────────────────────────────┐
│ Logs: pod/api-server-6b8d9-abc12 | container: app | Since: 1m │
├──────────────────────────────────────────────────────────────────────┤
│ 2024-01-15T10:00:01.123Z INFO [main] Starting API server v2.3.1 │
│ 2024-01-15T10:00:01.456Z INFO [main] Loading configuration... │
│ 2024-01-15T10:00:02.789Z INFO [main] Database connection pool: 10 │
│ 2024-01-15T10:00:03.012Z INFO [http] Listening on :8080 │
│ 2024-01-15T10:05:30.345Z WARN [db] Slow query: SELECT * FROM... │
│ 2024-01-15T10:05:30.345Z WARN [db] Duration: 2.5s │
│ 2024-01-15T10:10:45.678Z ERROR [db] Connection timeout │
│ 2024-01-15T10:10:45.679Z ERROR [db] Error: dial tcp 10.0.0.5:... │
│ 2024-01-15T10:10:46.000Z INFO [db] Retrying connection (1/3)... │
│ 2024-01-15T10:10:48.123Z INFO [db] Connection restored │
│ 2024-01-15T10:15:00.000Z INFO [http] GET /health 200 OK 2ms │
│ 2024-01-15T10:15:00.001Z INFO [http] GET /api/v1/users 200 OK 45ms│
│ ▼ auto-scroll ON │
├──────────────────────────────────────────────────────────────────────┤
│ <0>All <1>app <2>sidecar | <s>Scroll <w>Wrap <t>Time <f>Full │
│ </>Search <c>Copy <Ctrl-S>Save │
└──────────────────────────────────────────────────────────────────────┘
7.2 ログ表示のキーバインド
| キー | 操作 | 説明 |
|---|---|---|
s | オートスクロール | ログの自動スクロール ON/OFF を切り替え |
w | テキスト折り返し | 長い行の折り返し ON/OFF を切り替え |
t | タイムスタンプ | タイムスタンプの表示 ON/OFF を切り替え |
f | フルスクリーン | ログ表示をフルスクリーンに切り替え |
/ | 検索 | ログ内をテキスト検索 |
n | 次の一致 | 検索結果の次のマッチに移動 |
N | 前の一致 | 検索結果の前のマッチに移動 |
g | 先頭 | ログの先頭に移動 |
G | 末尾 | ログの末尾に移動 |
c | コピー | 表示中のログをクリップボードにコピー |
Ctrl-S | 保存 | ログをファイルに保存 |
0 | 全コンテナ | マルチコンテナの場合、全コンテナのログを表示 |
1-9 | コンテナ選択 | 特定のコンテナのログを選択表示 |
p | 前のコンテナ | 以前のコンテナインスタンスのログ(再起動前) |
Esc | 戻る | ログ画面を閉じて Pod ビューに戻る |
7.3 ログの Since 設定
ログの表示期間は config.yaml の sinceSeconds で設定する。
# config.yaml
k9s:
logger:
tail: 200 # 表示行数
buffer: 5000 # バッファサイズ
sinceSeconds: 300 # 5分間(300秒)のログを表示
textWrap: true # テキスト折り返し
showTime: true # タイムスタンプ表示
起動オプションでも指定可能:
# 直近10分のログを表示
k9s --logSinceSeconds 600
7.4 マルチコンテナのログ選択
サイドカーパターンなど、1つの Pod に複数のコンテナがある場合:
1. Pod を選択して 'l' を押す
2. コンテナ選択ダイアログが表示される:
┌─────────────────────────────┐
│ Select Container │
│ │
│ [1] app │
│ [2] sidecar-proxy │
│ [3] log-forwarder │
│ [0] ALL (全コンテナ) │
│ │
└─────────────────────────────┘
3. 数字キーでコンテナを選択
4. 表示中でも 0-9 キーでコンテナを切り替え可能
7.5 ログ内検索
ログ表示中に / を押して検索パターンを入力する。
/error → 「error」を含む行をハイライト
/ERROR|WARN → 正規表現によるOR検索
/timeout.*db → 正規表現パターン
/(?i)exception → 大文字小文字を区別しない検索
検索後:
n → 次のマッチに移動
N → 前のマッチに移動
Esc → 検索をクリア
7.6 ログのファイル保存
Ctrl-S を押すと、現在表示中のログがファイルに保存される。
保存先: $HOME/Library/Application Support/k9s/screen-dumps/
(macOS の場合)
または config.yaml で指定:
k9s:
screenDumpDir: /tmp/k9s-screens
ファイル名: <namespace>_<pod-name>_<timestamp>.log
例: default_api-server-abc12_2024-01-15T10-15-00.log
8. ポートフォワード
8.1 ポートフォワードの設定
Pod または Service に対してポートフォワードを設定できる。
Pod へのポートフォワード:
1. Pod ビューで対象 Pod を選択
2. Shift-F キーを押す
3. ポートフォワード設定ダイアログ:
┌──────────────────────────────────┐
│ Port Forward │
│ │
│ Container Port: 8080 │
│ Local Port: [8080 ] │
│ Address: [localhost] │
│ │
│ [OK] [Cancel] │
└──────────────────────────────────┘
4. ローカルポートを入力して OK
5. ポートフォワードが開始される
Service へのポートフォワード:
1. Service ビューで対象 Service を選択
2. Shift-F キーを押す
3. Service のポートが複数ある場合はポート選択が表示される
4. ローカルポートを指定して OK
8.2 ポートフォワードの管理
:pf または :portforwards でアクティブなポートフォワード一覧を表示する。
┌──────────────────────────────────────────────────────────────────────┐
│ PortForwards [3] │
├──────────────────────────────────────────────────────────────────────┤
│ NAMESPACE NAME PORT LOCALPORT URL │
│ default api-server-abc12 8080 8080 http://localhost:8080 │
│ default redis-master-0 6379 6379 localhost:6379 │
│ monitor grafana-xyz34 3000 3000 http://localhost:3000 │
├──────────────────────────────────────────────────────────────────────┤
│ <Ctrl-D>停止 <b>ベンチマーク <Enter>ブラウザで開く │
└──────────────────────────────────────────────────────────────────────┘
8.3 ベンチマーク
ポートフォワード画面で b キーを押すと、HTTP ベンチマークを実行できる。
ベンチマーク設定:
┌──────────────────────────────────┐
│ HTTP Benchmark │
│ │
│ URL: / │
│ Method: GET │
│ Concurrency: [2 ] │
│ Requests: [100 ] │
│ │
│ [OK] [Cancel] │
└──────────────────────────────────┘
結果:
┌──────────────────────────────────────────┐
│ Benchmark Results │
│ │
│ Total Requests: 100 │
│ Succeeded: 98 │
│ Failed: 2 │
│ Avg Latency: 45ms │
│ P50 Latency: 40ms │
│ P90 Latency: 85ms │
│ P99 Latency: 150ms │
│ Throughput: 22.2 req/s │
│ │
│ Status Codes: │
│ 200: 98 │
│ 500: 2 │
└──────────────────────────────────────────┘
9. フィルタリングと検索
9.1 基本フィルタ
/ キーを押してフィルタモードに入り、テキストを入力するとリアルタイムに表示が絞り込まれる。
基本的な使い方:
/nginx → 名前に「nginx」を含むリソースを表示
/api-server → 「api-server」を含むリソースを表示
/Running → STATUS が「Running」のリソースを表示
9.2 正規表現フィルタ
フィルタでは正規表現が使用可能。
正規表現の例:
/^api- → 名前が「api-」で始まるリソース
/.*-\d+$ → 数字で終わるリソース
/error|warn → 「error」または「warn」を含む行
/nginx|redis → 「nginx」または「redis」を含むリソース
/(Running|Pending) → STATUS が Running または Pending
9.3 逆フィルタ(除外フィルタ)
! を先頭に付けると、マッチしないリソースだけを表示する。
/!kube-system → kube-system 以外のリソースを表示
/!Completed → STATUS が Completed 以外のリソースを表示
/!Running → Running 以外(問題のある Pod を見つけやすい)
9.4 ラベルセレクタフィルタ
-l プレフィックスでラベルによるフィルタリングが可能。
/-l app=web → ラベル app=web を持つリソース
/-l app=api,version=v2 → 複数ラベルの AND 条件
/-l env in (prod,staging) → env が prod または staging
/-l app!=legacy → app が legacy でないリソース
/-l tier → tier ラベルが存在するリソース
9.5 フィールドセレクタフィルタ
-f プレフィックスでフィールドセレクタによるフィルタリングが可能。
/-f status.phase=Running → フェーズが Running の Pod
/-f spec.nodeName=worker-1 → worker-1 ノード上の Pod
/-f metadata.namespace=prod → prod ネームスペースのリソース
9.6 ファジー検索
k9s はデフォルトでファジーマッチングをサポートしている。完全一致でなくても近似マッチする。
/apisvr → api-server にマッチ(ファジー)
/ngnx → nginx にマッチ(ファジー)
ファジー検索を無効にして完全な正規表現マッチにしたい場合は、config.yaml で設定可能。
9.7 ネームスペースフィルタ
リソースビューでのネームスペーススコープの切り替え:
数字キーによるクイック切り替え:
0 → All namespaces(全ネームスペース)
1 → default
2 → kube-system
3 → 3番目のお気に入りネームスペース
...
コマンドモードからの切り替え:
:ns <namespace-name> でネームスペースを直接指定
9.8 フィルタの組み合わせ
フィルタはリソースビューの全列に対して適用される。これを利用して、特定の条件のリソースを素早く見つけられる。
実用的なフィルタ例:
Pod ビューで:
/CrashLoop → CrashLoopBackOff の Pod を検出
/!Running → 正常でない Pod を一覧表示
/0/ → Ready が 0 のコンテナを持つ Pod
/Error → エラー状態の Pod
/Evicted → エビクトされた Pod
Event ビューで:
/Warning → Warning タイプのイベントだけ表示
/OOMKilled → OOMKilled イベント
/BackOff → CrashLoopBackOff 関連
/FailedSch → スケジューリング失敗
Node ビューで:
/NotReady → NotReady 状態のノード
/SchedulingDisabled → cordon 済みノード
Deployment ビューで:
/0/ → 利用可能なレプリカが 0 の Deployment
10. Pulses ビュー
10.1 概要
:pulses または :pu コマンドで、クラスタの健全性を一目で把握できるダッシュボードビューが表示される。
┌──────────────────────────────────────────────────────────────────────────┐
│ Pulses — Cluster: production-cluster │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ PODS ████████████████████░░░░░ 42/50 (84%) │
│ DEPLOYMENTS ████████████████████████░ 23/24 (96%) │
│ STATEFULSETS █████████████████████████ 5/5 (100%) │
│ DAEMONSETS █████████████████████████ 3/3 (100%) │
│ JOBS ████████████████████░░░░░ 8/10 (80%) │
│ REPLICASETS █████████████████████████ 24/24 (100%) │
│ │
│ ─────────────────────────────────────────────────────── │
│ Events(Warning): 12 Events(Normal): 156 │
│ ─────────────────────────────────────────────────────── │
│ │
│ Recent Events: │
│ ⚠ BackOff pod/worker-abc 10m ago │
│ ⚠ NodeNotReady node/worker-2 15m ago │
│ ⚠ OOMKilled pod/batch-xyz 30m ago │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ <1>Pods <2>Deploy <3>STS <4>DS <5>RS <6>Jobs <Esc>Back │
└──────────────────────────────────────────────────────────────────────────┘
10.2 Pulses の読み方
Pulses ビューには以下の情報が表示される:
| セクション | 説明 |
|---|---|
| PODS | 正常稼働中の Pod 数 / 全 Pod 数 |
| DEPLOYMENTS | Ready な Deployment 数 / 全 Deployment 数 |
| STATEFULSETS | Ready な StatefulSet 数 / 全 StatefulSet 数 |
| DAEMONSETS | Ready な DaemonSet 数 / 全 DaemonSet 数 |
| JOBS | 成功した Job 数 / 全 Job 数 |
| REPLICASETS | Desired に達している ReplicaSet 数 |
| Events | Warning / Normal イベントの件数 |
数字キー(1-6)で各リソースタイプの詳細ビューに直接ジャンプできる。
11. XRay ビュー
11.1 概要
:xray または :xr コマンドで、リソース間の依存関係をツリー構造で可視化する XRay ビューを表示する。
XRay ビューの表示例:
┌──────────────────────────────────────────────────────────────────────────┐
│ XRay — deployments │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ ▼ deploy/api-server │
│ ├─ rs/api-server-6b8d9f7c5d [current] │
│ │ ├─ pod/api-server-6b8d9f7c5d-abc12 ● Running │
│ │ │ ├─ container/app (image: api:v2.3.1) ● Running │
│ │ │ └─ container/sidecar (image: envoy:1.28) ● Running │
│ │ └─ pod/api-server-6b8d9f7c5d-def34 ● Running │
│ │ ├─ container/app (image: api:v2.3.1) ● Running │
│ │ └─ container/sidecar (image: envoy:1.28) ● Running │
│ ├─ rs/api-server-5a7c8e6b4a [old] │
│ ├─ svc/api-server → 8080:8080 │
│ ├─ cm/api-server-config │
│ ├─ secret/api-server-tls │
│ ├─ sa/api-server │
│ └─ hpa/api-server (min:2, max:10, current:3) │
│ │
│ ▼ deploy/web-frontend │
│ ├─ rs/web-frontend-3c4d5e6f7g [current] │
│ │ ├─ pod/web-frontend-3c4d5e6f7g-hij89 ● Running │
│ │ └─ pod/web-frontend-3c4d5e6f7g-klm01 ● Running │
│ ├─ svc/web-frontend → 80:3000 │
│ └─ ing/web-frontend → web.example.com │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ <Enter>詳細 <l>ログ <d>desc <y>yaml <Tab>折りたたみ │
└──────────────────────────────────────────────────────────────────────────┘
11.2 XRay でのリソースタイプ指定
XRay ビューは特定のリソースタイプを起点にツリーを展開する。
:xray deployments → Deployment を起点に展開
:xray services → Service を起点に展開
:xray pods → Pod を起点に展開
:xray statefulsets → StatefulSet を起点に展開
:xray daemonsets → DaemonSet を起点に展開
11.3 XRay の活用シーン
- デプロイメント構造の把握: Deployment → ReplicaSet → Pod の階層を視覚的に確認
- 関連リソースの発見: Pod が使用する ConfigMap、Secret、ServiceAccount を確認
- 障害影響範囲の特定: 特定の Service にぶら下がる Pod の状態を一覧確認
- リソースの関連性調査: HPA、PDB、NetworkPolicy などの関連リソースを発見
12. Popeye 統合
12.1 概要
Popeye は Kubernetes クラスタのサニタイザー(品質チェッカー)であり、k9s に統合されている。:popeye または :pop でクラスタのベストプラクティス適合度をスキャンし、スコアリングする。
┌──────────────────────────────────────────────────────────────────────────┐
│ Popeye — Cluster: production-cluster Overall Score: 72% │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ RESOURCE SCORE OK INFO WARN ERROR │
│ Nodes 100% 5 0 0 0 │
│ Namespaces 90% 10 1 1 0 │
│ Pods 65% 35 3 8 2 │
│ Services 85% 8 1 1 0 │
│ Deployments 70% 18 2 4 0 │
│ StatefulSets 100% 5 0 0 0 │
│ DaemonSets 80% 3 0 1 0 │
│ ConfigMaps 95% 20 1 0 0 │
│ Secrets 60% 5 0 3 2 │
│ ServiceAccounts 75% 12 0 3 0 │
│ PersistentVolumes 90% 9 1 0 0 │
│ NetworkPolicies 50% 2 0 3 1 │
│ HPA 85% 4 1 0 0 │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ <Enter>詳細 <s>スキャン再実行 │
└──────────────────────────────────────────────────────────────────────────┘
12.2 Popeye のチェック項目
Enter キーで各リソースタイプの詳細を表示できる。
Pods の詳細スキャン結果:
┌──────────────────────────────────────────────────────────────────────────┐
│ Popeye — Pods │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ ✓ pod/api-server-abc12 Score: OK │
│ │
│ ⚠ pod/worker-xyz89 Score: WARN │
│ [W100] No resource requests defined │
│ [W101] No resource limits defined │
│ [W200] No liveness probe defined │
│ │
│ ✗ pod/batch-old-job Score: ERR │
│ [E100] Pod is in CrashLoopBackOff state │
│ [E200] Container image uses :latest tag │
│ [W100] No resource requests defined │
│ [W101] No resource limits defined │
│ [W200] No liveness probe defined │
│ [W201] No readiness probe defined │
│ │
│ ℹ pod/debug-pod Score: INFO │
│ [I100] Pod is in Succeeded state (completed) │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ <Esc>戻る │
└──────────────────────────────────────────────────────────────────────────┘
12.3 主なチェックカテゴリ
| カテゴリ | チェック内容 |
|---|---|
| リソース制限 | CPU/Memory の requests/limits が定義されているか |
| ヘルスチェック | liveness/readiness probe が定義されているか |
| イメージ管理 | :latest タグを使用していないか、イメージプルポリシーが適切か |
| セキュリティ | root で実行していないか、SecurityContext が設定されているか |
| ネットワーク | NetworkPolicy が定義されているか、Service が Pod を正しく指しているか |
| RBAC | 不要な ClusterRoleBinding がないか、ServiceAccount が適切か |
| ストレージ | 未使用の PV/PVC がないか、StorageClass が適切か |
| 利用状況 | CPU/Memory の実際の使用量が requests/limits に対して適切か |
13. ベンチマーク機能
13.1 概要
k9s にはサービスに対する簡易的な HTTP ベンチマーク機能が組み込まれている。ポートフォワード経由でエンドポイントの応答性能を測定できる。
13.2 ベンチマークの実行方法
1. Pod または Service にポートフォワードを設定 (Shift-F)
2. :portforwards で PF 一覧を表示
3. ベンチマーク対象の PF を選択
4. 'b' キーを押す
5. ベンチマーク設定を入力:
┌────────────────────────────────┐
│ HTTP Benchmark │
│ │
│ Path: [/health ] │
│ Method: [GET ] │
│ Concurrency: [5 ] │
│ Requests: [200 ] │
│ HTTP2: [false ] │
│ │
│ [Start] [Cancel] │
└────────────────────────────────┘
6. Start で実行
13.3 ベンチマーク結果の解釈
結果画面:
┌──────────────────────────────────────────────────────┐
│ Benchmark: localhost:8080/health │
├──────────────────────────────────────────────────────┤
│ │
│ Summary: │
│ ───────── │
│ Total Requests: 200 │
│ Succeeded: 198 (99.0%) │
│ Failed: 2 (1.0%) │
│ Duration: 4.5s │
│ Requests/sec: 44.4 │
│ │
│ Latency: │
│ ───────── │
│ Mean: 22.5ms │
│ P50: 18.0ms │
│ P90: 45.0ms │
│ P95: 78.0ms │
│ P99: 150.0ms │
│ Max: 250.0ms │
│ │
│ Status Code Distribution: │
│ ───────── │
│ 200: 198 │
│ 503: 2 │
│ │
│ Histogram: │
│ ───────── │
│ 0-10ms ████████████████████ 80 (40%) │
│ 10-50ms ████████████████████████ 96 (48%) │
│ 50-100ms ████ 16 (8%) │
│ 100ms+ ██ 8 (4%) │
│ │
├──────────────────────────────────────────────────────┤
│ <Esc>戻る <s>保存 │
└──────────────────────────────────────────────────────┘
13.4 ベンチマークの活用シーン
- デプロイ前後のパフォーマンス比較: 新バージョンデプロイ後にレイテンシが増加していないか確認
- スケーリング検証: レプリカ数変更後のスループット向上を確認
- ヘルスチェック検証: ヘルスチェックエンドポイントの応答速度を確認
- 負荷テスト: 簡易的な負荷テストとして使用
14. プラグインシステム
14.1 概要
k9s のプラグインシステムにより、カスタムコマンドをキーバインドに割り当ててシェルスクリプトや外部コマンドを実行できる。プラグインは plugin.yaml に定義する。
14.2 プラグインの構造
plugins:
<plugin-name>:
shortCut: <key-binding> # キーバインド (例: Shift-L, Ctrl-X)
description: <description> # プラグインの説明
scopes: # 適用対象のリソースタイプ
- <resource-type> # pods, deployments, nodes 等
command: <command> # 実行するコマンド
background: <true|false> # バックグラウンド実行の有無
confirm: <true|false> # 実行前確認ダイアログ
dangerous: <true|false> # 危険な操作のマーキング
args: # コマンド引数
- <arg1>
- <arg2>
14.3 利用可能な環境変数
プラグイン内で使用できる環境変数の一覧:
| 環境変数 | 説明 | 例 |
|---|---|---|
$NAME | 選択されたリソースの名前 | api-server-abc12 |
$NAMESPACE | リソースのネームスペース | default |
$CONTEXT | 現在のコンテキスト名 | production-cluster |
$CLUSTER | 現在のクラスタ名 | prod-k8s |
$USER | 認証ユーザー名 | admin |
$GROUPS | ユーザーグループ | system:masters |
$RESOURCE_GROUP | リソースの API グループ | apps |
$RESOURCE_VERSION | リソースの API バージョン | v1 |
$RESOURCE_NAME | リソースタイプ名 | pods |
$COL-<HEADER> | テーブルの特定列の値 | $COL-STATUS → Running |
$FILTER | 現在のフィルタ文字列 | nginx |
$SCOPES | 適用スコープ | pods |
14.4 実用的なプラグイン例
1. Pod の完全なリソース使用量表示(top):
plugins:
pod-top:
shortCut: Shift-T
description: "Pod リソース使用量 (top)"
scopes:
- pods
command: kubectl
background: false
args:
- top
- pod
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
- --containers
2. stern を使った高機能ログ表示:
stern-log:
shortCut: Shift-L
description: "Stern ログ (全コンテナ)"
scopes:
- pods
command: stern
background: false
args:
- --tail
- "100"
- --timestamps
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
3. Pod が使用しているイメージの脆弱性スキャン:
trivy-scan:
shortCut: Shift-V
description: "Trivy 脆弱性スキャン"
scopes:
- pods
command: sh
background: false
args:
- -c
- |
IMAGE=$(kubectl get pod $NAME -n $NAMESPACE --context $CONTEXT -o jsonpath='{.spec.containers[0].image}')
echo "Scanning image: $IMAGE"
echo "================================"
trivy image --severity HIGH,CRITICAL $IMAGE
4. Pod のネットワーク接続確認:
net-debug:
shortCut: Shift-N
description: "ネットワーク接続テスト"
scopes:
- pods
command: sh
background: false
args:
- -c
- |
echo "Pod: $NAME in $NAMESPACE"
echo "================================"
echo "Pod IP:"
kubectl get pod $NAME -n $NAMESPACE --context $CONTEXT -o jsonpath='{.status.podIP}'
echo ""
echo ""
echo "DNS Resolution:"
kubectl exec $NAME -n $NAMESPACE --context $CONTEXT -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null || echo "DNS lookup not available"
echo ""
echo "Network Interfaces:"
kubectl exec $NAME -n $NAMESPACE --context $CONTEXT -- ip addr 2>/dev/null || echo "ip command not available"
5. Node のリソース使用状況の詳細表示:
node-resources:
shortCut: Shift-R
description: "Node リソース詳細"
scopes:
- nodes
command: sh
background: false
args:
- -c
- |
echo "Node: $NAME"
echo "================================"
echo ""
echo "--- Resource Usage ---"
kubectl top node $NAME --context $CONTEXT
echo ""
echo "--- Pod Count ---"
kubectl get pods --all-namespaces --field-selector spec.nodeName=$NAME --context $CONTEXT --no-headers | wc -l
echo ""
echo "--- Running Pods ---"
kubectl get pods --all-namespaces --field-selector spec.nodeName=$NAME --context $CONTEXT --sort-by='.metadata.namespace'
6. Deployment のロールアウト履歴表示:
rollout-history:
shortCut: Shift-H
description: "ロールアウト履歴"
scopes:
- deployments
command: sh
background: false
args:
- -c
- |
echo "Deployment: $NAME"
echo "================================"
echo ""
echo "--- Rollout History ---"
kubectl rollout history deployment/$NAME -n $NAMESPACE --context $CONTEXT
echo ""
echo "--- Current Status ---"
kubectl rollout status deployment/$NAME -n $NAMESPACE --context $CONTEXT
7. Pod の前回のクラッシュログ表示:
prev-logs:
shortCut: Shift-P
description: "前回のコンテナログ"
scopes:
- pods
command: kubectl
background: false
args:
- logs
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
- --previous
- --tail
- "100"
8. YAML をクリップボードにコピー:
copy-yaml:
shortCut: Shift-C
description: "YAML をクリップボードにコピー"
scopes:
- pods
- deployments
- services
- configmaps
- secrets
command: sh
background: true
args:
- -c
- "kubectl get $RESOURCE_NAME $NAME -n $NAMESPACE --context $CONTEXT -o yaml | pbcopy && echo 'Copied to clipboard'"
9. Pod をデバッグコンテナで調査:
debug-pod:
shortCut: Shift-D
description: "デバッグコンテナ起動"
scopes:
- pods
command: kubectl
background: false
confirm: true
args:
- debug
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
- -it
- --image=nicolaka/netshoot
- --target
- $NAME
10. Helm リリースの詳細情報:
helm-info:
shortCut: Shift-I
description: "Helm リリース情報"
scopes:
- helm
command: sh
background: false
args:
- -c
- |
echo "Helm Release: $NAME ($NAMESPACE)"
echo "================================"
helm status $NAME -n $NAMESPACE 2>/dev/null
echo ""
echo "--- Values ---"
helm get values $NAME -n $NAMESPACE 2>/dev/null
15. スキンとテーマ
15.1 概要
k9s は skin.yaml ファイルにより、UIの配色を完全にカスタマイズできる。組み込みのテーマも複数用意されている。
15.2 組み込みテーマ
k9s には以下の組み込みテーマが利用可能:
| テーマ名 | 特徴 |
|---|---|
default | デフォルトの配色 |
dracula | Dracula カラースキーム(紫基調のダークテーマ) |
monokai | Monokai カラースキーム |
one-dark | Atom One Dark テーマ |
solarized-dark | Solarized Dark テーマ |
solarized-light | Solarized Light テーマ |
nord | Nord カラースキーム(青基調のダークテーマ) |
gruvbox-dark | Gruvbox Dark テーマ |
gruvbox-light | Gruvbox Light テーマ |
catppuccin-mocha | Catppuccin Mocha テーマ |
rose-pine | Rose Pine テーマ |
transparent | 透過背景テーマ(ターミナルの背景を活かす) |
15.3 テーマの適用方法
# config.yaml でスキンを指定
k9s:
ui:
skin: dracula
または、skin.yaml ファイルを直接作成して詳細なカスタマイズを行う。
15.4 skin.yaml の詳細構造
# skin.yaml — カスタムテーマの完全な構造
k9s:
# 本体の配色
body:
fgColor: "#c0caf5" # 前景色(テキスト)
bgColor: "#1a1b26" # 背景色
logoColor: "#7aa2f7" # k9s ロゴの色
# プロンプト(コマンドバー)の配色
prompt:
fgColor: "#c0caf5"
bgColor: "#1a1b26"
suggestColor: "#7aa2f7" # サジェストテキストの色
# 情報パネルの配色
info:
fgColor: "#bb9af7"
sectionColor: "#c0caf5"
# ダイアログの配色
dialog:
fgColor: "#c0caf5"
bgColor: "#1a1b26"
buttonFgColor: "#1a1b26"
buttonBgColor: "#7aa2f7"
buttonFocusFgColor: "#1a1b26"
buttonFocusBgColor: "#bb9af7"
labelFgColor: "#7dcfff"
fieldFgColor: "#c0caf5"
# フレーム(外枠)の配色
frame:
border:
fgColor: "#3b4261"
focusColor: "#7aa2f7"
menu:
fgColor: "#c0caf5"
keyColor: "#bb9af7"
numKeyColor: "#9ece6a"
crumbs:
fgColor: "#1a1b26"
bgColor: "#7aa2f7"
activeColor: "#bb9af7"
title:
fgColor: "#7aa2f7"
bgColor: "#1a1b26"
highlightColor: "#e0af68"
counterColor: "#bb9af7"
filterColor: "#9ece6a"
status:
newColor: "#7dcfff"
modifyColor: "#e0af68"
addColor: "#9ece6a"
pendingColor: "#bb9af7"
errorColor: "#f7768e"
highlightColor: "#e0af68"
killColor: "#3b4261"
completedColor: "#9ece6a"
# ビューの配色
views:
# テーブルビュー
table:
fgColor: "#c0caf5"
bgColor: "#1a1b26"
cursorFgColor: "#1a1b26"
cursorBgColor: "#3b4261"
markColor: "#ff9e64"
header:
fgColor: "#3b4261"
bgColor: "#1a1b26"
sorterColor: "#7dcfff"
# XRay ビュー
xray:
fgColor: "#c0caf5"
bgColor: "#1a1b26"
cursorColor: "#3b4261"
graphicColor: "#7aa2f7"
showIcons: false
# YAML ビュー
yaml:
keyColor: "#bb9af7"
colonColor: "#c0caf5"
valueColor: "#9ece6a"
# ログビュー
logs:
fgColor: "#c0caf5"
bgColor: "#1a1b26"
indicator:
fgColor: "#1a1b26"
bgColor: "#7aa2f7"
toggleOnColor: "#9ece6a"
toggleOffColor: "#f7768e"
15.5 カラーパレットのカスタマイズ Tips
色の指定方法:
- Hex カラーコード: "#ff5555"
- 名前付きカラー: "red", "green", "blue", "yellow", etc.
- 256色ターミナルカラー: "color38", "color226"
- デフォルト(ターミナルの色を使用): "default"
SRE 向け推奨カスタマイズ:
1. エラー状態は赤系(#ff5555, #f7768e)で目立たせる
2. 正常状態は緑系(#50fa7b, #9ece6a)で安心感
3. 警告は黄色系(#f1fa8c, #e0af68)で注意喚起
4. 背景は暗い色でターミナルとの統一感
5. カーソル行は十分なコントラストを確保
16. マルチクラスタ管理
16.1 コンテキスト切り替え
k9s は kubeconfig に定義された全コンテキストをサポートする。
コンテキスト切り替え方法:
方法1: コマンドモード
:ctx → コンテキスト一覧を表示
Enter → 選択したコンテキストに切り替え
方法2: 起動時オプション
k9s --context production-cluster
方法3: 直接コマンド
:ctx production-cluster
16.2 マルチ kubeconfig
複数の kubeconfig ファイルを統合して使用する方法:
# KUBECONFIG 環境変数で複数ファイルを指定
export KUBECONFIG=$HOME/.kube/config:$HOME/.kube/staging-config:$HOME/.kube/dev-config
# k9s 起動時に特定の kubeconfig を指定
k9s --kubeconfig /path/to/specific-kubeconfig
# kubeconfig をマージ
KUBECONFIG=$HOME/.kube/config:$HOME/.kube/staging-config kubectl config view --flatten > $HOME/.kube/merged-config
16.3 クラスタ固有の設定
config.yaml で各クラスタごとに異なる設定を適用できる。
k9s:
clusters:
production-cluster:
namespace:
active: app-production
favorites:
- app-production
- monitoring
- kube-system
view:
active: pod
# 本番環境は読み取り専用を推奨
readOnly: true
portForwardAddress: localhost
staging-cluster:
namespace:
active: default
favorites:
- default
- staging
view:
active: deployment
readOnly: false
development-cluster:
namespace:
active: dev
favorites:
- dev
- testing
view:
active: pod
readOnly: false
# 開発環境は nodeShell を有効化
featureGates:
nodeShell: true
16.4 マルチクラスタワークフロー
SRE が複数クラスタを効率的に管理するためのワークフロー:
1. 朝のルーティン:
k9s → :ctx で各クラスタの Pulses を確認
production → :pu で全体の健全性チェック
staging → :pu で staging の状態確認
2. 障害対応:
k9s --context production-cluster
:ev で Warning イベントを確認
:po で問題のある Pod を特定
/CrashLoop でフィルタ
l でログ確認
3. デプロイ確認:
k9s --context staging-cluster
:dp で Deployment を確認
:ctx で production に切り替え
同じ Deployment を確認して差分を確認
17. 他ツールとの比較
17.1 比較表
| 特徴 | k9s | kubectl | Lens | Octant | Headlamp |
|---|---|---|---|---|---|
| 種類 | TUI | CLI | デスクトップ GUI | Web UI | Web UI |
| インストール | シングルバイナリ | K8s に同梱 | Electron アプリ | シングルバイナリ | Helm チャート |
| リソース消費 | 低 (< 50MB) | 最低 | 高 (> 500MB) | 中 (~ 150MB) | 中 |
| 操作速度 | 非常に高速 | コマンド入力 | マウス操作 | マウス操作 | マウス操作 |
| リアルタイム表示 | ○ (2秒) | × (手動) | ○ | ○ | ○ |
| マルチクラスタ | ○ | △ (切替要) | ○ | × (単一) | △ |
| プラグイン | ○ | ○ (krew) | ○ (拡張機能) | ○ | ○ |
| カスタムテーマ | ○ | × | ○ | × | × |
| SSH接続不要 | × (要ターミナル) | × (要ターミナル) | × (要デスクトップ) | ○ (Web) | ○ (Web) |
| オフライン利用 | ○ | ○ | ○ | ○ | ○ |
| ログ表示 | ○ (高機能) | △ (基本) | ○ | ○ | ○ |
| CRD対応 | ○ (自動検出) | ○ | ○ | ○ | ○ |
| RBAC表示 | ○ | △ | ○ | ○ | ○ |
| ベンチマーク | ○ | × | × | × | × |
| サニタイザー | ○ (Popeye) | × | × | × | × |
| ライセンス | Apache 2.0 | Apache 2.0 | 商用/OSS | Apache 2.0 | Apache 2.0 |
| 学習曲線 | 中(Vim知識要) | 低-中 | 低 | 低 | 低 |
17.2 k9s vs kubectl
kubectl の利点:
- Kubernetes に標準で同梱
- スクリプトやパイプラインに組み込み可能
- JSONPath、jq との連携が容易
- CI/CD パイプラインでの利用
- 全機能への直接アクセス
k9s の利点:
- リアルタイム表示で状態変化を即座に把握
- 複数リソースの状態を一画面で確認
- キーボードショートカットによる高速操作
- ログ表示、ポートフォワードの統合管理
- XRay によるリソース関連性の可視化
- Popeye によるベストプラクティスチェック
併用パターン:
日常的な監視・調査 → k9s を使用
- Pod の状態確認
- ログの確認
- 障害調査
自動化・スクリプト → kubectl を使用
- CI/CD パイプライン
- 定期的なバッチ処理
- テンプレートからのリソース作成
共存設定(~/.bashrc / ~/.zshrc):
alias k='kubectl'
alias k9='k9s'
alias kctx='kubectl config use-context'
alias kns='kubectl config set-context --current --namespace'
17.3 k9s vs Lens
Lens の利点:
- グラフィカルな UI で視覚的に分かりやすい
- メトリクスのグラフ表示
- Helm チャートカタログ
- 拡張機能エコシステム
- ドラッグ&ドロップ操作
k9s の利点:
- SSH 経由のリモートサーバーで使用可能(GUIが不要)
- リソース消費が圧倒的に少ない
- キーボード操作で高速
- ターミナルマルチプレクサ (tmux/screen) との相性が良い
- カスタマイズ性が高い
17.4 k9s vs Octant / Headlamp
Web UI ツールの利点:
- ブラウザから利用可能(専用アプリ不要)
- チーム共有が容易
- 視覚的なダッシュボード
k9s の利点:
- サーバーの起動が不要
- セキュリティリスクが低い(Web サーバーを公開しない)
- 操作速度が速い
- ジャンプボックスや踏み台サーバーから利用可能
17.5 選択ガイドライン
以下の場合に k9s を推奨:
✓ ターミナル作業が中心の SRE/DevOps エンジニア
✓ SSH 経由でリモートサーバーから K8s を操作する
✓ tmux/screen を常用している
✓ Vim キーバインドに慣れている
✓ リソース消費を最小限にしたい
✓ 障害対応時の高速オペレーションが求められる
以下の場合は他ツールを検討:
✗ GUI での視覚的な操作を好む → Lens
✗ チームで共有ダッシュボードが必要 → Headlamp
✗ メトリクスのグラフ表示が必要 → Lens / Grafana
✗ 自動化スクリプトを書く → kubectl
18. Tips & Tricks
18.1 キーボードショートカット チートシート
グローバルショートカット:
| キー | 操作 |
|---|---|
: | コマンドモード |
/ | フィルタモード |
? | ヘルプ表示 |
Ctrl-A | 全リソース表示トグル |
Esc | 戻る / フィルタクリア |
q | 戻る / 終了 |
Ctrl-C | k9s 終了 |
0-9 | ネームスペース切り替え |
j/k | 上下移動 |
g/G | 先頭/末尾移動 |
Enter | 選択 / 詳細表示 |
d | Describe |
y | YAML 表示 |
e | 編集 |
Ctrl-D | 削除 |
Pod 固有ショートカット:
| キー | 操作 |
|---|---|
l | ログ表示 |
s | シェル接続 (exec) |
Shift-F | ポートフォワード |
c | 名前コピー |
a | アタッチ |
Ctrl-K | 強制削除 |
Deployment 固有ショートカット:
| キー | 操作 |
|---|---|
s | スケール |
r | リスタート |
b | ロールバック |
Enter | 関連 Pod 一覧 |
Node 固有ショートカット:
| キー | 操作 |
|---|---|
c | Cordon |
u | Uncordon |
r | Drain |
ログビューショートカット:
| キー | 操作 |
|---|---|
s | オートスクロール |
w | テキスト折り返し |
t | タイムスタンプ |
f | フルスクリーン |
/ | 検索 |
n/N | 次/前のマッチ |
g/G | 先頭/末尾 |
c | コピー |
Ctrl-S | 保存 |
0-9 | コンテナ選択 |
p | 前回コンテナログ |
18.2 生産性向上 Tips
Tip 1: エイリアスの活用
よく使う CRD にエイリアスを設定して、素早くアクセスする。
# aliases.yaml
aliases:
vs: networking.istio.io/v1beta1/virtualservices
cert: cert-manager.io/v1/certificates
Tip 2: ホットキーの設定
頻繁にアクセスするリソースにホットキーを割り当てる。
# hotkey.yaml
hotKeys:
shift-1:
shortCut: Shift-1
command: pods
shift-2:
shortCut: Shift-2
command: deployments
shift-3:
shortCut: Shift-3
command: events
Tip 3: tmux との連携
tmux のペインを活用して、複数のリソースビューを同時に表示する。
# tmux レイアウト例
# ┌──────────────────┬──────────────────┐
# │ k9s (pods) │ k9s (events) │
# │ │ │
# ├──────────────────┤ │
# │ k9s (deploy) │ │
# └──────────────────┴──────────────────┘
# tmux スクリプト
tmux new-session -d -s k9s-dashboard
tmux send-keys 'k9s --command pods' C-m
tmux split-window -h
tmux send-keys 'k9s --command events' C-m
tmux split-window -v -t 0
tmux send-keys 'k9s --command deployments' C-m
tmux select-pane -t 0
tmux attach-session -t k9s-dashboard
Tip 4: スクリーンダンプの活用
Ctrl-S でスクリーンダンプ(画面のテキスト保存)を取得し、障害対応時の証跡を残す。
# config.yaml
k9s:
screenDumpDir: /tmp/k9s-screens
Tip 5: 読み取り専用モードの活用
本番環境では読み取り専用モードで起動し、誤操作を防ぐ。
# 読み取り専用モードで起動
k9s --readonly
# または config.yaml でクラスタ単位で設定
k9s:
clusters:
production-cluster:
readOnly: true
Tip 6: カラム表示のカスタマイズ
Ctrl-W でワイド表示に切り替えて、より多くの情報を表示する。
Tip 7: ソート機能
テーブルビューでは、ヘッダーの列名で Shift-R を押すとソート順を変更できる。AGE でソートすると最近作成されたリソースを上に表示できる。
Tip 8: マーク機能
Space キーで複数のリソースをマークし、一括操作(削除など)が可能。
1. リソース一覧で Space キーでマーク
2. 複数のリソースをマーク
3. Ctrl-D で一括削除(マークされたリソースが対象)
4. Ctrl-\\ で全マーク解除
Tip 9: 環境変数による設定
# k9s の設定を環境変数で制御
export K9S_CONFIG_DIR=$HOME/.config/k9s
export K9S_LOGS_DIR=/tmp/k9s-logs
export EDITOR=vim # k9s の編集で使用するエディタ
export KUBE_EDITOR=vim
Tip 10: シェルエイリアスの設定
# ~/.bashrc or ~/.zshrc
# k9s クイック起動
alias k9='k9s'
alias k9ro='k9s --readonly'
alias k9prod='k9s --context production-cluster --readonly'
alias k9stg='k9s --context staging-cluster'
alias k9dev='k9s --context development-cluster'
alias k9pods='k9s --command pods'
alias k9events='k9s --command events'
alias k9ns='k9s --command namespaces'
alias k9sys='k9s -n kube-system'
alias k9all='k9s -A'
# 特定のネームスペースで起動
k9n() {
k9s -n "$1"
}
# 特定のコンテキストとネームスペースで起動
k9cn() {
k9s --context "$1" -n "$2"
}
19. SRE ベストプラクティス
19.1 障害対応 (Incident Response) での k9s 活用
障害発生時の k9s を使った標準的な調査フローを紹介する。
ステップ 1: 全体状況の把握
1. k9s --context production-cluster を起動
2. :pu (Pulses) でクラスタ全体の健全性を確認
→ 赤いバーがあるリソースタイプを特定
3. :ev でイベントを確認
/Warning でフィルタ
→ 直近の Warning イベントから問題を特定
ステップ 2: 問題の特定
4. :po で Pod ビューに切り替え
5. 0 キーで全ネームスペースを表示
6. /!Running でフィルタして異常な Pod を検出
→ CrashLoopBackOff, Error, Pending, OOMKilled 等
7. 問題の Pod を選択して d (Describe) で詳細確認
→ Events セクション、Conditions セクションを確認
ステップ 3: ログ調査
8. 問題の Pod を選択して l (Logs) でログ表示
9. /error や /exception でエラーログを検索
10. t でタイムスタンプを表示して時系列を把握
11. p で前回(クラッシュ前)のログも確認
12. Ctrl-S でログをファイルに保存(証跡)
ステップ 4: リソース状態の確認
13. :no で Node の状態を確認
→ NotReady ノードがないか
→ CPU/Memory の使用率が閾値を超えていないか
14. :dp で Deployment の状態を確認
→ READY カウントが期待値と一致しているか
15. :xray deployments で依存関係を確認
→ 関連する ConfigMap, Secret の状態
ステップ 5: 復旧操作
16. 必要に応じて:
- Pod の再起動: Ctrl-D で削除 → 自動再作成
- Deployment のリスタート: r キー
- Deployment のロールバック: b キー
- スケールアップ: s キーでレプリカ数変更
- ノードのドレイン: Node ビューで r キー
ステップ 6: 事後確認
17. :pu で Pulses が改善していることを確認
18. :ev で新しい Warning イベントが出ていないことを確認
19. :po で全 Pod が Running に戻ったことを確認
20. Ctrl-S でスクリーンダンプを保存(ポストモーテム用)
19.2 日常モニタリングルーティン
SRE の日常業務での k9s 活用パターンを紹介する。
朝のチェックルーティン(5-10分):
┌─ 手順 ──────────────────────────────────────────────────┐
│ │
│ 1. k9s --context production-cluster │
│ :pu → クラスタの全体的な健全性を確認 │
│ │
│ 2. :ev → Warning イベントの確認 │
│ /Warning でフィルタ → 直近のイベントをチェック │
│ │
│ 3. :po → Pod ステータスの確認 │
│ 0 → 全ネームスペース表示 │
│ /!Running → 異常な Pod がないかチェック │
│ │
│ 4. :no → Node の状態確認 │
│ CPU/Memory の使用率が閾値以下であることを確認 │
│ │
│ 5. :dp → Deployment の READY 状態を確認 │
│ /0/ → 利用可能レプリカが 0 の Deployment がないか │
│ │
│ 6. :pop → Popeye でベストプラクティスチェック │
│ スコアの低下がないか確認 │
│ │
│ 7. :ctx で staging-cluster に切り替え │
│ 同様のチェックを実施 │
│ │
└──────────────────────────────────────────────────────────┘
19.3 リソーストラブルシューティングパターン
パターン 1: Pod が起動しない (Pending)
調査フロー:
:po → 問題の Pod を選択
d → Describe で Events を確認
よくある原因:
├─ Insufficient CPU/Memory
│ → :no で Node のリソース状況を確認
│ → スケールアウトまたはリソース制限の見直し
├─ No matching node (nodeSelector/affinity)
│ → Pod の nodeSelector/affinity 設定を確認
│ → ノードのラベルを確認
├─ PVC not bound
│ → :pvc で PVC の状態を確認
│ → :pv で PV の有無を確認
└─ Image pull error
→ イメージ名の確認
→ Secret (imagePullSecrets) の確認
パターン 2: Pod が頻繁にリスタート (CrashLoopBackOff)
調査フロー:
:po → 問題の Pod を選択(RESTARTS が増加中)
l → 現在のログを確認
p → 前回(クラッシュ前)のログを確認
d → Describe で Exit Code を確認
よくある原因:
├─ Exit Code 1 (アプリケーションエラー)
│ → ログでエラーメッセージを確認
│ → ConfigMap/Secret の設定値を確認
├─ Exit Code 137 (OOMKilled)
│ → Memory limits の見直し
│ → アプリケーションのメモリリークの確認
├─ Exit Code 143 (SIGTERM)
│ → Graceful shutdown の実装確認
│ → terminationGracePeriodSeconds の見直し
└─ Liveness probe failure
→ Probe の設定を確認(パス、ポート、タイムアウト)
→ アプリケーションの起動時間を確認
パターン 3: Service に接続できない
調査フロー:
:svc → Service を確認
d → Describe で Endpoints を確認
Endpoints が空の場合:
├─ Service の selector と Pod の labels が一致するか確認
│ → :svc で Service の YAML を確認 (y)
│ → :po で Pod のラベルを確認
├─ Pod が Ready 状態か確認
│ → Readiness probe が通っていない可能性
└─ ネームスペースが正しいか確認
Endpoints はあるが接続できない場合:
├─ ポート番号の確認(Service port vs Container port)
├─ NetworkPolicy の確認
│ → :np でネットワークポリシーを確認
└─ Pod 内でサービスが Listen しているか確認
→ s (shell) でコンテナに入って確認
パターン 4: Node の異常
調査フロー:
:no → Node 一覧で状態確認
d → 問題のある Node を Describe
NotReady の場合:
├─ Conditions セクションを確認
│ ├─ MemoryPressure
│ ├─ DiskPressure
│ ├─ PIDPressure
│ └─ NetworkUnavailable
├─ kubelet のログ確認(プラグイン使用)
└─ Node 上の Pod を確認
→ :po で /-f spec.nodeName=<node> でフィルタ
リソース逼迫の場合:
├─ CPU/Memory の使用率を確認
├─ Pod 数が上限に近いか確認
└─ 不要な Pod やジョブの削除を検討
19.4 SRE 運用の自動化パターン
パターン 1: 定期ヘルスチェックスクリプト
#!/bin/bash
# daily-health-check.sh
# k9s の screendump 機能を活用した定期チェック
DATE=$(date +%Y%m%d_%H%M%S)
DUMP_DIR="/tmp/k9s-healthcheck/$DATE"
mkdir -p "$DUMP_DIR"
for CTX in production-cluster staging-cluster; do
echo "Checking cluster: $CTX"
# Pod のステータスサマリー
kubectl --context "$CTX" get pods -A --no-headers | \
awk '{print $4}' | sort | uniq -c | sort -rn > "$DUMP_DIR/${CTX}_pod_status.txt"
# Warning イベント
kubectl --context "$CTX" get events -A --field-selector type=Warning \
--sort-by='.lastTimestamp' > "$DUMP_DIR/${CTX}_warnings.txt"
# Node のリソース使用量
kubectl --context "$CTX" top nodes > "$DUMP_DIR/${CTX}_node_resources.txt"
echo "Results saved to $DUMP_DIR"
done
パターン 2: 障害対応テンプレート
k9s 障害対応チェックリスト:
□ 1. :pu → Pulses で影響範囲を把握
□ 2. :ev /Warning → Warning イベントの確認
□ 3. :po /!Running → 異常 Pod の特定
□ 4. d → Pod の Describe (Events/Conditions)
□ 5. l → Pod のログ確認 (/error で検索)
□ 6. :no → Node の状態確認
□ 7. :xray → リソース依存関係の確認
□ 8. Ctrl-S → 画面キャプチャ保存
□ 9. 復旧操作の実施
□ 10. :pu → 復旧確認
19.5 セキュリティに関する注意事項
本番環境での k9s 使用時の注意:
1. 読み取り専用モード
→ 本番環境では --readonly で起動
→ config.yaml で readOnly: true を設定
2. RBAC の適切な設定
→ k9s 用の ServiceAccount に最小権限を付与
→ Namespace スコープの Role を使用
→ ClusterRole は必要最小限に
3. Secret の取り扱い
→ Secret のデコード (x) は必要時のみ
→ スクリーンダンプに Secret の内容が含まれないよう注意
4. 監査ログ
→ k9s 経由の操作も Kubernetes の Audit Log に記録される
→ 重要な操作は事前にチームに通知
5. コンテキストの確認
→ 操作前に必ず現在のコンテキストとネームスペースを確認
→ ヘッダーに表示されているクラスタ名を確認する習慣
まとめ
k9s は SRE エンジニアにとって非常に強力なツールである。ターミナルベースのインターフェースにより、SSH 経由のリモート環境でも快適に利用でき、Vim スタイルのキーバインドによる高速操作は、障害対応時の迅速な調査を可能にする。
本ガイドで紹介した設定とワークフローを活用することで、日常的な Kubernetes クラスタの運用効率が大幅に向上するだろう。特にプラグインシステムとホットキーの設定は、チームの運用スタイルに合わせてカスタマイズすることを推奨する。
k9s は活発に開発が続けられており、新機能や改善が継続的にリリースされている。公式の GitHub リポジトリ (https://github.com/derailed/k9s) を定期的にチェックし、最新情報をキャッチアップすることをお勧めする。
本ドキュメントは SRE エンジニア向けの包括的な k9s ガイドとして作成されました。 最終更新: 2026年4月