derailed/k9s

GitHub: derailed/k9s

一个基于终端 UI 的 Kubernetes 集群管理工具,让用户能以更直观高效的方式浏览、监控和操作集群中的各类资源。

Stars: 33261 | Forks: 2128

k9s ## K9s - 以时尚的方式管理你的 Kubernetes 集群的 CLI 工具! K9s 提供了一个终端 UI 来与你的 Kubernetes 集群进行交互。 该项目的目的是让你更轻松地导航、观察和管理实际环境中的应用程序。K9s 会持续监视 Kubernetes 的变化,并提供后续命令与你观察到的资源进行交互。 ## 注意... K9s 并非由财大气粗的大公司赞助支持。 这是一个复杂的 OSS(开源软件)项目,需要我投入大量时间来维护和支持。 K9s 将始终保持开源,因此是免费的!话虽如此,如果你觉得 K9s 让你的日常 Kubernetes 之旅更加愉快,节省了你的时间并提高了你的生产力,请考虑[赞助我们!](https://github.com/sponsors/derailed) 你的捐款对于维持我们服务器的运行和冰箱里的啤酒大有帮助! **谢谢!** [![Go Report Card](https://goreportcard.com/badge/github.com/derailed/k9s?)](https://goreportcard.com/report/github.com/derailed/k9s) [![golangci badge](https://github.com/golangci/golangci-web/blob/master/src/assets/images/badge_a_plus_flat.svg)](https://golangci.com/r/github.com/derailed/k9s) [![Docker Pulls](https://img.shields.io/docker/pulls/derailed/k9s.svg?maxAge=604800)](https://hub.docker.com/r/derailed/k9s/) [![release](https://img.shields.io/github/release-pre/derailed/k9s.svg)](https://github.com/derailed/k9s/releases) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/mum4k/termdash/blob/master/LICENSE) [![Releases](https://img.shields.io/github/downloads/derailed/k9s/total.svg)](https://github.com/derailed/k9s/releases) ## 屏幕截图 1. Pods 2. Logs 3. Deployments ## 演示视频/录屏 * [K9s v0.40.0 -Column Blow- 抢先看](https://youtu.be/iy6RDozAM4A) * [K9s v0.31.0 Configs+抢先看](https://youtu.be/X3444KfjguE) * [K9s v0.30.0 抢先看](https://youtu.be/mVBc1XneRJ4) * [漏洞扫描](https://youtu.be/ULkl0MsaidU) * [K9s v0.29.0](https://youtu.be/oiU3wmoAkBo) * [K9s v0.21.3](https://youtu.be/wG8KCwDAhnw) * [K9s v0.19.X](https://youtu.be/kj-WverKZ24) * [K9s v0.18.0](https://www.youtube.com/watch?v=zMnD5e53yRw) * [K9s v0.17.0](https://www.youtube.com/watch?v=7S33CNLAofk&feature=youtu.be) * [K9s Pulses](https://asciinema.org/a/UbXKPal6IWpTaVAjBBFmizcGN) * [K9s v0.15.1](https://youtu.be/7Fx4XQ2ftpM) * [K9s v0.13.0](https://www.youtube.com/watch?v=qaeR2iK7U0o&t=15s) * [K9s v0.9.0](https://www.youtube.com/watch?v=bxKfqumjW4I) * [K9s v0.7.0 功能](https://youtu.be/83jYehwlql8) * [K9s v0 演示](https://youtu.be/k7zseUhaXeU) ## 文档 有关安装、使用、自定义和提示,请参阅我们的 [K9s 文档](https://k9scli.io) 站点。 ## Slack 频道 想和其他 `K9sers` 讨论 K9s 功能,或者仅仅是表达你对该工具的支持吗? * 频道:[K9sersSlack](https://k9sers.slack.com/) * 邀请:[K9slackers 邀请](https://join.slack.com/t/k9sers/shared_invite/zt-3360a389v-ElLHrb0Dp1kAXqYUItSAFA) ## 安装 K9s 可在 Linux、macOS 和 Windows 平台上使用。 Linux、Windows 和 Mac 的二进制文件以 tar 包形式在 [发布页面](https://github.com/derailed/k9s/releases) 中提供。 * 通过 [Homebrew](https://brew.sh/) 在 macOS 或 Linux 上安装 brew install derailed/k9s/k9s * 通过 [MacPorts](https://www.macports.org) sudo port install k9s * 通过 [snap](https://snapcraft.io/k9s) 在 Linux 上安装 snap install k9s --devmode * 在 Arch Linux 上 pacman -S k9s * 在 OpenSUSE Linux 发行版上 zypper install k9s * 在 FreeBSD 上 pkg install k9s * 在 Ubuntu 上 wget https://github.com/derailed/k9s/releases/latest/download/k9s_linux_amd64.deb && sudo apt install ./k9s_linux_amd64.deb && rm k9s_linux_amd64.deb * 在 Fedora (42+) 上 dnf install k9s * 通过 [Winget](https://github.com/microsoft/winget-cli) 在 Windows 上安装 winget install k9s * 通过 [Scoop](https://scoop.sh) 在 Windows 上安装 scoop install k9s * 通过 [Chocolatey](https://chocolatey.org/packages/k9s) 在 Windows 上安装 choco install k9s * 通过 GO install 安装 # 注意:这将生效开发版本! go install github.com/derailed/k9s@latest * 通过 [Webi](https://webinstall.dev) 在 Linux 和 macOS 上安装 curl -sS https://webinstall.dev/k9s | bash * 通过 [pkgx](https://pkgx.dev/pkgs/k9scli.io/) 在 Linux 和 macOS 上安装 pkgx k9s * 通过 [gah](https://github.com/marverix/gah) 在 Linux 和 macOS 上安装 gah install k9s * 通过 [Webi](https://webinstall.dev) 在 Windows 上安装 curl.exe -A MS https://webinstall.dev/k9s | powershell * 作为 [Docker Desktop 扩展](https://docs.docker.com/desktop/extensions/)(适用于 Docker Desktop 内置的 Kubernetes 服务器) docker extension install spurin/k9s-dd-extension:latest ## 从源码构建 K9s 目前使用 GO v1.23.X 或更高版本。 要从源码构建 K9s,你必须: 1. 克隆仓库 2. 构建并运行可执行文件 make build && ./execs/k9s ## 使用 Docker 运行 ### 运行官方 Docker 镜像 你可以通过挂载你的 `KUBECONFIG` 将 k9s 作为 Docker 容器运行: ``` docker run --rm -it -v $KUBECONFIG:/root/.kube/config derailed/k9s ``` 对于默认路径,它将是: ``` docker run --rm -it -v ~/.kube/config:/root/.kube/config derailed/k9s ``` ### 构建你自己的 Docker 镜像 你可以使用以下命令通过 [Dockerfile](Dockerfile) 构建你自己的 k9s Docker 镜像: ``` docker build -t k9s-docker:v0.0.1 . ``` 你可以获取最新的稳定版 `kubectl` 版本,并使用 `--build-arg` 选项将其传递给 `docker build` 命令。 你可以使用 `--build-arg` 选项传递任何有效的 `kubectl` 版本(例如 `v1.18.0` 或 `v1.19.1`)。 ``` KUBECTL_VERSION=$(make kubectl-stable-version 2>/dev/null) docker build --build-arg KUBECTL_VERSION=${KUBECTL_VERSION} -t k9s-docker:0.1 . ``` 运行你的容器: ``` docker run --rm -it -v ~/.kube/config:/root/.kube/config k9s-docker:0.1 ``` ## 预检 * K9s 使用 256 色终端模式。在 `Nix 系统上,请确保相应地设置了 TERM。 export TERM=xterm-256color * 为了发出资源编辑命令,请确保设置了 EDITOR 和 KUBE_EDITOR 环境变量。 # Kubectl edit 命令将使用此环境变量。 export KUBE_EDITOR=my_fav_editor * K9s 偏好较新的 Kubernetes 版本,即 1.28+ ## K8S 兼容性矩阵 | k9s | k8s 客户端 | | ------------------ | ---------- | | >= v0.27.0 | 1.26.1 | | v0.26.7 - v0.26.6 | 1.25.3 | | v0.26.5 - v0.26.4 | 1.25.1 | | v0.26.3 - v0.26.1 | 1.24.3 | | v0.26.0 - v0.25.19 | 1.24.2 | | v0.25.18 - v0.25.3 | 1.22.3 | | v0.25.2 - v0.25.0 | 1.22.0 | | <= v0.24 | 1.21.3 | ## 命令行 ``` # 列出当前版本 k9s version # 获取有关 K9s 运行时的信息(日志、配置等) k9s info # 列出所有可用的 CLI 选项 k9s help # 在指定的 namespace 中运行 K9s k9s -n mycoolns # 在现有的 KubeConfig context 中启动 K9s k9s --context coolCtx # 以 readonly 模式启动 K9s - 禁用所有集群修改命令 k9s --readonly ``` ## 日志和调试日志 鉴于 UI 的特性,k9s 会将日志生成到特定位置。 要查看日志并开启调试模式,请使用以下命令: ``` # 查看日志存储位置 k9s info ``` ``` ____ __.________ | |/ _/ __ \______ | < \____ / ___/ | | \ / /\___ \ |____|__ \ /____//____ > \/ \/ Version: vX.Y.Z Config: /Users/fernand/.config/k9s/config.yaml Logs: /Users/fernand/.local/state/k9s/k9s.log Dumps dir: /Users/fernand/.local/state/k9s/screen-dumps Benchmarks dir: /Users/fernand/.local/state/k9s/benchmarks Skins dir: /Users/fernand/.local/share/k9s/skins Contexts dir: /Users/fernand/.local/share/k9s/clusters Custom views file: /Users/fernand/.local/share/k9s/views.yaml Plugins file: /Users/fernand/.local/share/k9s/plugins.yaml Hotkeys file: /Users/fernand/.local/share/k9s/hotkeys.yaml Alias file: /Users/fernand/.local/share/k9s/aliases.yaml ``` ### 查看 K9s 日志 ``` tail -f /Users/fernand/.local/data/k9s/k9s.log ``` ### 以调试模式启动 K9s ``` k9s -l debug ``` ### 自定义日志目标位置 你可以使用 `--logFile` 参数覆盖默认的日志文件目标位置: ``` k9s --logFile /tmp/k9s.log less /tmp/k9s.log ``` 或者通过 `K9S_LOGS_DIR` 环境变量: ``` K9S_LOGS_DIR=/var/log k9s less /var/log/k9s.log ``` ## 快捷键绑定 K9s 使用别名来导航大多数 K8s 资源。 | 操作 | 命令 | 注释 | |---------------------------------------------------------------------------------|-------------------------------|------------------------------------------------------------------------| | 显示活动的键盘助记符和帮助 | `?` | | | 显示所有可用的资源别名 | `ctrl-a` | | | 退出 K9s | `:quit`, `:q`, `ctrl-c` | | | 向上/返回到上一个视图 | `esc` | 如果你开启了面包屑导航,这将返回到上一个 | | 使用单数/复数或短名称查看 Kubernetes 资源 | `:`pod⏎ | 接受单数、复数、短名称或别名,例如 pod 或 pods | | 在给定命名空间中查看 Kubernetes 资源 | `:`pod ns-x⏎ | | | 查看过滤后的 pods(v0.30.0 新增!) | `:`pod /fred⏎ | 查看所有被 fred 过滤的 pods | | 查看带有标签的 pods(v0.30.0 新增!) | `:`pod app=fred,env=dev⏎ | 查看所有标签匹配 app=fred 和 env=dev 的 pods | | 在给定上下文中查看 pods(v0.30.0 新增!) | `:`pod @ctx1⏎ | 查看上下文 ctx1 中的所有 pods。替换你当前的 k9s 上下文! | | 根据给定过滤器过滤资源视图 | `/`filter⏎ | 支持 Regex2,例如 `fred|blee` 来过滤名为 fred 或 blee 的资源 | | 反向正则表达式过滤器 | `/`! filter⏎ | 保留所有*不*匹配的内容。 | | 通过标签过滤资源视图 | `/`-l label-selector⏎ | | | 根据过滤器模糊查找资源 | `/`-f filter⏎ | | | 退出视图/命令/过滤模式 | `` | | | 查看并切换到另一个 Kubernetes 上下文(Pod 视图) | `:`ctx⏎ | | | 查看并直接切换到另一个 Kubernetes 上下文(上次使用的视图) | `:`ctx context-name⏎ | | | 查看并切换到另一个 Kubernetes 命名空间 | `:`ns⏎ | | | 切换回上次活动的命令(类似于 "cd -" 的工作方式) | `-` | 在底部添加面包屑的导航不是命令 | | 在命令历史记录中后退和前进 | 后退:`[`,前进:`]` | 同上 | | 查看所有保存的资源 | `:`screendump 或 sd⏎ | | | 删除资源(使用 TAB 和 ENTER 确认) | `ctrl-d` | | | 强制终止资源(无确认对话框,等同于 kubectl delete --now) | `ctrl-k` | | | 启动 pulses 视图 | `:`pulses 或 pu⏎ | | | 启动 XRay 视图 | `:`xray RESOURCE [NAMESPACE]⏎ | RESOURCE 可以是 po, svc, dp, rs, sts, ds 之一,NAMESPACE 为可选 | | 启动 Popeye 视图 | `:`popeye 或 pop⏎ | 参见 [popeye](#popeye) | | 标记资源 | `space` | | | 标记资源范围 | `ctrl-space` | | | 清除所有标记 | `ctrl-\` | | | 将资源保存到文件 | `ctrl-s` | | | 切换故障/错误显示 | `ctrl-z` | | | 切换宽列 | `ctrl-w` | | | 切换表头 | `ctrl-e` | | | 切换面包屑导航 | `ctrl-g` | | | 将选中的列向左移动 | `shift-left arrow` | | | 将选中的列向右移动 | `shift-right arrow` | | | 选中的列排序 | `shift-o` | | | 按名称排序 | `shift-n` | | | 按时间排序 | `shift-a` | | | 按命名空间排序 | `shift-p` | 仅在查看所有命名空间时可用 | | 按状态排序 | `shift-s` | | | 复制资源名称 | `c` | | | 复制命名空间 | `n` | | | 查看 YAML | `y` | | | 查看日志 | `l` | 特定资源 | | 查看之前的日志 | `p` | 特定资源 | | 进入容器 Shell | `s` | 仅限 Pods | | 连接到容器 | `a` | 仅限 Pods | | 描述资源 | `d` | | | 编辑资源 | `e` | 在只读模式下不可用 | | 显示端口转发 | `f` | Pods/Services/Containers | | 端口转发 | `shift-f` | Pods/Services/Containers | | 跳转到命名空间 | `w` | 当命名空间列可用时 | | 跳转到所有者 | `shift-j` | 当资源有所有者时 | | 使用/切换命名空间 | `u` | 命名空间视图 | | 使用者(显示使用此资源的对象) | `u` | ServiceAccounts/PVCs/Secrets/ConfigMaps | | 基准测试(运行/停止) | `b` | Services/Port-forwards | | 切换文本换行 | `w` | 日志视图 | | 切换时间戳 | `t` | 日志视图 | | 切换全屏 | `f` | 日志/YAML/详情视图 | | 刷新/重新加载视图 | `ctrl-r` | | | 触发 | `t` | CronJob 视图 | | 驱逐/取消驱逐节点 | `u` | 节点视图 | | 清空节点 | `r` | 节点视图 | | 重启资源 | `r` | Deployments/DaemonSets/StatefulSets | | 回滚资源 | `ctrl-l` | ReplicaSets | | 查看 ReplicaSets | `z` | Deployment 视图 | ## K9s 配置 K9s 将其配置保存为 `k9s` 目录中的 YAML 文件,其位置取决于你的操作系统。K9s 利用 [XDG](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) 来加载其各种配置文件。有关你操作系统默认位置的信息,请参见[此链接](https://github.com/adrg/xdg/blob/master/README.md)。如果你仍然感到困惑,运行快速的 `k9s info` 就能显示 k9s 从何处加载其配置。或者,你可以设置 `K9S_CONFIG_DIR` 来告知 K9s 提取其配置的目录位置。 | Unix | macOS | Windows | |-----------------|------------------------------------|-----------------------| | `~/.config/k9s` | `~/Library/Application Support/k9s` | `%LOCALAPPDATA%\k9s` | 你现在可以通过设置一个环境变量来覆盖上下文 portForward 的默认地址配置,该变量可以使用 `K9S_DEFAULT_PF_ADDRESS=a.b.c.d` 覆盖所有集群 portForward 的本地地址。 ``` # $XDG_CONFIG_HOME/k9s/config.yaml k9s: # Enable periodic refresh of resource browser windows. Default false liveViewAutoRefresh: false # !!New!! v0.50.8... # Extends the list of supported GPU vendors. The key is the vendor name, the value must correspond to k8s resource driver designation. # Default known GPU vendors: # nvidia: nvidia.com/gpu # nvidia-shared: nvidia.com/gpu.shared # amd: amd.com/gpu # intel: gpu.intel.com/i915 gpuVendors: bozo: bozo/gpu # extends the gpu vendor and add "bozo" # The path to screen dump. Default: '%temp_dir%/k9s-screens-%username%' (k9s info) screenDumpDir: /tmp/dumps # Represents ui poll intervals in seconds. Default 2.0 secs. Minimum value is 2.0 - values below will be capped to the minimum. refreshRate: 2 # Overrides the default k8s api server requests timeout. Defaults 120s apiServerTimeout: 15s # Number of retries once the connection to the api-server is lost. Default 15. maxConnRetry: 5 # Indicates whether modification commands like delete/kill/edit are disabled. Default is false readOnly: false # This setting allows users to specify the default view, but it is not set by default. defaultView: "" # Toggles whether k9s should exit when CTRL-C is pressed. When set to true, you will need to exit k9s via the :quit command. Default is false. noExitOnCtrlC: false #UI settings ui: # Enable mouse support. Default false enableMouse: false # Set to true to hide K9s header. Default false headless: false # Set to true to hide the K9S logo Default false logoless: false # Set to true to hide K9s crumbs. Default false crumbsless: false # Set to true to suppress the K9s splash screen on start. Default false. Note that for larger clusters or higher latency connections, there may be no resources visible initially until local caches have finished populating. splashless: false # Toggles icons display as not all terminal support these chars. Default: true noIcons: false # Toggles reactive UI. This option provide for watching on disk artifacts changes and update the UI live Defaults to false. reactive: false # By default all contexts will use the dracula skin unless explicitly overridden in the context config file. skin: dracula # => assumes the file skins/dracula.yaml is present in the $XDG_DATA_HOME/k9s/skins directory. Can be overriden with K9S_SKIN. # Convert dark skins to light, or vice versa, preserving hue. Default: false invert: false # Allows to set certain views default fullscreen mode. (yaml, helm history, describe, value_extender, details, logs) Default false defaultsToFullScreen: false # Show full resource GVR (Group/Version/Resource) vs just R. Default: false. useFullGVRTitle: false # Toggles icons display as not all terminal support these chars. noIcons: false # Toggles whether k9s should check for the latest revision from the GitHub repository releases. Default is false. skipLatestRevCheck: false # When altering kubeconfig or using multiple kube configs, k9s will clean up clusters configurations that are no longer in use. Setting this flag to true will keep k9s from cleaning up inactive cluster configs. Defaults to false. keepMissingClusters: false # Logs configuration logger: # Defines the number of lines to return. Default 100 tail: 200 # Defines the total number of log lines to allow in the view. Default 1000 buffer: 500 # Represents how far to go back in the log timeline in seconds. Setting to -1 will tail logs. Default is -1. sinceSeconds: 300 # => tail the last 5 mins. # Toggles log line wrap. Default false textWrap: false # Autoscroll in logs will be disabled. Default is false. disableAutoscroll: false # Enable column locking when autoscroll is enabled. Default is false. columnLock: false # Toggles log line timestamp info. Default false showTime: false # Provide shell pod customization when nodeShell feature gate is enabled! shellPod: # The shell pod image to use. image: killerAdmin # The namespace to launch to shell pod into. namespace: default # The resource limit to set on the shell pod. limits: cpu: 100m memory: 100Mi # Enable TTY tty: true hostPathVolume: - name: docker-socket # Mount the Docker socket into the shell pod mountPath: /var/run/docker.sock # The path on the host to mount hostPath: /var/run/docker.sock readOnly: true ``` ## Popeye 配置 K9s 集成了 [Popeye](https://popeyecli.io/),这是一个 Kubernetes 集群清理工具。Popeye 本身使用名为 `spinach.yml` 的配置,但在与 K9s 集成时,特定于集群的文件应命名为 `$XDG_CONFIG_HOME/share/k9s/clusters/clusterX/contextY/spinach.yml`。这允许你为每个集群设置不同的 spinach 配置。 ## Node Shell 通过在给定集群上启用 nodeShell 功能门,K9s 允许你通过 shell 进入你的集群节点。启用后,在节点视图中你将拥有一个新的 `s`(代表 `shell`)菜单选项。K9s 将使用特殊的 k9s_shell pod 在选定节点上启动一个 pod。此外,你可以通过使用预装了你喜欢的 shell 工具的自定义 Docker 镜像来改进你的 shell pod。默认情况下,k9s 使用 BusyBox 镜像,但你可以按以下方式进行配置: 或者,你现在可以通过设置一个环境变量来覆盖上下文配置,该变量可以使用 `K9S_FEATURE_GATE_NODE_SHELL=true|false` 覆盖所有集群的 node shell 门。 ``` # $XDG_CONFIG_HOME/k9s/config.yaml k9s: # You can also further tune the shell pod specification shellPod: image: cool_kid_admin:42 namespace: blee limits: cpu: 100m memory: 100Mi ``` 然后在你的集群配置文件中... ``` # $XDG_DATA_HOME/k9s/clusters/cluster-1/context-1 k9s: cluster: cluster-1 readOnly: false namespace: active: default lockFavorites: false favorites: - kube-system - default view: active: po featureGates: nodeShell: true # => Enable this feature gate to make nodeShell available on this cluster portForwardAddress: localhost ``` ### 自定义 Shell Pod 你还可以通过向你的 shell pod 添加 `hostPathVolume` 来自定义它。这允许你将本地目录或文件挂载到 shell pod 中。例如,如果你想把 Docker socket 挂载到 shell pod 中,你可以这样做: ``` k9s: shellPod: hostPathVolume: - name: docker-socket # Mount the Docker socket into the shell pod mountPath: /var/run/docker.sock # The path on the host to mount hostPath: /var/run/docker.sock readOnly: true ``` 这会将 Docker socket 挂载到 shell pod 的 `/var/run/docker.sock` 并将其设为只读。你也可以用类似的方式挂载任何其他目录或文件。 ## 命令别名 在 K9s 中,你可以定义你自己的命令别名(短名称)来访问你的资源。在你的 `$HOME/.config/k9s` 中创建一个名为 `aliases.yaml` 的文件。 K9s 别名定义了 alias:gvr 的键值对。gvr(Group/Version/Resource)代表一个完全限定的 Kubernetes 资源标识符。以下是一个别名文件的示例: ``` # $XDG_DATA_HOME/k9s/aliases.yaml aliases: pp: v1/pods crb: rbac.authorization.k8s.io/v1/clusterrolebindings # As of v0.30.0 you can also refer to another command alias... fred: pod fred app=blee # => view pods in namespace fred with labels matching app=blee ``` 使用此别名文件,你现在可以输入 `:pp` 或 `:crb` 或 `:fred` 来激活它们各自的命令。 ## 热键支持 进入命令模式并输入资源名称或别名,对于浏览常用资源来说可能比较繁琐。 我们引入了热键,允许用户定义自己的组合键来激活他们最喜欢的资源视图。 此外,你可以通过在 `$XDG_DATA_HOME/k9s/clusters/clusterX/contextY/hotkeys.yaml` 中添加上下文级别的配置文件来定义特定于上下文的热键。 要在全局范围内启用热键,请按照以下步骤操作: 1. 创建一个名为 `$XDG_CONFIG_HOME/k9s/hotkeys.yaml` 的文件 2. 将以下内容添加到你的 `hotkeys.yaml` 中。你可以使用资源名称/短名称来指定命令,即在命令模式下键入的内容。 # $XDG_CONFIG_HOME/k9s/hotkeys.yaml hotKeys: # 按下 Shift-0 导航到你的 pod 视图 shift-0: shortCut: Shift-0 description: 查看 pods command: pods # 按下 Shift-1 导航到你的 deployments shift-1: shortCut: Shift-1 description: 查看 deployments command: dp # 按下 Shift-2 导航到你的 xray deployments shift-2: shortCut: Shift-2 description: Xray Deployments command: xray deploy # 按下 Shift-S 查看当前选择所在命名空间中的资源 shift-s: shortCut: Shift-S override: true # => 如果设置为 true,将覆盖与默认快捷方式相关的操作(默认为 false) description: 命名空间资源 command: "$RESOURCE_NAME $NAMESPACE" keepHistory: true # 是否可以返回到上一个视图 感觉不太顺手?你的自定义热键将列在帮助视图 `?` 中。 此外,你的热键文件将自动重新加载,因此你可以在定义热键后立即使用它们。 你可以选择任何对你来说有意义的键盘快捷键,只要它们不属于 K9s 的标准快捷键列表即可。 同样,在热键中引用环境变量也是受支持的。可用的环境变量可以参考 [Plugins](#plugins) 部分中的描述。 ## 通过 WebSockets 端口转发 K9s 遵循 `kubectl` 的特性标志环境变量来启用/禁用通过 websockets 的端口转发。(在 >1.30 版本中默认启用)。 要禁用 Websocket 支持,请设置 `KUBECTL_PORT_FORWARD_WEBSOCKETS=false` ## FastForwards 从 v0.25.0 开始,你可以利用 `FastForwards` 功能告诉 K9s 如何默认处理 port-forwards。在处理多个容器或暴露多个端口的容器的情况下,从对话框中指定所需的 port-forward 可能会很麻烦,因为在大多数情况下,你已经知道你想要的 container/port 元组。对于这些用例,你现在可以使用以下注解来标注你的清单: @ `k9scli.io/auto-port-forwards` 直接激活一个或多个 port-forwards,完全绕过 port-forward 对话框。 @ `k9scli.io/port-forwards` 在启动 port-forward 对话框时预先选择一个或多个 port-forwards。 注解值的格式为 `container-name::[local-port:]container-port` ### 示例 ``` # Pod fred apiVersion: v1 kind: Pod metadata: name: fred annotations: k9scli.io/auto-port-forwards: zorg::5556 # => will default to container zorg port 5556 and local port 5566. No port-forward dialog will be shown. # Or... k9scli.io/port-forwards: bozo::9090:p1 # => launches the port-forward dialog selecting default port-forward on container bozo port named p1(8081) # mapping to local port 9090. ... spec: containers: - name: zorg ports: - name: p1 containerPort: 5556 ... - name: bozo ports: - name: p1 containerPort: 8081 - name: p2 containerPort: 5555 ... ``` 注解值必须指定要转发到的容器,以及本地端口和容器端口。容器端口可以指定为端口号或端口名称。如果省略本地端口,则本地端口将默认为容器端口号。以下是一些示例: 1. bozo::http - 在容器 `bozo` 上创建一个 port-forward,端口名称为 http。如果 http 指定的端口号为 8080,那么本地端口也将是 8080。 2. bozo::9090:http - 在容器 `bozo` 上创建一个 port-forward,将本地端口 9090 映射到 http(8080) 3. bozo::9090:8080 - 在容器 `bozo` 上创建一个 port-forward,将本地端口 9090 映射到 8080 ## 自定义视图 [SneakCast v0.17.0 在海滩上!- 是的!声音很糟糕,但场景多么棒!](https://youtu.be/7S33CNLAofk) 你可以通过自定义视图来更改给定资源显示的列。要启用此功能,你需要创建一个新的配置文件,即 `$XDG_CONFIG_HOME/k9s/views.yaml`。此文件利用 GVR (Group/Version/Resource) 来配置关联的表视图列。如果视图未找到 GVR,则将接管默认渲染(即我们目前所拥有的)。选择宽视图将添加给定资源上可用的所有剩余列,并显示在你的自定义列之后。此外,你可以编辑你的视图配置文件并实时调整你的资源视图! 📢 🎉 从 `release v0.40.0` 开始,你可以指定 json 解析表达式以进一步自定义你的资源渲染。 新的列语法如下: 其中 `:json_parse_expression` 表示一个表达式,用于从资源清单中提取特定片段。 类似于 `kubectl -o custom-columns` 命令。此表达式是可选的。 此外,你可以指定列属性以进一步定制列的渲染。 要使用此功能,你需要添加一个 `|` 指示符,后跟你的渲染配置。 你可以使用以下一个或多个属性: * `T` -> 时间列指示器 * `N` -> 数字列指示器 * `W` -> 开启宽列,即仅在宽模式下显示。如果存在,则默认为标准资源定义。 * `S` -> 确保列可见且不是宽列。如果存在,将覆盖 `wide` 标准资源定义。 * `H` -> 隐藏列 * `L` -> 左对齐(默认) * `R` -> 右对齐 以下是一个自定义 pods 和 services 视图的示例配置。 ``` # $XDG_CONFIG_HOME/k9s/views.yaml views: v1/pods: columns: - AGE - NAMESPACE|WR # => 🌚 Specifies the NAMESPACE column to be right aligned and only visible while in wide mode - ZORG:.metadata.labels.fred\.io\.kubernetes\.blee # => 🌚 extract fred.io.kubernetes.blee label into it's own column - BLEE:.metadata.annotations.blee|R # => 🌚 extract annotation blee into it's own column and right align it - NAME - IP - NODE - STATUS - READY - MEM/RL|S # => 🌚 Overrides std resource default wide attribute via `S` for `Show` - '%MEM/R|' # => NOTE! column names with non alpha names need to be quoted as columns must be strings! v1/pods@fred: # => 🌚 New v0.40.6! Customize columns for a given resource and namespace! columns: - AGE - NAME|WR v1/pods@kube*: # => 🌚 New v0.40.6! You can also specify a namespace using a regular expression. columns: - NAME - AGE - LABELS cool-kid: # => 🌚 New v0.40.8! You can also reference a specific alias and display a custom view for it columns: - AGE - NAMESPACE|WR v1/services: columns: - AGE - NAMESPACE - NAME - TYPE - CLUSTER-IP ``` ## 插件 K9s 允许你通过定义你自己的集群命令(通过插件)来扩展你的命令行和工具。 至少,我们会查找 `$XDG_CONFIG_HOME/k9s/plugins.yaml` 以定位所有可用的插件。 此外,K9s 将扫描以下目录以获取额外的插件: * `$XDG_CONFIG_HOME/k9s/plugins` * `$XDG_DATA_HOME/k9s/plugins` * `$XDG_DATA_DIRS/k9s/plugins` 插件文件内容可以是单个插件片段、片段集合或完整的插件定义(参见下面的示例...)。 插件的定义如下: * Shortcut 选项表示用户为激活插件而键入的组合键。有效值为 [a-z]、Shift-[A-Z]、Ctrl-[A-Z]。 * Override 选项使得与快捷方式相关的默认操作将被插件覆盖 * Confirm 选项(启用时)让你看到即将执行的命令,并让你选择确认或阻止执行 * Description 将打印在 k9s 菜单中快捷方式的旁边 * Scopes 定义了与插件关联的视图的资源名称/短名称的集合。你可以指定 `all` 来为所有视图提供此快捷方式。 * Command 表示插件激活时运行的临时命令 * Background 指定命令是否在后台运行 * Args 指定应用于上述命令的各种参数 * OverwriteOutput 布尔选项允许插件开发者在插件 stdout 执行时提供自定义消息。参见 [#2644](https://github.com/derailed/k9s/pull/2644) 中的示例 * Dangerous 布尔选项允许在只读模式时禁用该插件。参见 [#2604](https://github.com/derailed/k9s/issues/2604) * Inputs 定义在执行插件之前提示用户输入的字段列表(见下文) #### 插件输入 插件可以定义输入字段,在执行前提示用户提供值。当你需要动态值(如副本数量、环境变量或配置文件选择)时,这非常有用。每个插件最多允许 5 个输入。 每个输入具有以下属性: * `name` (必填) -- 输入标识符,用于在参数中以 `$INPUT_` (大写) 形式引用该值 * `label` -- 在输入对话框中向用户显示的标签 * `type` (必填) -- 输入类型:`string`、`number`、`bool` 或 `dropdown` * `required` -- 当设置为 true 时,用户必须提供一个值才能执行插件 * `default` -- 在输入字段中预填充的默认值(必须是 `dropdown` 的有效选项,`bool` 的 `"true"`/`"false"`,或 `number` 的有效数字) * `options` -- 仅用于 `dropdown` 类型,定义可用选择的列表 输入值可在插件参数中使用 `$INPUT_` 格式获取,其中 `` 是输入名称的大写版本。 **输入类型:** | 类型 | 描述 | UI 元素 | |------|-------------|------------| | `string` | 自由格式的文本输入 | 文本字段 | | `number` | 数字输入(整数和浮点数) | 带有数字验证的文本字段 | | `bool` | 布尔切换 | 复选框 | | `dropdown` | 从预定义选项中选择 | 下拉菜单 | **示例:** ``` plugins: demo-inputs: shortCut: Ctrl-Y description: Demo all input types scopes: - po command: bash background: false args: - -c - >- echo "=== Plugin input demo ===" && echo "" && echo "Pod: $NAME" && echo "Namespace: $NAMESPACE" && echo "Context: $CONTEXT" && echo "" && echo "=== Your inputs ===" && if [ -n "$INPUT_MESSAGE" ]; then echo "Message: $INPUT_MESSAGE (set)"; else echo "Message: (not set)"; fi && if [ -n "$INPUT_COUNT" ]; then echo "Count: $INPUT_COUNT (set)"; else echo "Count: (not set)"; fi && if [ -n "$INPUT_ENABLED" ]; then echo "Enabled: $INPUT_ENABLED (set)"; else echo "Enabled: (not set)"; fi && if [ -n "$INPUT_ENVIRONMENT" ]; then echo "Environment: $INPUT_ENVIRONMENT (set)"; else echo "Environment: (not set)"; fi && echo "" && read -p "Press Enter to return to k9s..." inputs: - name: message label: Enter a message type: string required: true default: hello world - name: count label: Enter a number type: number required: true default: 3 - name: enabled label: Enable feature type: bool required: false default: true - name: environment label: Select environment type: dropdown required: true default: staging options: - development - staging - production ``` 有关插件输入的真实示例,请参见 [pvc-resize.yaml](plugins/pvc-resize.yaml),它会在调整大小前提示用户输入新的 PVC 大小。 K9s 确实为你提供了额外的环境变量来自定义你的插件参数。当前可用的环境变量如下: * `$RESOURCE_GROUP` -- 选定的资源 group * `$RESOURCE_VERSION` -- 选定的资源 api version * `$RESOURCE_NAME` -- 选定的资源名称 * `$NAMESPACE` -- 选定的资源命名空间 * `$NAME` -- 选定的资源名称 * `$CONTAINER` -- 当前的容器(如果适用) * `$FILTER` -- 当前的过滤器(如果有) * `$KUBECONFIG` -- KubeConfig 位置。 * `$CLUSTER` 活动集群名称 * `$CONTEXT` 活动上下文名称 * `$USER` 活动用户 * `$GROUPS` 活动组 * `$POD` 在容器视图中时 * `$COL-` 使用给定列名作为查看资源的参数。必须以 `COL-` 为前缀! 花括号可用于将环境变量嵌入到另一个字符串中,或者如果列名包含特殊字符。(例如 `${NAME}-example` 或 `${COL-%CPU/L}`) ### 插件示例 在一个文件中定义多个插件并托管它们。它们可以存放在 K9s 根配置中,以便在任何集群上都可用。此外,你可以通过添加 clusterA/contextB/plugins.yaml 文件,为你选择的集群定义特定于集群/上下文的插件。 下面定义了一个插件,用于使用 `ctrl-l` 作为快捷键查看选定 pod 的日志。 ``` # 在 K9s 根配置的单个文件中定义多个插件 # $XDG_DATA_HOME/k9s/plugins.yaml plugins: # Defines a plugin to provide a `ctrl-l` shortcut to tail the logs while in pod view. fred: shortCut: Ctrl-L override: false overwriteOutput: false confirm: false dangerous: false description: Pod logs scopes: - pods command: kubectl background: false args: - logs - -f - $NAME - -n - $NAMESPACE - --context - $CONTEXT ``` 同样,你可以使用每个文件一个插件或每个文件多个插件的方式在目录中定义上述插件,如下所示... 下面定义了两个插件,即 fred 和 zorg。 ``` # 单个文件中的多个插件... # 注意:从 v0.40.9 版本开始,您可以拥有临时的插件目录 # 加载插件 fred 和 zorg # $XDG_DATA_HOME/k9s/plugins/misc-plugins/blee.yaml fred: shortCut: Shift-B description: Bozo scopes: - deploy command: bozo zorg: shortCut: Shift-Z description: Pod logs scopes: - svc command: zorg ``` 最后,你可以在它们自己的文件中定义插件片段。该片段将根据文件名命名。在这种情况下,我们使用插件片段定义了一个 `bozo` 插件。 ``` # $XDG_DATA_HOME/k9s/plugins/schtuff/bozo.yaml shortCut: Shift-B description: Bozo scopes: - deploy command: bozo ``` ## 对你的应用进行基准测试 K9s 集成了才华横溢的 [Jaana Dogan](https://github.com/rakyll) 开发的 [Hey](https://github.com/rakyll/hey)。`Hey` 是一个用于对 HTTP 端点进行基准测试的 CLI 工具,类似于 AB bench。这个初步功能目前支持对 port-forwards 和 services 进行基准测试(请理解这还是全新的功能!)。 要设置 port-forward,你需要导航到 PodView,选择一个 pod 和一个暴露给定端口的容器。使用 `SHIFT-F` 会弹出一个对话框,允许你指定要转发的本地端口。确认后,你可以导航到 PortForward 视图(别名 `pf`),其中列出了你活动的 port-forwards。选择一个 port-forward 并使用 `CTRL-B` 将对该 HTTP 端点运行基准测试。要查看基准测试运行的结果,请转到 Benchmarks 视图(别名 `be`)。你现在应该能够选择一个基准测试并按 `` 查看运行统计数据详情。注意:Port-forwards 仅在 K9s 会话期间持续存在,并将在退出时终止。 最初,基准测试将使用以下默认值运行: * 并发级别:1 * 请求数量:200 * HTTP 动词:GET * 路径:/ PortForward 视图由一个新的 K9s 配置文件支持,即:`$XDG_DATA_HOME/k9s/clusters/clusterX/contextY/benchmarks.yaml`。你连接的每个集群都将拥有自己的 bench 配置文件,其中包含该集群的 K8s 上下文名称。对此文件的更改应自动更新 PortForward 视图,以指示你希望如何运行基准测试。 基准测试结果报告存储在 `$XDG_STATE_HOME/k9s/clusters/clusterX/contextY` 以下是一个 benchmarks.yaml 配置示例。请记住,此文件很可能会在后续版本中更改! ``` # 此文件位于 $XDG_DATA_HOME/k9s/clusters/clusterX/contextY/benchmarks.yaml benchmarks: # Indicates the default concurrency and number of requests setting if a container or service rule does not match. defaults: # One concurrent connection concurrency: 1 # Number of requests that will be sent to an endpoint requests: 500 containers: # Containers section allows you to configure your http container's endpoints and benchmarking settings. # NOTE: the container ID syntax uses namespace/pod-name:container-name default/nginx:nginx: # Benchmark a container named nginx using POST HTTP verb using http://localhost:port/bozo URL and headers. concurrency: 1 requests: 10000 http: path: /bozo method: POST body: {"fred":"blee"} header: Accept: - text/html Content-Type: - application/json services: # Similarly you can Benchmark an HTTP service exposed either via NodePort, LoadBalancer types. # Service ID is ns/svc-name default/nginx: # Set the concurrency level concurrency: 5 # Number of requests to be sent requests: 500 http: method: GET # This setting will depend on whether service is NodePort or LoadBalancer. NodePort may require vendor port tunneling setting. # Set this to a node if NodePort or LB if applicable. IP or dns name. host: A.B.C.D path: /bumblebeetuna auth: user: jean-baptiste-emmanuel password: Zorg! ``` ## K9s RBAC 进阶 在启用了 RBAC 的集群上,你需要授予你的用户/组相应的权限,以便他们能够使用 K9s 探索其 Kubernetes 集群。K9s 至少需要在集群和命名空间级别拥有读取权限才能显示资源和指标。 以下规则仅为建议。你需要根据你的环境策略对其进行自定义。如果你需要编辑/删除资源,还需要额外的配置。 ### 集群 RBAC 范围 ``` --- # K9s Reader ClusterRole kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: k9s rules: # Grants RO access to cluster resources node and namespace - apiGroups: [""] resources: ["nodes", "namespaces"] verbs: ["get", "list", "watch"] # Grants RO access to RBAC resources - apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "roles", "clusterrolebindings", "rolebindings"] verbs: ["get", "list", "watch"] # Grants RO access to CRD resources - apiGroups: ["apiextensions.k8s.io"] resources: ["customresourcedefinitions"] verbs: ["get", "list", "watch"] # Grants RO access to metric server (if present) - apiGroups: ["metrics.k8s.io"] resources: ["nodes", "pods"] verbs: ["get", "list", "watch"] --- # K9s 用户 ClusterRoleBinding 示例 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: k9s subjects: - kind: User name: fernand apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: k9s apiGroup: rbac.authorization.k8s.io ``` ### 命名空间 RBAC 范围 如果你的用户被限制在某些命名空间中,K9s 将需要以下角色来启用对命名空间资源的读取访问。 ``` --- # K9s Reader Role(默认 namespace) kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: k9s namespace: default rules: # Grants RO access to most namespaced resources - apiGroups: ["", "apps", "autoscaling", "batch", "extensions"] resources: ["*"] verbs: ["get", "list", "watch"] # Grants RO access to metric server - apiGroups: ["metrics.k8s.io"] resources: ["pods", "nodes"] verbs: - get - list - watch --- # K9s 用户 RoleBinding 示例 apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: k9s namespace: default subjects: - kind: User name: fernand apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: k9s apiGroup: rbac.authorization.k8s.io ``` ## 皮肤 示例:Dracula 皮肤 ;) Dracula Skin 你可以根据你自己的视觉和风格偏好来对 K9s 进行样式设计。皮肤是 YAML 文件,允许用户更改 K9s 的呈现层。有关示例,请参见此仓库的 `skins` 目录。 你可以通过指定 UI.skin 属性来设置默认的 k9s 皮肤。你还可以根据你连接的上下文来更改 K9s 皮肤。 在这种情况下,你可以在集群配置上指定一个 skin 字段,例如 `skin: dracula`(只需皮肤文件的名称,不带扩展名!),并将此仓库的 `skins/dracula.yaml` 复制到 `$XDG_CONFIG_HOME/k9s/skins/` 目录中。你也可以通过在环境中设置 `K9S_SKIN` 来更改皮肤,例如 `export K9S_SKIN="dracula"`。 如果你的集群跨越多个上下文,你可以在上下文配置中添加皮肤上下文配置。 这是一组 {context_name, skin} 元组的集合(请参见下面的示例!) 颜色可以通过名称或使用十六进制表示来定义。最近,我们添加了一个名为 `default` 的颜色,用于指示透明背景颜色,以便在需要时保留你的终端背景颜色设置。 要为特定上下文设置皮肤,前提是你的 skins 目录中存在 `in-the-navy.yaml` 文件。 ``` # $XDG_DATA_HOME/k9s/clusters/clusterX/contextY/config.yaml k9s: cluster: clusterX skin: in-the-navy readOnly: false namespace: active: default lockFavorites: false favorites: - kube-system - default view: active: po featureGates: nodeShell: false portForwardAddress: localhost ``` 你也可以在根 k9s 配置文件中为所有上下文指定一个默认皮肤,如下所示: ``` # $XDG_CONFIG_HOME/k9s/config.yaml k9s: liveViewAutoRefresh: false screenDumpDir: /tmp/dumps refreshRate: 2 maxConnRetry: 5 readOnly: false noExitOnCtrlC: false ui: enableMouse: false headless: false logoless: false crumbsless: false splashless: false noIcons: false invert: false # Toggles reactive UI. This option provide for watching on disk artifacts changes and update the UI live Defaults to false. reactive: false # By default all contexts will use the dracula skin unless explicitly overridden in the context config file. skin: dracula # => assumes the file skins/dracula.yaml is present in the $XDG_DATA_HOME/k9s/skins directory defaultsToFullScreen: false skipLatestRevCheck: false disablePodCounting: false shellPod: image: busybox namespace: default limits: cpu: 100m memory: 100Mi imageScans: enable: false exclusions: namespaces: [] labels: {} logger: tail: 100 buffer: 5000 sinceSeconds: -1 textWrap: false disableAutoscroll: false columnLock: false showTime: false thresholds: cpu: critical: 90 warn: 70 memory: critical: 90 warn: 70 ``` ``` # $XDG_DATA_HOME/k9s/skins/in-the-navy.yaml # 皮肤 InTheNavy! k9s: # General K9s styles body: fgColor: dodgerblue bgColor: '#ffffff' logoColor: '#0000ff' # ClusterInfoView styles. info: fgColor: lightskyblue sectionColor: steelblue # Help panel styles help: fgColor: white bgColor: black keyColor: cyan numKeyColor: blue sectionColor: gray frame: # Borders styles. border: fgColor: dodgerblue focusColor: aliceblue # MenuView attributes and styles. menu: fgColor: darkblue # Style of menu text. Supported options are "dim" (default), "normal", and "bold" fgStyle: dim keyColor: cornflowerblue # Used for favorite namespaces numKeyColor: cadetblue # CrumbView attributes for history navigation. crumbs: fgColor: white bgColor: steelblue activeColor: skyblue # Resource status and update styles status: newColor: '#00ff00' modifyColor: powderblue addColor: lightskyblue errorColor: indianred highlightcolor: royalblue killColor: slategray completedColor: gray # Border title styles. title: fgColor: aqua bgColor: white highlightColor: skyblue counterColor: slateblue filterColor: slategray views: # TableView attributes. table: fgColor: blue bgColor: darkblue cursorColor: aqua # Header row styles. header: fgColor: white bgColor: darkblue sorterColor: orange selectedSortColumnColor: lightskyblue # YAML info styles. yaml: keyColor: steelblue colonColor: blue valueColor: royalblue # Logs styles. logs: fgColor: lightskyblue bgColor: black indicator: fgColor: dodgerblue bgColor: black toggleOnColor: limegreen toggleOffColor: gray ``` ## 贡献者 如果没有这些优秀人才的贡献,这个项目将彻底泡汤! ## 已知问题 这仍在开发中!如果某些东西损坏了或者有你想要的功能, 请提交 issue,如果愿意的话也可以提交 PR! 如果出现以下情况,K9s 很可能会崩溃... 1. 你正在运行旧版本的 Kubernetes。K9s 在较新的 Kubernetes 版本上运行效果最好。 2. 你没有足够的 RBAC 权限来管理你的集群。 ## 致谢! K9s 建立在许多开源项目和库之上。我们*衷心*感谢所有在夜晚和周末工作以使该项目成为现实的 OSS 贡献者! ## 认识核心团队! 如果你精通 GO 和 K8s,并愿意贡献你的时间来帮助维护和增强这个项目,请联系我。 * [Fernand Galiana](https://github.com/derailed) * email fernand@imhotep.io * twitter [@kitesurfer](https://twitter.com/kitesurfer?lang=en) 我们总是很高兴听到从我们的工作中受益的人们的声音! ## 贡献指南 * 在提交 PR 之前,请先提交 issue! * 确保所有导出的项都已正确注释 * 如果适用,请针对你的 PR 提交测试套件 Imhotep  © 2026 Imhotep Software LLC. 所有材料均根据 [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0) 授权
标签:Awesome, DNS解析, EVTX分析, Go语言, K9s, TUI, 子域名突变, 容器编排, 开源项目, 提示注入, 日志审计, 日志查看, 程序破解, 系统管理, 终端UI, 资源监控, 资源观测, 运维工具, 集群管理