From a4c7f3817e01cf445e4038a4788cd5c68d193cde Mon Sep 17 00:00:00 2001 From: derailed Date: Fri, 4 Dec 2020 10:18:37 -0700 Subject: [PATCH] cleanup + rel notes --- assets/k9salpha.png | Bin 0 -> 72287 bytes change_logs/release_v0.24.2.md | 97 +++++++++++++++++++++++++++++++++ internal/client/metrics.go | 4 +- internal/dao/port_forwarder.go | 17 ++---- internal/render/container.go | 39 +++++-------- internal/render/node.go | 25 +++------ internal/render/pod.go | 85 +++++++++-------------------- internal/render/pod_test.go | 4 +- internal/view/pf_extender.go | 2 +- 9 files changed, 154 insertions(+), 119 deletions(-) create mode 100644 assets/k9salpha.png create mode 100644 change_logs/release_v0.24.2.md diff --git a/assets/k9salpha.png b/assets/k9salpha.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcff2ba9054fb9f01f0dee8af3a61532f464ecd GIT binary patch literal 72287 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ƒ!EllRbiEx-OhD& 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 + +# Release v0.24.2 + +## Notes + +Thank you to all that contributed with flushing out issues and enhancements for K9s! I'll try to mark some of these issues as fixed. But if you don't mind grab the latest rev and see if we're happier with some of the fixes! If you've filed an issue please help me verify and close. Your support, kindness and awesome suggestions to make K9s better are as ever very much noted and appreciated! + +If you feel K9s is helping your Kubernetes journey, please consider joining our [sponsorhip program](https://github.com/sponsors/derailed) and/or make some noise on social! [@kitesurfer](https://twitter.com/kitesurfer) + +On Slack? Please join us [K9slackers](https://join.slack.com/t/k9sers/shared_invite/enQtOTA5MDEyNzI5MTU0LWQ1ZGI3MzliYzZhZWEyNzYxYzA3NjE0YTk1YmFmNzViZjIyNzhkZGI0MmJjYzhlNjdlMGJhYzE2ZGU1NjkyNTM) + +## ♫ Sounds Behind The Release ♭ + +* [ZZ Top - My Head's in Mississippi](https://www.youtube.com/watch?v=0968f0VWvd8) + +## A Word From Our Sponsors... + +I would like to extend a `Big Thank You` to the following generous K9s friends for joining our sponsorship program and supporting this project! + +* [Tim Orling](https://github.com/moto-timo) +* [Jiri Valnoha](https://github.com/waldauf) +* [Osx2000](https://github.com/osx2000) + +## Our Release Heroes + +Please join me in recognizing and applauding this drop contributors that went the extra mile to make sure K9s is better and more useful for all of us!! + +Big ATTA BOY/GIRL! in full effect this week to the good folks below for their efforts and contributions to K9s!! + +* [Ainslie Hsu](https://github.com/ainslie-hsu) +* [Lucas Teligioridis](https://github.com/lucasteligioridis) +* [Gergely Tankovics](https://github.com/gtankovics) +* [Michal Kuratczyk](https://github.com/mkuratczyk) +* [Simon Caron](https://github.com/simoncaron) + +## She Can't Take Much More Capt'n!! + +### Background + +Thanks to all of you for supporting K9s and being avid fans. I am truly humbled and amazed by your continued kindness and support!! As we're nearing K9s second anniversary, the project has reached over 10k stars and 384k downloads! That said, while these numbers sound stunning, there is another number on this project that is not so and that is number of sponsors 😿. +As I understand it, there are a several organizations leveraging K9s productivity to better their bottom line, without much care for ours... +As you all know, K9s is a complex tool in a continually evolving space and we find ourselves spending a lot of our free time, thinking, experimenting and supporting K9s to continually improve the offering. As it stands, there is currently a very small fraction of you that actively sponsor this project either financially or by filing issues/PRs while the rest are benefiting from these efforts. This just does not sound like a fair deal and if we were in the music business it would be a total outrage! + +### There Are Some That Call Me... Alpha! + +To this end, I would like to introduce a new member of the K9s pack, the main dog, ie `k9sAlpha`. This is going to be a licensed version of K9s. The current plan is to offer a tiered license scheme starting at just `$10/month` for a basic license. The current K9s branch will be effectively in feature freeze. K9s𝞪 will provide fixes, enhancements, further integrations and a bunch of new features that have been sitting in the back burner. + + + +### So what does this entails? + +1. Current K9s branch will be in feature freeze and will remain OSS and free +1. Active K9s sponsors will get a corresponding K9s𝞪 license +1. Contributors will get a free K9s𝞪 license +1. K9s𝞪 users will need to purchase a license from our store +1. Documentation, binaries, issue trackers, will be provisioned under a new K9s𝞪 site + +Given any license schemes are all meant to be hacked, we're not going to over complicate things with calling out to license servers and such to ensure the keys are legit. +The current plan is to email out your license keys and trusting our `Gentlemen Agreement` that you will not share or distribute your keys to other folks. +In the current economic climate, if you can't afford a K9s𝞪 license, we will provide you one on a case by case basis. + +The process should be simple: + +1. Store your key somewhere on disk +2. Download the K9s𝞪 binary +3. Start administering your Kubernetes clusters + +### K9s𝞪 Needs You! + +To this end, I'd like to enlist a few of you to help me validate license keys, K9s𝞪 store and site to ensure the flow well... flows! +If you are so inclined, please reach out for your `shoephones` and send me an email with why you want to participate. Looking for folks with K9s chops in multi clusters env would be preferred. +It should not take too much of your time to ensure all is cool, but want to make sure I have at least another 5 pairs of eyes to help out with the K9s𝞪 drop. +My hope is to get an initial K9s𝞪 revision dropped before Santa comes around... + +### Pipe In! + +By all means, this is a democracy and not a dictatorship! So... if you have better/other ideas or concerns please pipe in! Open an issue on the repo so we can track, discuss, opiniate and figure out a course of action that will be fair for both K9s contributors and users alike. + +--- + +## Resolved Issues/Features + +* [Issue #972](https://github.com/derailed/k9s/issues/972) Default color is no longer transparent. +* [Issue #933](https://github.com/derailed/k9s/issues/933) Unable to cordon node. + +## Resolved PRs + +* [PR #982](https://github.com/derailed/k9s/pull/982) Fix typo +* [PR #976](https://github.com/derailed/k9s/pull/976) Add OneDark color theme +* [PR #975](https://github.com/derailed/k9s/pull/982) Handling non json lines as raw with red color +* [PR #968](https://github.com/dserailed/k9s/pull/968) Disable filtering on help screen ... and broke the build ;) +* [PR #960](https://github.com/derailed/k9s/pull/960) Handle empty port list in PortForward view + +--- + + © 2020 Imhotep Software LLC. All materials licensed under [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0) diff --git a/internal/client/metrics.go b/internal/client/metrics.go index 360c8c0e..07f218d4 100644 --- a/internal/client/metrics.go +++ b/internal/client/metrics.go @@ -312,7 +312,7 @@ func ToMB(v int64) int64 { return v / MegaByte } -// ToPercentage computes percentage. +// ToPercentage computes percentage as string otherwise n/aa. func ToPercentage(v1, v2 int64) int { if v2 == 0 { return 0 @@ -323,7 +323,7 @@ func ToPercentage(v1, v2 int64) int { // ToPercentageStr computes percentage, but if v2 is 0, it will return NAValue instead of 0 func ToPercentageStr(v1, v2 int64) string { if v2 == 0 { - return "0" + return NA } return strconv.Itoa(ToPercentage(v1, v2)) } diff --git a/internal/dao/port_forwarder.go b/internal/dao/port_forwarder.go index 4fc12fc1..416b594e 100644 --- a/internal/dao/port_forwarder.go +++ b/internal/dao/port_forwarder.go @@ -4,7 +4,6 @@ import ( "fmt" "net/http" "net/url" - "strings" "time" "github.com/derailed/k9s/internal/client" @@ -21,8 +20,6 @@ import ( "k8s.io/client-go/transport/spdy" ) -const localhost = "localhost" - // PortForwarder tracks a port forward stream. type PortForwarder struct { Factory @@ -107,9 +104,9 @@ func (p *PortForwarder) Start(path, co string, tt []client.PortTunnel) (*portfor if len(tt) == 0 { return nil, fmt.Errorf("no ports assigned") } - fwds := make([]string, 0, len(tt)) + fwds, addrs := make([]string, 0, len(tt)), make([]string, 0, len(tt)) for _, t := range tt { - fwds = append(fwds, t.PortMap()) + fwds, addrs = append(fwds, t.PortMap()), append(addrs, t.Address) } p.path, p.container, p.ports, p.age = path, co, fwds, time.Now() @@ -158,10 +155,10 @@ func (p *PortForwarder) Start(path, co string, tt []client.PortTunnel) (*portfor Name(n). SubResource("portforward") - return p.forwardPorts("POST", req.URL(), tt[0].Address, fwds) + return p.forwardPorts("POST", req.URL(), addrs, fwds) } -func (p *PortForwarder) forwardPorts(method string, url *url.URL, address string, ports []string) (*portforward.PortForwarder, error) { +func (p *PortForwarder) forwardPorts(method string, url *url.URL, addrs, ports []string) (*portforward.PortForwarder, error) { cfg, err := p.Client().Config().RESTConfig() if err != nil { return nil, err @@ -170,12 +167,8 @@ func (p *PortForwarder) forwardPorts(method string, url *url.URL, address string if err != nil { return nil, err } - dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, method, url) - if address == "" { - address = localhost - } - addrs := strings.Split(address, ",") + return portforward.NewOnAddresses(dialer, addrs, ports, p.stopChan, p.readyChan, p.Out, p.ErrOut) } diff --git a/internal/render/container.go b/internal/render/container.go index 80ff5f9e..5b89334e 100644 --- a/internal/render/container.go +++ b/internal/render/container.go @@ -97,7 +97,7 @@ func (c Container) Render(o interface{}, name string, r *Row) error { return fmt.Errorf("Expected ContainerRes, but got %T", o) } - cur, perc, res := gatherMetrics(co.Container, co.MX) + cur, res := gatherMetrics(co.Container, co.MX) ready, state, restarts := "false", MissingValue, "0" if co.Status != nil { ready, state, restarts = boolToStr(co.Status.Ready), ToContainerState(co.Status.State), strconv.Itoa(int(co.Status.RestartCount)) @@ -117,10 +117,10 @@ func (c Container) Render(o interface{}, name string, r *Row) error { toMi(cur.mem), toMc(res.cpu) + ":" + toMc(res.lcpu), toMi(res.mem) + ":" + toMi(res.lmem), - strconv.Itoa(perc.rCPU()), - strconv.Itoa(perc.lCPU()), - strconv.Itoa(perc.rMEM()), - strconv.Itoa(perc.lMEM()), + client.ToPercentageStr(cur.cpu, res.cpu), + client.ToPercentageStr(cur.cpu, res.lcpu), + client.ToPercentageStr(cur.mem, res.mem), + client.ToPercentageStr(cur.mem, res.lmem), ToContainerPorts(co.Container.Ports), asStatus(c.diagnose(state, ready)), toAge(co.Age), @@ -144,12 +144,8 @@ func (Container) diagnose(state, ready string) error { // ---------------------------------------------------------------------------- // Helpers... -func gatherMetrics(co *v1.Container, mx *mv1beta1.ContainerMetrics) (metric, percentages, metric) { +func gatherMetrics(co *v1.Container, mx *mv1beta1.ContainerMetrics) (c, r metric) { rList, lList := containerRequests(co), co.Resources.Limits - var c metric - p := newPercentages() - - var r metric if rList.Cpu() != nil { r.cpu = rList.Cpu().MilliValue() } @@ -162,23 +158,16 @@ func gatherMetrics(co *v1.Container, mx *mv1beta1.ContainerMetrics) (metric, per if lList.Memory() != nil { r.lmem = lList.Memory().Value() } - - if mx == nil { - return c, p, r + if mx != nil { + if mx.Usage.Cpu() != nil { + c.cpu = mx.Usage.Cpu().MilliValue() + } + if mx.Usage.Memory() != nil { + c.mem = mx.Usage.Memory().Value() + } } - if mx.Usage.Cpu() != nil { - c.cpu = mx.Usage.Cpu().MilliValue() - } - if mx.Usage.Memory() != nil { - c.mem = mx.Usage.Memory().Value() - } - p[requestCPU] = client.ToPercentage(c.cpu, r.cpu) - p[limitCPU] = client.ToPercentage(c.cpu, r.lcpu) - p[requestMEM] = client.ToPercentage(c.mem, r.mem) - p[limitMEM] = client.ToPercentage(c.mem, r.lmem) - - return c, p, r + return } // ToContainerPorts returns container ports as a string. diff --git a/internal/render/node.go b/internal/render/node.go index fdb70af1..a4670055 100644 --- a/internal/render/node.go +++ b/internal/render/node.go @@ -72,7 +72,7 @@ func (n Node) Render(o interface{}, ns string, r *Row) error { iIP, eIP := getIPs(no.Status.Addresses) iIP, eIP = missing(iIP), missing(eIP) - c, p, a := gatherNodeMX(&no, oo.MX) + c, a := gatherNodeMX(&no, oo.MX) statuses := make(sort.StringSlice, 10) status(no.Status.Conditions, no.Spec.Unschedulable, statuses) sort.Sort(statuses) @@ -92,8 +92,8 @@ func (n Node) Render(o interface{}, ns string, r *Row) error { strconv.Itoa(oo.PodCount), toMc(c.cpu), toMi(c.mem), - strconv.Itoa(p.rCPU()), - strconv.Itoa(p.rMEM()), + client.ToPercentageStr(c.cpu, a.cpu), + client.ToPercentageStr(c.mem, a.mem), toMc(a.cpu), toMi(a.mem), mapToStr(no.Labels), @@ -154,22 +154,13 @@ type metric struct { lcpu, lmem int64 } -func gatherNodeMX(no *v1.Node, mx *mv1beta1.NodeMetrics) (metric, percentages, metric) { - var c metric - p := newPercentages() - a := metric{ - cpu: no.Status.Allocatable.Cpu().MilliValue(), - mem: no.Status.Allocatable.Memory().Value(), - } - if mx == nil { - return c, p, a +func gatherNodeMX(no *v1.Node, mx *mv1beta1.NodeMetrics) (c, a metric) { + a.cpu, a.mem = no.Status.Allocatable.Cpu().MilliValue(), no.Status.Allocatable.Memory().Value() + if mx != nil { + c.cpu, c.mem = mx.Usage.Cpu().MilliValue(), mx.Usage.Memory().Value() } - c.cpu, c.mem = mx.Usage.Cpu().MilliValue(), mx.Usage.Memory().Value() - p[requestCPU] = client.ToPercentage(c.cpu, a.cpu) - p[requestMEM] = client.ToPercentage(c.mem, a.mem) - - return c, p, a + return } func nodeRoles(node *v1.Node, res []string) { diff --git a/internal/render/pod.go b/internal/render/pod.go index 45721bb8..0ec57dd6 100644 --- a/internal/render/pod.go +++ b/internal/render/pod.go @@ -16,34 +16,6 @@ import ( mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" ) -const ( - requestCPU qualifiedResource = "rcpu" - requestMEM qualifiedResource = "rmem" - limitCPU qualifiedResource = "lcpu" - limitMEM qualifiedResource = "lmem" -) - -type ( - qualifiedResource string - percentages map[qualifiedResource]int -) - -func newPercentages() percentages { - return make(percentages, 4) -} -func (p percentages) rCPU() int { - return p[requestCPU] -} -func (p percentages) rMEM() int { - return p[requestMEM] -} -func (p percentages) lCPU() int { - return p[limitCPU] -} -func (p percentages) lMEM() int { - return p[limitMEM] -} - // Pod renders a K8s Pod to screen. type Pod struct{} @@ -109,7 +81,7 @@ func (Pod) Header(ns string) Header { } // Render renders a K8s resource to screen. -func (p Pod) Render(o interface{}, ns string, r *Row) error { +func (p Pod) Render(o interface{}, ns string, row *Row) error { pwm, ok := o.(*PodWithMetrics) if !ok { return fmt.Errorf("Expected PodWithMetrics, but got %T", o) @@ -122,10 +94,11 @@ func (p Pod) Render(o interface{}, ns string, r *Row) error { ss := po.Status.ContainerStatuses cr, _, rc := p.Statuses(ss) - c, perc, res := p.gatherPodMX(&po, pwm.MX) + + c, r := p.gatherPodMX(&po, pwm.MX) phase := p.Phase(&po) - r.ID = client.MetaFQN(po.ObjectMeta) - r.Fields = Fields{ + row.ID = client.MetaFQN(po.ObjectMeta) + row.Fields = Fields{ po.Namespace, po.ObjectMeta.Name, "●", @@ -134,12 +107,12 @@ func (p Pod) Render(o interface{}, ns string, r *Row) error { phase, toMc(c.cpu), toMi(c.mem), - toMc(res.cpu) + ":" + toMc(res.lcpu), - toMi(res.mem) + ":" + toMi(res.lmem), - strconv.Itoa(perc.rCPU()), - strconv.Itoa(perc.lCPU()), - strconv.Itoa(perc.rMEM()), - strconv.Itoa(perc.lMEM()), + toMc(r.cpu) + ":" + toMc(r.lcpu), + toMi(r.mem) + ":" + toMi(r.lmem), + client.ToPercentageStr(c.cpu, r.cpu), + client.ToPercentageStr(c.cpu, r.lcpu), + client.ToPercentageStr(c.mem, r.mem), + client.ToPercentageStr(c.mem, r.lmem), na(po.Status.PodIP), na(po.Spec.NodeName), p.mapQOS(po.Status.QOSClass), @@ -181,27 +154,16 @@ func (p *PodWithMetrics) DeepCopyObject() runtime.Object { return p } -func (*Pod) gatherPodMX(pod *v1.Pod, mx *mv1beta1.PodMetrics) (metric, percentages, metric) { - var c, r metric - p := newPercentages() - +func (*Pod) gatherPodMX(pod *v1.Pod, mx *mv1beta1.PodMetrics) (c, r metric) { rcpu, rmem := podRequests(pod.Spec) lcpu, lmem := podLimits(pod.Spec) - r.cpu, r.lcpu = rcpu.MilliValue(), lcpu.MilliValue() - r.mem, r.lmem = rmem.Value(), lmem.Value() - - if mx == nil { - return c, p, r + r.cpu, r.lcpu, r.mem, r.lmem = rcpu.MilliValue(), lcpu.MilliValue(), rmem.Value(), lmem.Value() + if mx != nil { + ccpu, cmem := currentRes(mx) + c.cpu, c.mem = ccpu.MilliValue(), cmem.Value() } - ccpu, cmem := currentRes(mx) - c.cpu = ccpu.MilliValue() - c.mem = cmem.Value() - - p[requestCPU], p[limitCPU] = client.ToPercentage(c.cpu, r.cpu), client.ToPercentage(c.cpu, r.lcpu) - p[requestMEM], p[limitMEM] = client.ToPercentage(c.mem, r.mem), client.ToPercentage(c.mem, r.lmem) - - return c, p, r + return } func containerRequests(co *v1.Container) v1.ResourceList { @@ -220,12 +182,15 @@ func containerRequests(co *v1.Container) v1.ResourceList { func podLimits(spec v1.PodSpec) (resource.Quantity, resource.Quantity) { cpu, mem := new(resource.Quantity), new(resource.Quantity) for _, co := range spec.Containers { - limit := co.Resources.Limits - if limit.Cpu() != nil { - cpu.Add(*limit.Cpu()) + limits := co.Resources.Limits + if len(limits) == 0 { + return resource.Quantity{}, resource.Quantity{} } - if limit.Memory() != nil { - mem.Add(*limit.Memory()) + if limits.Cpu() != nil { + cpu.Add(*limits.Cpu()) + } + if limits.Memory() != nil { + mem.Add(*limits.Memory()) } } return *cpu, *mem diff --git a/internal/render/pod_test.go b/internal/render/pod_test.go index 430ea3a0..a4423ca7 100644 --- a/internal/render/pod_test.go +++ b/internal/render/pod_test.go @@ -159,7 +159,7 @@ func TestPodRender(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "default/nginx", r.ID) - e := render.Fields{"default", "nginx", "●", "1/1", "0", "Running", "100", "50", "100:0", "70:170", "100", "0", "71", "29", "172.17.0.6", "minikube", "BE"} + e := render.Fields{"default", "nginx", "●", "1/1", "0", "Running", "100", "50", "100:0", "70:170", "100", "n/a", "71", "29", "172.17.0.6", "minikube", "BE"} assert.Equal(t, e, r.Fields[:17]) } @@ -190,7 +190,7 @@ func TestPodInitRender(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "default/nginx", r.ID) - e := render.Fields{"default", "nginx", "●", "1/1", "0", "Init:0/1", "10", "10", "100:0", "70:170", "10", "0", "14", "5", "172.17.0.6", "minikube", "BE"} + e := render.Fields{"default", "nginx", "●", "1/1", "0", "Init:0/1", "10", "10", "100:0", "70:170", "10", "n/a", "14", "5", "172.17.0.6", "minikube", "BE"} assert.Equal(t, e, r.Fields[:17]) } diff --git a/internal/view/pf_extender.go b/internal/view/pf_extender.go index 28311d83..02a4dc1f 100644 --- a/internal/view/pf_extender.go +++ b/internal/view/pf_extender.go @@ -132,7 +132,7 @@ func startFwdCB(v ResourceViewer, path, co string, tt []client.PortTunnel) { func showFwdDialog(v ResourceViewer, path string, cb PortForwardCB) error { mm, err := fetchPodPorts(v.App().factory, path) if err != nil { - return nil + return err } ports := make([]string, 0, len(mm)) for co, pp := range mm {