From 58a05e91daa5711fc2c0b598b3cd8c6f167ee7e2 Mon Sep 17 00:00:00 2001 From: fj0r <82698591+fj0r@users.noreply.github.com> Date: Fri, 12 May 2023 19:16:07 +0800 Subject: [PATCH] clean up kubernetes.nu (#486) * add the original kubectl command as description of abbreviation * replace nu-complete kube pods, services, deployments with `res via name` * kg support --jsonpath * kgp, kgs, kgd support --jsonpath * refactor kep, kdp, kgd, kdels * kg support --selector * kg support --wide - remove kgpl - kgp, kgd support --selector * kg support --watch and rename wide to verbose - remove kgpa (kg pod -A) - remove kgpw (kg pod -w) * add kind in output of `kg -v` used with multiple types such as `kg pod,svc -v` --------- Co-authored-by: agent --- modules/kubernetes/kubernetes.nu | 228 ++++++++++++++++++------------- 1 file changed, 132 insertions(+), 96 deletions(-) diff --git a/modules/kubernetes/kubernetes.nu b/modules/kubernetes/kubernetes.nu index 8c059605..10b6ba40 100644 --- a/modules/kubernetes/kubernetes.nu +++ b/modules/kubernetes/kubernetes.nu @@ -44,34 +44,45 @@ export def `kcache flush` [] { export-env { let-env KUBERNETES_SCHEMA_URL = $"file:///($env.HOME)/.config/kubernetes-json-schema/all.json" + let-env KUBERNETES_RESOURCE_ABBR = { + s: services + d: deployments + p: pods + } } -### file +# kubectl apply -f export def kaf [p: path] { kubectl apply -f $p } +# kubectl diff -f export def kdf [p: path] { kubectl diff -f $p } +# kubectl delete -f export def kdelf [p: path] { kubectl delete -f $p } +# kubectl apply -k export def kak [p: path] { kubectl apply -k $p } +# kubectl diff -k export def kdk [p: path] { kubectl diff -k $p } +# kubectl delete -k export def kdelk [p: path] { kubectl delete -k $p } +# kubectl kustomize (template) export def kk [p: path] { kubectl kustomize $p } @@ -117,10 +128,12 @@ def "nu-complete kube ns" [] { } } +# kubectl change context export def kcc [ctx: string@"nu-complete kube ctx"] { kubectl config use-context $ctx } +# kubectl (change) namespace export def kn [ns: string@"nu-complete kube ns"] { kubectl config set-context --current $"--namespace=($ns)" } @@ -168,12 +181,12 @@ export def-env kcconf [name: string@"nu-complete kube ctx"] { } ### common -export def "nu-complete kube kind without cache" [] { +def "nu-complete kube kind without cache" [] { kubectl api-resources | from ssv -a | get NAME | append (kubectl get crd | from ssv -a | get NAME) } -export def "nu-complete kube kind" [] { +def "nu-complete kube kind" [] { let ctx = (kube-config) let cache = $'($env.HOME)/.cache/nu-complete/k8s-api-resources/($ctx.data.current-context).json' ensure-cache-by-lines $cache $ctx.path {|| @@ -186,28 +199,67 @@ export def "nu-complete kube kind" [] { def "nu-complete kube res" [context: string, offset: int] { let ctx = ($context | parse cmd) let def = ($ctx | get args.1) - let ns = (do -i { $ctx | get '-n' }) - let ns = if ($ns|is-empty) { [] } else { [-n $ns] } + let ns = if ($ctx.-n? | is-empty) { [] } else { [-n $ctx.-n] } kubectl get $ns $def | from ssv -a | get NAME } +def "nu-complete kube res via name" [context: string, offset: int] { + let ctx = ($context | parse cmd) + let cmd = ($ctx | get args.0) + let def = ($env.KUBERNETES_RESOURCE_ABBR | get ($cmd | str substring (($cmd | str length) - 1)..)) + echo $'($cmd), ($def)' | save -a ~/.nulog + let ns = if ($ctx.-n? | is-empty) { [] } else { [-n $ctx.-n] } + kubectl get $ns $def | from ssv -a | get NAME +} + +def "nu-complete kube path" [context: string, offset: int] { +} + +# kubectl get export def kg [ - r: string@"nu-complete kube kind" - -n: string@"nu-complete kube ns" - --all (-A):bool + k: string@"nu-complete kube kind" + r?: string@"nu-complete kube res" + --namespace (-n): string@"nu-complete kube ns" + --jsonpath (-p): string@"nu-complete kube path" + --selector (-l): string + --verbose (-v): bool + --watch (-w): bool + --all (-A): bool ] { let n = if $all { [-A] - } else if ($n | is-empty) { + } else if ($namespace | is-empty) { [] } else { - [-n $n] + [-n $namespace] } - #let h = ($d | columns | str kebab-case) - #$d | rename ...$h - kubectl get $n $r | from ssv -a + let r = if ($r | is-empty) { [] } else { [$r] } + let l = if ($selector | is-empty) { [] } else { [-l $selector] } + if ($jsonpath | is-empty) { + if ($verbose) { + kubectl get -o json $n $k $r | from json | get items + | each {|x| + { + name: $x.metadata.name + kind: $x.kind + ns: $x.metadata.namespace + created: ($x.metadata.creationTimestamp | into datetime) + metadata: $x.metadata + status: $x.status + spec: $x.spec + } + } + } else if $watch { + kubectl get $n $k $r --watch + } else { + kubectl get $n $k $r | from ssv -a + } + } else { + kubectl get $n $k $r $"--output=jsonpath={($jsonpath)}" | from yaml + } } +# kubectl create export def kc [ r: string@"nu-complete kube kind" -n: string@"nu-complete kube ns" @@ -217,6 +269,7 @@ export def kc [ kubectl create $n $r $name } +# kubectl get -o yaml export def ky [ r: string@"nu-complete kube kind" i: string@"nu-complete kube res" @@ -226,6 +279,7 @@ export def ky [ kubectl get $n -o yaml $r $i } +# kubectl describe export def kd [ r: string@"nu-complete kube kind" i: string@"nu-complete kube res" @@ -235,15 +289,17 @@ export def kd [ kubectl describe $n $r $i } +# kubectl edit export def ke [ - r: string@"nu-complete kube kind" - i: string@"nu-complete kube res" + k: string@"nu-complete kube kind" + r: string@"nu-complete kube res" -n: string@"nu-complete kube ns" ] { let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl edit $n $r $i + kubectl edit $n $k $r } +# kubectl delete export def kdel [ r: string@"nu-complete kube kind" i: string@"nu-complete kube res" @@ -256,13 +312,12 @@ export def kdel [ } -### node +# kubectl get nodes export def kgno [] { kubectl get nodes -o wide | from ssv -a | rename name status roles age version internal-ip external-ip os kernel runtime } -### pods def "nu-complete kube pods" [context: string, offset: int] { let ctx = ($context | parse cmd) let ns = (do -i { $ctx | get '-n' }) @@ -280,50 +335,27 @@ def "nu-complete kube ctns" [context: string, offset: int] { kubectl get $ns pod $pod -o jsonpath={.spec.containers[*].name} | split row ' ' } -export def kgpl [] { - kubectl get pods -o json - | from json - | get items - | each {|x| - let rs = $x.status.containerStatuses.0.restartCount - { - namespace: $x.metadata.namespace, - name: $x.metadata.name, - status: $x.status.phase, - restarts: ($rs | split row ' '| get 0 | into int), - age: ($x.status.startTime | into datetime) - }} +# kubectl get pods +export def kgp [ + r?: string@"nu-complete kube res via name" + --namespace (-n): string@"nu-complete kube ns" + --jsonpath (-p): string@"nu-complete kube path" + --selector (-l): string +] { + kg pods -n $namespace -p $jsonpath -l $selector $r } -export def kgpa [] { - kubectl get pods -o wide -A | from ssv -a - | rename namespace name ready status restarts age ip node - | each {|x| ($x| upsert restarts ($x.restarts|split row ' '| get 0 | into int)) } - | reject 'NOMINATED NODE' 'READINESS GATES' +# kubectl edit pod +export def kep [-n: string@"nu-complete kube ns", pod: string@"nu-complete kube res via name"] { + ke -n $n pod $pod } -export def kgp [-n: string@"nu-complete kube ns"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl get pods $n -o wide | from ssv -a - | rename name ready status restarts age ip node - | each {|x| ($x| upsert restarts ($x.restarts|split row ' '| get 0 | into int)) } - | reject 'NOMINATED NODE' 'READINESS GATES' -} - -export def kgpw [] { - kubectl get pods --watch -} - -export def kep [-n: string@"nu-complete kube ns", pod: string@"nu-complete kube pods"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl edit pod $n $pod -} - -export def kdp [-n: string@"nu-complete kube ns", pod: string@"nu-complete kube pods"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl describe pod $n $pod +# kubectl describe pod +export def kdp [-n: string@"nu-complete kube ns", pod: string@"nu-complete kube res via name"] { + kd -n $n pod $pod } +# kubectl attach (exec -it) export def ka [ pod: string@"nu-complete kube pods" -n: string@"nu-complete kube ns" @@ -335,6 +367,7 @@ export def ka [ kubectl exec $n -it $pod $c -- (if ($args|is-empty) { 'bash' } else { $args }) } +# kubectl logs export def kl [ pod: string@"nu-complete kube pods" --namespace(-n): string@"nu-complete kube ns" @@ -345,6 +378,7 @@ export def kl [ kubectl logs $n $pod $c } +# kubectl logs -f export def klf [ pod: string@"nu-complete kube pods" --namespace(-n): string@"nu-complete kube ns" @@ -358,6 +392,7 @@ export def klf [ def "nu-complete port forward type" [] { [pod svc] } +# kubectl port-forward export def kpf [ res: string@"nu-complete port forward type" target: string@"nu-complete kube res" @@ -388,6 +423,7 @@ def "nu-complete kube cp" [cmd: string, offset: int] { $files | append $ctn } } +# kubectl cp export def kcp [ lhs: string@"nu-complete kube cp" rhs: string@"nu-complete kube cp" @@ -399,53 +435,45 @@ export def kcp [ kubectl cp $n $lhs $c $rhs } -### service -def "nu-complete kube service" [context: string, offset: int] { - let ctx = ($context | parse cmd) - let ns = (do -i { $ctx | get '-n' }) - let ns = if ($ns|is-empty) { [] } else { [-n $ns] } - kubectl get $ns services | from ssv -a | get NAME +# kubectl get services +export def kgs [ + r?: string@"nu-complete kube res via name" + --namespace (-n): string@"nu-complete kube ns" + --jsonpath (-p): string@"nu-complete kube path" + --selector (-l): string +] { + kg services -n $namespace -p $jsonpath -l $selector $r } -export def kgs [-n: string@"nu-complete kube ns"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl get $n services | from ssv -a - | rename name type cluster-ip external-ip ports age selector +# kubectl edit service +export def kes [svc: string@"nu-complete kube res via name", -n: string@"nu-complete kube ns"] { + ke -n $n service $svc } -export def kes [svc: string@"nu-complete kube service", -n: string@"nu-complete kube ns"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl edit $n service $svc +# kubectl delete service +export def kdels [svc: string@"nu-complete kube res via name", -n: string@"nu-complete kube ns"] { + kdel -n $n service $svc } -export def kdels [svc: string@"nu-complete kube service", -n: string@"nu-complete kube ns"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl delete $n service $svc +# kubectl get deployments +export def kgd [ + r?: string@"nu-complete kube res via name" + --namespace (-n): string@"nu-complete kube ns" + --jsonpath (-p): string@"nu-complete kube path" + --selector (-l): string +] { + kg -n $namespace deployments -p $jsonpath -l $selector $r } -### deployments -def "nu-complete kube deployments" [context: string, offset: int] { - let ctx = ($context | parse cmd) - let ns = (do -i { $ctx | get '-n' }) - let ns = if ($ns|is-empty) { [] } else { [-n $ns] } - kubectl get $ns deployments | from ssv -a | get NAME -} - -export def kgd [-n: string@"nu-complete kube ns"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl get $n deployments -o wide | from ssv -a - | rename name ready up-to-date available age containers images selector - | reject selector -} - -export def ked [d: string@"nu-complete kube deployments", -n: string@"nu-complete kube ns"] { - let n = if ($n|is-empty) { [] } else { [-n $n] } - kubectl edit $n deployments $d +# kubectl edit deployment +export def ked [d: string@"nu-complete kube res via name", -n: string@"nu-complete kube ns"] { + ke -n $n deployments $d } def "nu-complete num9" [] { [1 2 3] } +# kubectl scale deployment export def ksd [ - d: string@"nu-complete kube deployments" + d: string@"nu-complete kube res via name" num: string@"nu-complete num9" -n: string@"nu-complete kube ns" ] { @@ -456,8 +484,9 @@ export def ksd [ kubectl scale $n deployments $d --replicas $num } } +# kubectl scale deployment with reset export def ksdr [ - d: string@"nu-complete kube deployments" + d: string@"nu-complete kube res via name" num: int@"nu-complete num9" -n: string@"nu-complete kube ns" ] { @@ -472,14 +501,20 @@ export def ksdr [ } } +# kubectl rollout status deployment export alias krsd = kubectl rollout status deployment +# kubectl get rs export alias kgrs = kubectl get rs -export def krh [-n: string@"nu-complete kube ns", --revision (-v): int, dpl: string@"nu-complete kube deployments"] { + +# kubectl rollout history +export def krhd [-n: string@"nu-complete kube ns", --revision (-v): int, dpl: string@"nu-complete kube res via name"] { let n = if ($n|is-empty) { [] } else { [-n $n] } let v = if ($revision|is-empty) { [] } else { [ $"--revision=($revision)" ] } kubectl $n rollout history $"deployment/($dpl)" $v } -export def kru [-n: string@"nu-complete kube ns", --revision (-v): int, dpl: string@"nu-complete kube deployments"] { + +# kubectl rollout undo +export def krud [-n: string@"nu-complete kube ns", --revision (-v): int, dpl: string@"nu-complete kube res via name"] { let n = if ($n|is-empty) { [] } else { [-n $n] } let v = if ($revision|is-empty) { [] } else { [ $"--to-revision=($revision)" ] } kubectl $n rollout undo $"deployment/($dpl)" $v @@ -487,7 +522,7 @@ export def kru [-n: string@"nu-complete kube ns", --revision (-v): int, dpl: str export alias ksss = kubectl scale statefulset export alias krsss = kubectl rollout status statefulset -### kubectl top pod +# kubectl top pod export def ktp [-n: string@"nu-complete kube ns"] { let n = if ($n|is-empty) { [] } else { [-n $n] } kubectl top pod $n | from ssv -a | rename name cpu mem @@ -498,6 +533,7 @@ export def ktp [-n: string@"nu-complete kube ns"] { } } } +# kubectl top pod -all export def ktpa [] { kubectl top pod -A | from ssv -a | rename namespace name cpu mem | each {|x| { @@ -508,7 +544,7 @@ export def ktpa [] { } } } -### kube top node +# kubectl top node export def ktn [] { kubectl top node | from ssv -a | rename name cpu pcpu mem pmem | each {|x| {