如何通过shell脚本查看k8s日志

发布时间:2022-01-06 19:50:06 作者:柒染
来源:亿速云 阅读:211
# 如何通过Shell脚本查看K8s日志

## 前言

在Kubernetes(K8s)集群的日常运维中,查看容器日志是排查问题的重要手段。虽然`kubectl logs`命令可以满足基本需求,但在复杂场景下(如多Pod筛选、动态容器名、历史日志追溯等),编写Shell脚本能显著提升效率。本文将详细介绍如何通过Shell脚本实现高效灵活的K8s日志查看方案。

---

## 一、基础日志查看方法

### 1.1 单Pod日志查看
```bash
#!/bin/bash
# 查看指定Pod的最新日志
POD_NAME="your-pod-name"
NAMESPACE="default"

kubectl logs $POD_NAME -n $NAMESPACE

1.2 带时间范围的日志

# 查看最近1小时的日志
kubectl logs --since=1h $POD_NAME

1.3 多容器Pod日志

# 指定容器名称查看日志
CONTNER_NAME="app-container"
kubectl logs $POD_NAME -c $CONTNER_NAME

二、进阶脚本开发

2.1 动态获取Pod名称

当Pod名称包含动态后缀(如Deployment创建的Pod)时:

#!/bin/bash
DEPLOYMENT_NAME="nginx-deployment"
NAMESPACE="default"

# 获取最新运行的Pod名称
POD_NAME=$(kubectl get pods -n $NAMESPACE -l app=$DEPLOYMENT_NAME -o jsonpath='{.items[0].metadata.name}')

kubectl logs $POD_NAME -n $NAMESPACE --tail=100

2.2 多Pod日志聚合

查看同一Deployment下所有Pod的日志:

#!/bin/bash
LABEL_SELECTOR="app=nginx"

kubectl get pods -o name | while read pod; do
  echo "====== Logs for $pod ======"
  kubectl logs --tail=50 $pod
done

三、高级日志处理技巧

3.1 实时日志监控

#!/bin/bash
# 实时跟踪多个Pod日志(需要安装multitail)
kubectl get pods -o name | xargs -P 0 -I {} sh -c 'kubectl logs -f {} | sed "s/^/[{}] /"'

3.2 日志关键词高亮

#!/bin/bash
ERROR_KEYWORDS="error|exception|fail"

kubectl logs $POD_NAME | grep --color -E "$ERROR_KEYWORDS|$"

3.3 日志时间排序

合并多个Pod日志并按时间排序:

#!/bin/bash
kubectl get pods -o name | xargs -I {} sh -c \
  'kubectl logs {} | awk -v pod={} '"'"'{print pod,$0}'"'"'' | sort -k 2

四、实用脚本示例

4.1 日志搜索工具

#!/bin/bash
# 参数化日志搜索脚本
NAMESPACE=$1
SEARCH_TERM=$2
TL_LINES=${3:-100}

for pod in $(kubectl get pods -n $NAMESPACE -o name); do
  echo "Searching in $pod..."
  kubectl logs -n $NAMESPACE --tail=$TL_LINES $pod | grep -i "$SEARCH_TERM"
done

使用方法:

./log_search.sh default "connection timeout" 200

4.2 日志导出工具

#!/bin/bash
# 导出所有Pod日志到文件
OUTPUT_DIR="k8s_logs_$(date +%Y%m%d)"

mkdir -p $OUTPUT_DIR
kubectl get pods -o name | while read pod; do
  filename=$(echo $pod | sed 's/pod\///').log
  kubectl logs $pod > "$OUTPUT_DIR/$filename"
done

echo "Logs exported to $OUTPUT_DIR"

五、错误处理与优化

5.1 添加错误检查

#!/bin/bash
set -euo pipefail

POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}') || {
  echo "Error getting pod name"
  exit 1
}

kubectl logs $POD_NAME || {
  echo "Error retrieving logs"
  exit 1
}

5.2 性能优化建议

  1. 使用--tail限制日志行数
  2. 对大型集群使用--selector精确过滤
  3. 考虑使用stern等专业工具处理复杂场景

六、替代方案比较

方法 优点 缺点
原生kubectl 无需安装 功能有限
Shell脚本 灵活定制 需要开发
stern 实时聚合 需额外安装
Loki 长期存储 需要部署

结语

通过Shell脚本扩展kubectl的日志查看能力,可以显著提升K8s运维效率。建议根据实际需求组合使用本文介绍的技术,并逐步建立自己的运维脚本库。对于生产环境,建议考虑专业的日志收集系统(如EFK/Loki)作为补充方案。

提示:所有脚本应在测试环境验证后再用于生产环境 “`

注:本文实际约1200字,可根据需要扩展以下内容: 1. 增加具体用例场景分析 2. 添加性能测试数据 3. 补充安全相关注意事项 4. 详细解释复杂正则表达式 5. 增加调试技巧章节

推荐阅读:
  1. IBM X系列服务器通过sysmgmt接口查看日志
  2. filebeat收集k8s日志

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

shell k8s

上一篇:JavaScript ES6语法中let,const ,var的区别是什么

下一篇:Java泛型的原理分析是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》