k9s

k9s 完全ガイド — ターミナルベース Kubernetes UI の全貌

本ドキュメントは SRE エンジニア向けに、k9s の機能・設定・運用ノウハウを網羅的に解説する技術記事です。


目次

  1. k9s とは何か
  2. インストール方法
  3. コアコンセプト
  4. 設定ファイル詳解
  5. ナビゲーションとビュー
  6. リソース別キー操作
  7. ログ表示機能
  8. ポートフォワード
  9. フィルタリングと検索
  10. Pulses ビュー
  11. XRay ビュー
  12. Popeye 統合
  13. ベンチマーク機能
  14. プラグインシステム
  15. スキンとテーマ
  16. マルチクラスタ管理
  17. 他ツールとの比較
  18. Tips & Tricks
  19. 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 コマンドモード(: プレフィックス)

: キーを押すと、コマンドモードに入る。ここでリソースタイプを入力してビューを切り替える。

コマンド説明エイリアス
:podsPod ビュー:po
:deploymentsDeployment ビュー:dp, :deploy
:servicesService ビュー:svc
:nodesNode ビュー:no
:namespacesNamespace ビュー:ns
:configmapsConfigMap ビュー:cm
:secretsSecret ビュー:sec
:statefulsetsStatefulSet ビュー:sts
:daemonsetsDaemonSet ビュー:ds
:replicasetsReplicaSet ビュー:rs
:jobsJob ビュー:job
:cronjobsCronJob ビュー:cj
:ingressesIngress ビュー:ing
:persistentvolumesPV ビュー:pv
:persistentvolumeclaimsPVC ビュー:pvc
:storageclassesStorageClass ビュー:sc
:eventsEvent ビュー:ev
:contextsContext ビュー:ctx
:aliasesエイリアス一覧:alias
:popeyePopeye サニタイザー:pop
:pulsesPulses ビュー:pu
:xrayXRay ビュー:xr
:rbacRBAC ビューなし
:clusterrolesClusterRole:cr
:clusterrolebindingsClusterRoleBinding:crb
:rolesRole:ro
:rolebindingsRoleBinding:rb
:serviceaccountsServiceAccount:sa
:networkpoliciesNetworkPolicy:np
:horizontalpodautoscalersHPA:hpa
:verticalpodautoscalersVPA:vpa
:helmHelm リリースなし
:portforwardsPF 管理: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-ck9s を終了

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 で接続
dDescribekubectl describe pod 相当の詳細情報を表示
yYAML 表示Pod の完全な YAML 定義を表示
e編集Pod の定義を $EDITOR で編集(通常は変更不可だがアノテーション等は編集可能)
Shift-FポートフォワードPod へのポートフォワードを設定
Ctrl-D削除Pod を削除(確認ダイアログあり)
cコピーPod 名をクリップボードにコピー
Enterコンテナ詳細Pod 内のコンテナ一覧を表示
Ctrl-KKillPod を強制削除(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 操作

キー操作説明
EnterPod 一覧この Deployment が管理する Pod の一覧を表示
dDescribeDeployment の詳細情報を表示
yYAML 表示完全な 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 操作

キー操作説明
dDescribeService の詳細情報を表示
yYAML 表示完全な YAML 定義を表示
e編集Service 定義を編集
Shift-FポートフォワードService へのポートフォワードを設定
Ctrl-D削除Service を削除

6.4 Node 操作

キー操作説明
dDescribeNode の詳細情報を表示
yYAML 表示完全な YAML 定義を表示
cCordonNode をスケジュール不可にする
uUncordonNode をスケジュール可能に戻す
rDrainNode から Pod を退避(ドレイン)
sSSHNode にシェルアクセス(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 操作

キー操作説明
dDescribe詳細情報を表示
yYAML 表示完全な YAML 定義を表示
e編集データを $EDITOR で編集
uUse/Data表示ConfigMap/Secret のデータ内容を表示
xDecodeSecret の 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.yamlsinceSeconds で設定する。

# 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 数
DEPLOYMENTSReady な Deployment 数 / 全 Deployment 数
STATEFULSETSReady な StatefulSet 数 / 全 StatefulSet 数
DAEMONSETSReady な DaemonSet 数 / 全 DaemonSet 数
JOBS成功した Job 数 / 全 Job 数
REPLICASETSDesired に達している ReplicaSet 数
EventsWarning / 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-STATUSRunning
$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デフォルトの配色
draculaDracula カラースキーム(紫基調のダークテーマ)
monokaiMonokai カラースキーム
one-darkAtom One Dark テーマ
solarized-darkSolarized Dark テーマ
solarized-lightSolarized Light テーマ
nordNord カラースキーム(青基調のダークテーマ)
gruvbox-darkGruvbox Dark テーマ
gruvbox-lightGruvbox Light テーマ
catppuccin-mochaCatppuccin Mocha テーマ
rose-pineRose 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 比較表

特徴k9skubectlLensOctantHeadlamp
種類TUICLIデスクトップ GUIWeb UIWeb UI
インストールシングルバイナリK8s に同梱Electron アプリシングルバイナリHelm チャート
リソース消費低 (< 50MB)最低高 (> 500MB)中 (~ 150MB)
操作速度非常に高速コマンド入力マウス操作マウス操作マウス操作
リアルタイム表示○ (2秒)× (手動)
マルチクラスタ△ (切替要)× (単一)
プラグイン○ (krew)○ (拡張機能)
カスタムテーマ×××
SSH接続不要× (要ターミナル)× (要ターミナル)× (要デスクトップ)○ (Web)○ (Web)
オフライン利用
ログ表示○ (高機能)△ (基本)
CRD対応○ (自動検出)
RBAC表示
ベンチマーク××××
サニタイザー○ (Popeye)××××
ライセンスApache 2.0Apache 2.0商用/OSSApache 2.0Apache 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-Ck9s 終了
0-9ネームスペース切り替え
j/k上下移動
g/G先頭/末尾移動
Enter選択 / 詳細表示
dDescribe
yYAML 表示
e編集
Ctrl-D削除

Pod 固有ショートカット:

キー操作
lログ表示
sシェル接続 (exec)
Shift-Fポートフォワード
c名前コピー
aアタッチ
Ctrl-K強制削除

Deployment 固有ショートカット:

キー操作
sスケール
rリスタート
bロールバック
Enter関連 Pod 一覧

Node 固有ショートカット:

キー操作
cCordon
uUncordon
rDrain

ログビューショートカット:

キー操作
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月