dotfiles/.dotfiles/kubernetes

199 lines
4.9 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

alias k='kubectl '
alias kshell='kubectl run -it shell --image bash --restart Never --rm -- sh'
kube-ssh() {
sh -c "$(curl -sSL https://raw.githubusercontent.com/AverageMarcus/kube-ssh/master/ssh.sh)"
}
kube-forward() {
if [ -n "$ZSH_VERSION" ]; then
setopt LOCAL_OPTIONS NO_NOTIFY NO_MONITOR
fi
IFS=$'\n'
SERVICES=( $(kubectl get service --no-headers -o json | jq '[.items[] | select(.metadata.annotations."kube-forward" != "false")] | (.[] | .metadata.name + "\t" + ([.spec.ports[].port] | join(",")))' -r | column -t) )
unset IFS
TO_KILL=()
cleanup() {
echo "\nClosing connections..."
for pid in "${TO_KILL[@]}"
do
(kill -2 $pid) &> /dev/null
done
trap - INT TERM
}
trap 'cleanup' INT TERM
HOST_PORT=9001
echo "Forwarding..."
for s in "${SERVICES[@]}"
do
SERVICE=( $(echo $s) )
if [ -n "$ZSH_VERSION" ]; then
NAME=${SERVICE[1]}
PORT=${SERVICE[2]}
else
NAME=${SERVICE[0]}
PORT=${SERVICE[1]}
fi
PORTS=($(echo $PORT | tr "," "\n"))
for PORT in "${PORTS[@]}"
do
(kubectl port-forward svc/$NAME $HOST_PORT:$PORT > /dev/null 2>&1) &
BG_PID=$!
if `curl -s -o /dev/null --retry 5 --retry-delay 0 --retry-connrefused -m 3 http://localhost:$HOST_PORT`
then
echo "\e[1m$NAME:$PORT\e[0m ➡ \e[34mhttp://localhost:$HOST_PORT\e[0m"
TO_KILL+=($BG_PID)
((HOST_PORT=HOST_PORT+1))
else
(kill -2 $BG_PID) &> /dev/null
fi
done
done
echo "\n\e[2m(Use [Ctl + C] to exit)"
cat
if [ -n "$BASH_VERSION" ]; then
cleanup
fi
}
source <(kubectl completion zsh)
## Kubectl exec
kx () {
local pod=($(kubectl get pods --all-namespaces -owide | fzf | awk '{print $1, $2}'))
local cmd=${@:-"sh"}
echo kubectl exec -it --namespace $pod[1] $pod[2] $cmd
kubectl exec -it --namespace $pod[1] $pod[2] $cmd
}
## Kubectl logs
kl () {
local pod=($(kubectl get pods --all-namespaces -owide | fzf | awk '{print $1, $2}'))
local attr=${@:-""}
echo kubectl logs -f $attr --namespace $pod[1] $pod[2]
kubectl logs -f $attr --namespace $pod[1] $pod[2]
}
## Display everything
kall() {
NAMESPACE=""
LABEL=""
ALL_NAMESPACES=false
while test $# -gt 0; do
case "$1" in
-n|--namespace)
shift
NAMESPACE=$1
shift
;;
-l|--selector)
shift
LABEL=$1
shift
;;
-A|--all-namespaces)
ALL_NAMESPACES=true
shift
;;
-h|--help)
echo "kall - get all Kubernetes resources matching a given label selector"
echo " "
echo "kall [options]"
echo " "
echo "Options:"
echo "-h, --help show this help text"
echo "-n, --namespace the namespace to check against"
echo "-l, --selector the label selector to match on"
echo "-A, --all-namespaces search all namespaces"
return 0
;;
*)
break
;;
esac
done
if [[ "${LABEL}" == "" ]]; then
echo "Please provide a label selector to match on"
return 1
fi
NAMES="$(kubectl api-resources --namespaced --verbs list -o name | tr '\n' ,)"
if [ $ALL_NAMESPACES ]; then
kubectl get "${NAMES:0:-1}" --show-kind --ignore-not-found -l ${LABEL} -A
else
kubectl get "${NAMES:0:-1}" --show-kind --ignore-not-found -l ${LABEL} -n ${NAMESPACE}
fi
}
k-version-test() {
VERSION=""
FILES=""
while test $# -gt 0; do
case "$1" in
-v|--version)
shift
VERSION=$1
shift
;;
-f|--files)
shift
FILES=$1
shift
;;
-h|--help)
echo "k-version-test - test Kubernetes manifest files against different versions of Kubernetes"
echo " "
echo "k-version-test [options]"
echo " "
echo "Options:"
echo "-h, --help show this help text"
echo "-v, --version the version of kubernetes to test against"
echo "-f, --files the manifest file(s) to test against"
return 0
;;
*)
break
;;
esac
done
which kind &> /dev/null || (echo "'kind' not installed. Follow install instructions here: https://github.com/kubernetes-sigs/kind/"; return 1)
if [ ! -z $VERSION ];
then
TAG=$(curl -s 'https://registry.hub.docker.com/v2/repositories/kindest/node/tags/' | jq '."results" | map(.name | select(startswith("v'$VERSION'"))) | .[0]' | xargs)
kind create cluster --image kindest/node:$TAG
else
kind create cluster
fi
echo
if kubectl apply --dry-run -f $FILES ; then
echo "\n☸ Kubernetes $VERSION. Result: ✅\n"
else
echo "\n☸ Kubernetes $VERSION. Result: ❌\n"
fi
kind delete cluster
}
fix-broken-replicasets() {
kubectl get replicasets --all-namespaces -o jsonpath='{range .items[?(@.status.replicas==0)]}--namespace {@.metadata.namespace} {@.metadata.name};{end}' | tr ";" "\n" | xargs -I {} sh -c "kubectl delete rs {}"
}
source <(tkn completion zsh)