update docs + fix all ns issue #326

mine
derailed 2019-10-04 08:30:12 -06:00
parent d0156c5995
commit 87fbc9c9aa
4 changed files with 107 additions and 51 deletions

View File

@ -60,6 +60,26 @@ K9s is available on Linux, OSX and Windows platforms.
---
## Screenshots
1. Pods
<img src="assets/screen_po.png"/>
1. Logs
<img src="assets/screen_logs.png"/>
1. Deployments
<img src="assets/screen_dp.png"/>
---
## Demo Video
* [K9s v0.9.0](https://www.youtube.com/watch?v=bxKfqumjW4I)
* [K9s v0.7.0 Features](https://youtu.be/83jYehwlql8)
* [K9s v0 Demo](https://youtu.be/k7zseUhaXeU)
---
## The Command Line
```shell
@ -80,13 +100,13 @@ k9s --context coolCtx
K9s uses aliases to navigate most K8s resources.
| Command | Result | Example |
|-----------------------------|----------------------------------------------------|----------------------------|
| --------------------------- | -------------------------------------------------- | -------------------------- |
| `:`alias`<ENTER>` | View a Kubernetes resource aliases | `:po<ENTER>` |
| `?` | Show keyboard shortcuts and help | |
| `Ctrl-a` | Show all available resource alias | select+`<ENTER>` to view |
| `/`filter`ENTER` | Filter out a resource view given a filter | `/bumblebeetuna` |
| `/`-l label-selector`ENTER` | Filter resource view by labels | `/-l app=fred` |
| `<Esc>` | Bails out of command mode | |
| `<Esc>` | Bails out of command/filter mode | |
| `d`,`v`, `e`, `l`,... | Key mapping to describe, view, edit, view logs,... | `d` (describes a resource) |
| `:`ctx`<ENTER>` | To view and switch to another Kubernetes context | `:`+`ctx`+`<ENTER>` |
| `Ctrl-d` | To delete a resource (TAB and ENTER to confirm) | |
@ -95,23 +115,6 @@ K9s uses aliases to navigate most K8s resources.
---
## Demo Video
1. [K9s v0 Demo](https://youtu.be/k7zseUhaXeU)
2. [K9s v0.7.0 Features](https://youtu.be/83jYehwlql8)
## Screenshots
1. Pods
<img src="assets/screen_po.png"/>
1. Logs
<img src="assets/screen_logs.png"/>
1. Deployments
<img src="assets/screen_dp.png"/>
---
## K9s config file ($HOME/.k9s/config.yml)
K9s keeps its configurations in a dot file in your home directory.
@ -151,6 +154,62 @@ K9s uses aliases to navigate most K8s resources.
active: dp
```
---
## Aliases
In K9s you can define your own command aliases (shortnames) to access your resources. In your `$HOME/.k9s` define a file called `alias.yml`. A K9s alias defines pairs of alias:gvr. A gvr represents a fully qualified Kubernetes resource identifier. Here is an example of an alias file:
```yaml
# $HOME/.k9s/alias.yml
alias:
pp: v1/pods
crb: rbac.authorization.k8s.io/v1/clusterrolebindings
```
Using this alias file, you can now type pp/crb to list pods, clusterrolebindings respectively.
---
## Plugins
K9s allows you to define your own cluster commands via plugins. K9s will look at `$HOME/.k9s/plugin.yml` to locate available plugins. A plugin is defined as follows:
```yaml
# $HOME/.k9s/plugin.yml
plugin:
fred:
shortCut: Ctrl-L
description: "Pod logs"
scopes:
- po
command: /usr/local/bin/kubectl
background: false
args:
- logs
- -f
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
```
This defines a plugin for viewing logs on a selected pod using `CtrlL` mnemonic.
The shortcut option represents the command a user would type to activate the plugin. The command represents adhoc commands the plugin runs upon activation. The scopes defines a collection of views shortnames for which the plugin shortcut will be made available to the user.
K9s does provide additional enviroment variables for you to customize your plugins. Currently the available environment are as follows:
* `$NAMESPACE` -- the selected resource namespace
* `$NAME` -- the selected resource name
* `$KUBECONFIG` -- the KubeConfig location.
* `$CLUSTER` the active cluster name
* `$CONTEXT` the active context name
* `$USER` the active user
* `$GROUPS` the active groups
* `$COLX` the column at index X for the viewed resource
NOTE: This is an experimental feature! Options and layout may change in future K9s releases as this feature solidifies.
---
## Benchmarking
@ -391,7 +450,7 @@ k9s:
Available color names are defined below:
| Color Names | | | | |
|----------------------|----------------|------------------|-------------------|-----------------|
| -------------------- | -------------- | ---------------- | ----------------- | --------------- |
| black | maroon | green | olive | navy |
| purple | teal | silver | gray | red |
| lime | yellow | blue | fuchsia | aqua |

View File

@ -109,7 +109,7 @@ func (a *appView) Init(version string, rate int) {
main.AddItem(a.indicator(), 1, 1, false)
main.AddItem(a.Frame(), 0, 10, true)
main.AddItem(a.Crumbs(), 2, 1, false)
main.AddItem(a.Flash(), 1, 1, false)
main.AddItem(a.Flash(), 2, 1, false)
a.toggleHeader(!a.Config.K9s.GetHeadless())
}
@ -206,6 +206,9 @@ func (a *appView) refreshIndicator() {
}
func (a *appView) switchNS(ns string) bool {
if ns == resource.AllNamespace {
ns = resource.AllNamespaces
}
if ns == a.Config.ActiveNamespace() {
log.Debug().Msgf("Namespace did not change %s", ns)
return true

View File

@ -4,7 +4,6 @@ import (
"fmt"
"regexp"
"strings"
"time"
"github.com/derailed/k9s/internal/k8s"
"github.com/derailed/k9s/internal/resource"
@ -52,8 +51,6 @@ func (c *command) defaultCmd() {
}
}
// Helpers...
var authRX = regexp.MustCompile(`\Apol\s([u|g|s]):([\w-:]+)\b`)
func (c *command) isK9sCmd(cmd string) bool {
@ -110,11 +107,6 @@ func (c *command) viewMetaFor(cmd string) (string, *viewer) {
// Exec the command by showing associated display.
func (c *command) run(cmd string) bool {
log.Debug().Msgf("Running command %v", cmd)
defer func(t time.Time) {
log.Debug().Msgf("RUN CMD Elapsed %v", time.Since(t))
}(time.Now())
if c.isK9sCmd(cmd) {
return true
}
@ -178,7 +170,7 @@ func (c *command) exec(gvr string, ns string, v ui.Igniter) bool {
}
g := k8s.GVR(gvr)
c.app.Flash().Infof("Viewing resource %s...", g.ToR())
c.app.Flash().Infof("Viewing %s resource...", g.ToR())
log.Debug().Msgf("Running command %s", gvr)
c.app.Config.SetActiveView(g.ToR())
c.app.Config.Save()

View File

@ -172,12 +172,11 @@ func (v *resourceView) enterCmd(evt *tcell.EventKey) *tcell.EventKey {
return nil
}
sel := v.masterPage().GetSelectedItem()
f := v.defaultEnter
if v.enterFn != nil {
v.enterFn(v.app, v.list.GetNamespace(), v.list.GetName(), sel)
} else {
v.defaultEnter(v.list.GetNamespace(), v.list.GetName(), sel)
f = v.enterFn
}
f(v.app, v.list.GetNamespace(), v.list.GetName(), v.masterPage().GetSelectedItem())
return nil
}
@ -220,7 +219,7 @@ func deletePortForward(ff map[string]forwarder, sel string) {
}
}
func (v *resourceView) defaultEnter(ns, _, selection string) {
func (v *resourceView) defaultEnter(app *appView, ns, _, selection string) {
if !v.list.Access(resource.DescribeAccess) {
return
}
@ -245,8 +244,8 @@ func (v *resourceView) describeCmd(evt *tcell.EventKey) *tcell.EventKey {
if !v.masterPage().RowSelected() {
return evt
}
v.defaultEnter(v.app, v.list.GetNamespace(), v.list.GetName(), v.masterPage().GetSelectedItem())
v.defaultEnter(v.list.GetNamespace(), v.list.GetName(), v.masterPage().GetSelectedItem())
return nil
}
@ -277,7 +276,6 @@ func (v *resourceView) editCmd(evt *tcell.EventKey) *tcell.EventKey {
return evt
}
kcfg := v.app.Conn().Config().Flags().KubeConfig
v.stopUpdates()
{
ns, po := namespaced(v.masterPage().GetSelectedItem())
@ -286,8 +284,8 @@ func (v *resourceView) editCmd(evt *tcell.EventKey) *tcell.EventKey {
args = append(args, v.list.GetName())
args = append(args, "-n", ns)
args = append(args, "--context", v.app.Config.K9s.CurrentContext)
if kcfg != nil && *kcfg != "" {
args = append(args, "--kubeconfig", *kcfg)
if cfg := v.app.Conn().Config().Flags().KubeConfig; cfg != nil && *cfg != "" {
args = append(args, "--kubeconfig", *cfg)
}
runK(true, v.app, append(args, po)...)
}
@ -315,7 +313,7 @@ func (v *resourceView) switchNamespaceCmd(evt *tcell.EventKey) *tcell.EventKey {
v.app.switchNS(ns)
v.setNamespace(ns)
v.app.Flash().Infof("Viewing `%s` namespace...", ns)
v.app.Flash().Infof("Viewing namespace `%s`...", ns)
v.refresh()
v.masterPage().UpdateTitle()
v.masterPage().SelectRow(1, true)
@ -346,10 +344,6 @@ func (v *resourceView) refresh() {
}
func (v *resourceView) namespaceActions(aa ui.KeyActions) {
ns, err := v.app.Conn().Config().CurrentNamespaceName()
if err == nil && ns != resource.AllNamespace {
return
}
if !v.list.Access(resource.NamespaceAccess) {
return
}
@ -473,6 +467,12 @@ func (v *resourceView) defaultK9sEnv() K9sEnv {
if err != nil {
groups = []string{"n/a"}
}
var cfg string
kcfg := v.app.Conn().Config().Flags().KubeConfig
if kcfg != nil && *kcfg != "" {
cfg = *kcfg
}
env := K9sEnv{
"NAMESPACE": ns,
"NAME": n,
@ -480,7 +480,9 @@ func (v *resourceView) defaultK9sEnv() K9sEnv {
"CLUSTER": cluster,
"USER": user,
"GROUPS": strings.Join(groups, ","),
"KUBECONFIG": cfg,
}
row := v.masterPage().GetRow()
for i, r := range row {
env["COL"+strconv.Itoa(i)] = r