背景
1、公司服务器上,查询应用日志时,需要加一些额外的参数,例如 -n default
2、查询pod日志时,先获取pod列表,然后敲命令再需复制粘贴服务名太麻烦
3、查询日志时,需要用kube config进行区分,config路径太长
PS:本脚本只是大致写了一些流程,kubectl 命令请结合公司情况自行调整
脚本逻辑
1、将一些静态的参数写入脚本,如-n ns,-kubeconfig xxxx等
2、脚本传参:
环境参数:dev/test,必传;
pod名: get pod | grep pod名,可选
日志检索:logs -f xxx | grep '日志检索',可选,必须与第二个参数组合使用
3、先get pod,如果只有一个,则直接进入日志查询;如果有多个,则转成 数组 给用户选择,选择后进入日志查询
完整脚本
#!/bin/bash# 参数校验(至少需要环境参数)
if [ $# -lt 1 ]; thenecho "Usage: $0 <dev|test> [service-name] [keyword]"exit 1
fi#dev test
ENV=$1
SERVICE=${2:-""}
KEYWORD=${3:-""}# 校验环境参数
if [[ "$ENV" != "dev" && "$ENV" != "test" ]]; thenecho "Error: First parameter must be 'dev' or 'test'"exit 1
fi# 获取POD列表及状态: by namespace and kube config
if [ "$ENV" = "dev" ]; thenPOD_CMD="kubectl get pods -n default --no-headers"
elsePOD_CMD="kubectl get pods -n real_namespace --kubeconfig ~/.kube/config.test --no-headers"
fi# 添加服务名过滤: |grep SERVICE
if [ -n "$SERVICE" ]; thenPOD_CMD="$POD_CMD | grep '$SERVICE'"
fi# 提取POD名称和状态: pod name, pod status
PODS=$(eval "$POD_CMD" | awk '{printf "%-40s %s\n", $1, $3}') # $1=NAME, $3=STATUS# 处理无结果情况
if [ -z "$PODS" ]; thenecho "No pods found"exit 1
fi# 转换为数组
IFS=$'\n' read -d '' -ra POD_ARRAY <<< "$PODS"# 交互式选择POD: 转换成 序号 podName 以供选择
if [ ${#POD_ARRAY[@]} -gt 1 ]; thenecho -e "Found Pods (Name | Status):"echo "----------------------------------------------"for i in "${!POD_ARRAY[@]}"; doprintf "%2d) %s\n" $((i+1)) "${POD_ARRAY[$i]}"doneecho "----------------------------------------------"# array[序号 - 1] 则为选择的podwhile true; doread -p "Select pod number (1-${#POD_ARRAY[@]}): " SELECTif [[ "$SELECT" =~ ^[0-9]+$ ]] && [ "$SELECT" -ge 1 ] && [ "$SELECT" -le ${#POD_ARRAY[@]} ]; thenSELECT=$((SELECT-1))breakfiecho "Invalid input, please try again."done
elseSELECT=0
fi# 提取选择的Pod名称(去掉状态信息)
SELECTED_POD=$(echo "${POD_ARRAY[$SELECT]}" | awk '{print $1}')# 构建日志命令
LOG_CMD="kubectl logs -f $SELECTED_POD"
if [ "$ENV" = "test" ]; thenLOG_CMD="$LOG_CMD -n real_namespace --kubeconfig ~/.kube/config.test"
elseLOG_CMD="$LOG_CMD -n default"
fi# 添加关键字过滤
if [ -n "$KEYWORD" ]; thenLOG_CMD="$LOG_CMD | grep '$KEYWORD'"
fi# 执行命令
echo -e "\n\033[1;36m[$(date +%T)] Tailing logs for pod: $SELECTED_POD\033[0m"
eval "$LOG_CMD"