由于经常需要连到 k8s 上 pod 容器命令行中,但是在 rancher 上执行命令行经常容易断,而且效率低(开个浏览器窗口-输入 rancher 地址-选择应用-点击执行命令行,效率太低了)。
于是写了个脚本,用于本地直接连到 k8s pod 上。
本地先安装一下 kubectl, 然后从 rancher 上复制出 kube config 文件。放在本地 ~/.kube/config 中,可以把多个 k8s 集群的配置放到一个文件里面。
最后下面的脚本放到本机 path 的一个目录下,就可以直接在命令行中连 k8s 容器命令行了。 (注意改下里面的默认 k8s 集群名)
用法
k8sPod [options] <namespace> <deployment> [container]
- options: (可选)
- -c 选择连接的 k8s 集群, 需在 ~/.kube/config 中配置
- namespace:指定命名空间
- deployment:指定连接应用名
- container(可选): 指定 pod 的容器,未指定则默认主容器
#!/bin/bash
### Usage:
### k8sPod [options] <namespace> <deployment> [container] 连接 k8s 上指定 deployment 的 pod
### container: 可指定 pod 的容器,未指定则默认主容器
### options:
### -c <cluster-name> 选择连接的 k8s 集群, 需在 ~/.kube/config 中配置
### note: 请确保已安装 kubectl 以及存在 ~/.kube/config 配置
function usage() {
# mac 需要安装 gnu 的 sed,然后改成 gsed, 或者不搞这种花里胡哨的
sed -rn 's/^### ?//;T;p;' "$0"
}
# 默认连接的 k8s 集群
CLUSTER="test"
#echo "original parameters=[$*]"
# 读取选项参数
while getopts ":c:h" opt
do
case $opt in
c)
CLUSTER=$OPTARG
;;
h)
usage
exit 1
;;
?)
echo "参数非法"
;;
esac
done
# 去掉选项参数,
shift $(($OPTIND - 1))
# 判断容器和命名空间参数
if [[ $# < 2 ]]; then
usage
exit 1
fi
# 切集群
kubectl config use-context $CLUSTER > /dev/null
if [ $? -ne 0 ]; then
echo "cluster 非法"
exit 1
else
echo "cluster: $CLUSTER"
fi
NAMESPACE=$1
DEPLOYMENT_NAME=$2
CONTAINER=$3
# 查询 pod
POD_DATA=`kubectl get pods --selector=workload.user.cattle.io/workloadselector=deployment-$NAMESPACE-$DEPLOYMENT_NAME -n $NAMESPACE -o=wide`
PODS=`echo "$POD_DATA" | awk ' BEGIN{printf "%-4s %-48s %-12s %s\n", "id", "NAME", "STATUS", "IP"} NR > 1 {printf "%-4d %-48s %-12s %s\n", FNR-1, $1, $3, $6}'`
COUNT=`echo "$PODS" | awk 'END {print NR-1}'`
if [[ $COUNT < 1 ]]; then
echo "pod 不存在"
exit 1
fi
# 选择 pod
if [[ $COUNT == 1 ]]; then
POD_NAME=`echo "$PODS" | awk 'NR==2 {print $2}'`
echo "select pod: $POD_NAME"
else
echo "$PODS"
read -p "输入序号选择 pod : " ID
while [[ $ID < 1 || $ID > $COUNT ]]
do
echo "输入非法"
read -p "输入序号选择 pod : " ID
done
let N=$ID+1
POD_NAME=`echo "$PODS" | awk -v i=$N 'NR==i {print $2}'`
fi
# 连接 pod
if [[ -z "$CONTAINER" ]]; then
kubectl exec -it "$POD_NAME" -n $NAMESPACE -- bash
else
kubectl exec -it "$POD_NAME" -n $NAMESPACE -c $CONTAINER -- bash
fi
命令行最高效!