mirror of https://github.com/easzlab/kubeasz.git
add kubectl-node-shell
parent
10ba54fa1b
commit
11bd2b2780
|
@ -0,0 +1,158 @@
|
|||
#!/usr/bin/env sh
|
||||
# from: https://github.com/kvaps/kubectl-node-shell
|
||||
|
||||
set -e
|
||||
|
||||
kubectl=kubectl
|
||||
version=1.5.5
|
||||
generator=""
|
||||
node=""
|
||||
nodefaultctx=0
|
||||
nodefaultns=0
|
||||
cmd='[ "nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--"'
|
||||
if [ -t 0 ]; then
|
||||
tty=true
|
||||
else
|
||||
tty=false
|
||||
fi
|
||||
while [ $# -gt 0 ]; do
|
||||
key="$1"
|
||||
|
||||
case $key in
|
||||
-v | --version)
|
||||
echo "kubectl-node-shell $version"
|
||||
exit 0
|
||||
;;
|
||||
--context)
|
||||
nodefaultctx=1
|
||||
kubectl="$kubectl --context $2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
--kubecontext=*)
|
||||
nodefaultctx=1
|
||||
kubectl="$kubectl --context=${key##*=}"
|
||||
shift
|
||||
;;
|
||||
--kubeconfig)
|
||||
kubectl="$kubectl --kubeconfig $2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
--kubeconfig=*)
|
||||
kubectl="$kubectl --kubeconfig=${key##*=}"
|
||||
shift
|
||||
;;
|
||||
-n | --namespace)
|
||||
nodefaultns=1
|
||||
kubectl="$kubectl --namespace $2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
--namespace=*)
|
||||
nodefaultns=1
|
||||
kubectl="$kubectl --namespace=${key##*=}"
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
if [ -z "$node" ]; then
|
||||
node="${1#node/}"
|
||||
shift
|
||||
else
|
||||
echo "exactly one node required"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Set the default context and namespace to avoid situations where the user switch them during the build process
|
||||
[ "$nodefaultctx" = 1 ] || kubectl="$kubectl --context=$(${kubectl} config current-context)"
|
||||
[ "$nodefaultns" = 1 ] || kubectl="$kubectl --namespace=$(${kubectl} config view --minify --output 'jsonpath={.contexts..namespace}')"
|
||||
|
||||
if [ $# -gt 0 ]; then
|
||||
while [ $# -gt 0 ]; do
|
||||
cmd="$cmd, \"$(echo "$1" | \
|
||||
awk '{gsub(/["\\]/,"\\\\&");gsub(/\x1b/,"\\u001b");printf "%s",last;last=$0"\\n"} END{print $0}' \
|
||||
)\""
|
||||
shift
|
||||
done
|
||||
cmd="$cmd ]"
|
||||
else
|
||||
cmd="$cmd, \"bash\", \"-l\" ]"
|
||||
fi
|
||||
|
||||
if [ -z "$node" ]; then
|
||||
echo "Please specify node name"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
image="${KUBECTL_NODE_SHELL_IMAGE:-docker.io/library/alpine}"
|
||||
pod="nsenter-$(env LC_ALL=C tr -dc a-z0-9 </dev/urandom | head -c 6)"
|
||||
|
||||
# Check the node
|
||||
$kubectl get node "$node" >/dev/null || exit 1
|
||||
|
||||
container_cpu="${KUBECTL_NODE_SHELL_POD_CPU:-100m}"
|
||||
container_memory="${KUBECTL_NODE_SHELL_POD_MEMORY:-256Mi}"
|
||||
labels="${KUBECTL_NODE_SHELL_LABELS}"
|
||||
|
||||
overrides="$(
|
||||
cat <<EOT
|
||||
{
|
||||
"spec": {
|
||||
"nodeName": "$node",
|
||||
"hostPID": true,
|
||||
"hostNetwork": true,
|
||||
"containers": [
|
||||
{
|
||||
"securityContext": {
|
||||
"privileged": true
|
||||
},
|
||||
"image": "$image",
|
||||
"name": "nsenter",
|
||||
"stdin": true,
|
||||
"stdinOnce": true,
|
||||
"tty": $tty,
|
||||
"command": $cmd,
|
||||
"resources": {
|
||||
"limits": {
|
||||
"cpu": "${container_cpu}",
|
||||
"memory": "${container_memory}"
|
||||
},
|
||||
"requests": {
|
||||
"cpu": "${container_cpu}",
|
||||
"memory": "${container_memory}"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"tolerations": [
|
||||
{
|
||||
"key": "CriticalAddonsOnly",
|
||||
"operator": "Exists"
|
||||
},
|
||||
{
|
||||
"effect": "NoExecute",
|
||||
"operator": "Exists"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
EOT
|
||||
)"
|
||||
|
||||
# Support Kubectl <1.18
|
||||
m=$(kubectl version --client -o yaml | awk -F'[ :"]+' '$2 == "minor" {print $3+0}')
|
||||
if [ "$m" -lt 18 ]; then
|
||||
generator="--generator=run-pod/v1"
|
||||
fi
|
||||
|
||||
trap "EC=\$?; $kubectl delete pod --wait=false $pod >&2 || true; exit \$EC" EXIT INT TERM
|
||||
|
||||
echo "spawning \"$pod\" on \"$node\"" >&2
|
||||
$kubectl run --image "$image" --restart=Never --overrides="$overrides" --labels="$labels" $([ "$tty" = true ] && echo -t) -i "$pod" $generator
|
Loading…
Reference in New Issue