diff --git a/README.md b/README.md index a362f59..5ddee71 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,25 @@ kubectl debug POD_NAME kubectl debug -h ``` +# Build from source + +Clone this repo and: +```bash +# build plugin +go build -o kubectl-debug ./cmd/plugin +# install plugin +mv kubectl-debug /usr/local/bin + +# build agent +go build -o debug-agent ./cmd/agent +# build agent image +docker build . -t debug-agent +``` + +# Demo + +[![asciicast](https://asciinema.org/a/yswc937xUwvnIMRpvJSNJLJj7.png)](https://asciinema.org/a/yswc937xUwvnIMRpvJSNJLJj7) + # Default image and entrypoint `kubectl-debug` use [nicolaka/netshoot](https://github.com/nicolaka/netshoot) as the default image to run debug container, and use `bash` as default entrypoint. diff --git a/pkg/util/resizeevents_windows.go b/pkg/util/resizeevents_windows.go new file mode 100644 index 0000000..adccf87 --- /dev/null +++ b/pkg/util/resizeevents_windows.go @@ -0,0 +1,62 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package term + +import ( + "time" + + "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/tools/remotecommand" +) + +// monitorResizeEvents spawns a goroutine that periodically gets the terminal size and tries to send +// it to the resizeEvents channel if the size has changed. The goroutine stops when the stop channel +// is closed. +func monitorResizeEvents(fd uintptr, resizeEvents chan<- remotecommand.TerminalSize, stop chan struct{}) { + go func() { + defer runtime.HandleCrash() + + size := GetSize(fd) + if size == nil { + return + } + lastSize := *size + + for { + // see if we need to stop running + select { + case <-stop: + return + default: + } + + size := GetSize(fd) + if size == nil { + return + } + + if size.Height != lastSize.Height || size.Width != lastSize.Width { + lastSize.Height = size.Height + lastSize.Width = size.Width + resizeEvents <- *size + } + + // sleep to avoid hot looping + time.Sleep(250 * time.Millisecond) + } + }() +} diff --git a/scripts/agent_daemonset.yml b/scripts/agent_daemonset.yml index 0281171..7c012ae 100644 --- a/scripts/agent_daemonset.yml +++ b/scripts/agent_daemonset.yml @@ -14,7 +14,7 @@ spec: app: debug-agent spec: containers: - - image: registry.qunhequnhe.com/monitor/debug-agent:0.0.5 + - image: aylei/debug-agent:0.0.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3