使用 bash 脚本实现本地快捷连接 k8s 容器命令行

由于经常需要连到 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


命令行最高效!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值