惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
罗磊的独立博客
Martin Fowler
Martin Fowler
B
Blog RSS Feed
U
Unit 42
V
V2EX
H
Help Net Security
V
Vulnerabilities – Threatpost
The Register - Security
The Register - Security
IT之家
IT之家
Cloudbric
Cloudbric
K
Kaspersky official blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Jina AI
Jina AI
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
P
Palo Alto Networks Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
Cisco Talos Blog
Cisco Talos Blog
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
G
GRAHAM CLULEY
T
Threatpost
C
Check Point Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tor Project blog
L
Lohrmann on Cybersecurity
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
The GitHub Blog
The GitHub Blog
C
CERT Recently Published Vulnerability Notes
Microsoft Security Blog
Microsoft Security Blog
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
Security Archives - TechRepublic
Security Archives - TechRepublic
T
The Blog of Author Tim Ferriss
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy & Cybersecurity Law Blog

lvbibir's Blog

shell | 磁盘空间分析脚本 Linux cat 和 tee 命令写入文件 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker vim | 基础配置和使用 windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 Zabbix | 监控主机到指定 ip 的流量大小 shell | centos 初始化 loki (二) 部署 loki (一) 简介 prometheus (六) Alertmanager prometheus (五) 记录规则与告警规则 prometheus (四) 黑盒监控 prometheus (三) 服务发现 prometheus (二) 静态配置 prometheus (一) 简介及部署 traefik (四) TraefikService 服务 traefik (三) Middleware 中间件 traefik (二) ingressRoute 路由 traefik (一) 简介、部署和配置 kubernetes | Gateway API 简介及部署 linux | dns 配置文件中 search 和 options ndots 详解 kubernetes | command args 和 dockerfile 中的 ENTRYPOINT CMD kubernetes | statefulset 控制器详解 docker | dockerfile 最佳实践 docker | dockerfile 指令详解 linux | kill 命令详解以及 linux 中的信号 troubleshooting | elasticsearch 安装插件报错 shell | if 条件判断 docker | 下载外网镜像的几种方式 python | 鬼谷子数学问题 steam挂刀教程 linux | history 命令的格式化输出 shell | 将本地镜像批量推送到 harbor windows | hosts 文件修复 kubernetes | configmap & secret kubernetes | RBAC 鉴权和 NetworkPolicy kubernetes | service & ingress kubernetes | 存储 kubernetes | 滚动升级和自动伸缩 kubernetes | 控制器 kubernetes | 调度 kubernetes | pod kubernetes | 杂记 linux | set 命令详解 ceph | openeuler 部署 ceph-v16 ceph | ceph-v16 离线安装解决方案 pxe 如何应对复杂的服务器硬件环境 python | 批量修改目录下文件名 《微习惯》 ceph | openeuler (aarch64) 部署 ceph-v16 troubleshooting | glibc 误升级后修复 pxe 安装配置大全 《人间失格》 跑步日常 [置顶] Hello, hugo! shell | 检索某 url 中所有文件的内容 shell | 不同执行方式的区别 shell | 开启 debug 模式 vscode | 常见问题 windows & linux 多网卡时设置默认路由以及添加静态路由 mysql (二) 主从复制原理 GTID 并行复制 mysql (一) 部署 mysql | 杂记 cicd | jenkins 部署 mall-swarm 项目 httpd 源码打包编译成 rpm 包 openssl 源码打包编译成 rpm 包 centos7 | 修改网卡名称 ceph | pool pg_num 配置 docker | 脚本方式批量导出/导入镜像 centos 密码尝试次数过多问题处理 centos7 | 升级内核至 5.10 CVE-1999-0526 ceph | centos7 部署 ceph-v12 python | 修改 pip 源 troubleshooting | 安装 cloud-init 后导致 ssh 连接失败 windows | autohotkey 常用脚本
kubernetes | 日志
lvbibir · 2022-10-03 · via lvbibir's Blog

0 前言

基于 centos7.9docker-ce-20.10.18kubelet-1.22.3-0

kubelet logs 命令的流程

kubectl logs --请求--> apiserver --请求--> kubelet --读取--> container日志

k8s 日志包含两大类:

  • k8s 系统的组件日志
  • k8s 集群中部署的应用程序的日志
    • 标准输出
    • 日志文件

1 组件日志

journalctl -u kubelet
kubectl logs kube-proxy -n kube-system
/var/log/messages

2 pod 日志

2.1 标准输出

实时查看 pod 标准输出日志

kubectl logs [options] <podname>
kubectl logs -f <podname>
kubectl logs -f <podname> -c <containername>
kubectl logs --previous <podname> # 查看pod上次重启的日志

k8s 会将每个 pod 中每个 container 的日志记录到 pod 所在 node 的 /var/log/pods 目录中, 日志文件其实是 docker 保存的日志文件的一个软连接.

k8s 会为每个 pod 的每个 container 日志保留 2 份, 一份为 container 当前状态的日志, 另一份是 container 上一次生命周期的日志, 日志保留数量应该是由 k8s 的 gc 机制管控.

# k8s 日志
/var/log/pods/<pod namespace>_<pod name>_<pod uid>/<容器名称>/容器重启次数.log
# docker日志
/var/lib/docker/containers/<container-id>/<container-id>-json.log

示例

# 可以看到 calico-kube-controllers 这个 pod 重启了 7 次
[root@k8s-node1 ~]# kubectl get pods -n kube-system -l k8s-app=calico-kube-controllers
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-6c76574f75-69flf   1/1     Running   7 (41h ago)   4d1h

# k8s 分别保存了编号 6 和 7 两个日志文件
[root@k8s-node3 ~]# ls -l /var/log/pods/kube-system_calico-kube-controllers-6c76574f75-69flf_066e1042-97a4-4547-8d2d-6580cbad40c5/calico-kube-controllers/
lrwxrwxrwx. 1 root root 165 Apr 20 14:31 6.log -> /var/lib/docker/containers/8ed4865daa5d984d9b7e3412f61251ce1a5e12e295fce1f14ee341c3f79b1afe/8ed4865daa5d984d9b7e3412f61251ce1a5e12e295fce1f14ee341c3f79b1afe-json.log
lrwxrwxrwx. 1 root root 165 Apr 23 10:23 7.log -> /var/lib/docker/containers/c30d353ee464efd853968dcd1524933aa214294303e5a7cd7828b0e86f0e94ec/c30d353ee464efd853968dcd1524933aa214294303e5a7cd7828b0e86f0e94ec-json.log

# 7 号日志文件是当前生命周期的日志
[root@k8s-node1 ~]# kubectl logs --tail=1 calico-kube-controllers-6c76574f75-69flf -n kube-system
2023-04-23 03:05:54.256 [INFO][1] resources.go 350: Main client watcher loop
[root@k8s-node3 calico-kube-controllers]# tail -n 1 7.log | python -m json.tool
{
    "log": "2023-04-23 03:05:54.256 [INFO][1] resources.go 350: Main client watcher loop\n",
    "stream": "stderr",
    "time": "2023-04-23T03:05:54.257447874Z"
}

# 6 号日志文件是上一次生命周期的日志
[root@k8s-node1 ~]# kubectl logs --tail=1 --previous calico-kube-controllers-6c76574f75-69flf -n kube-system
2023-04-21 08:57:20.637 [INFO][1] resources.go 350: Main client watcher loop
[root@k8s-node3 calico-kube-controllers]# tail -n 1 6.log | python -m json.tool
{
    "log": "2023-04-21 08:57:20.637 [INFO][1] resources.go 350: Main client watcher loop\n",
    "stream": "stderr",
    "time": "2023-04-21T08:57:20.637780663Z"
}

2.2 日志文件

比如 nginx 应用的日志一般保存在 accesss.log 和 error.log 日志中,这些日志是不会输出到标准输出的,可以采用如下两种方式进行采集

2.2.1 emptyDir 数据卷

创建 pod 时挂载 emptyDIr 类型的数据卷,用以持久化自定义的日志文件

需要先找到 pod 分配的节点

再查看 pod 的 id

docker ps | grep pod-name 
# 或者
kubectl get pod <podname> -n <namespace> -o jsonpath='{.metadata.uid}'

pod 日志文件路径

/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir

示例

apiVersion: v1
kind: Pod
metadata:
  name: pod-logs-emptydir
spec:
  containers:
  - name: web
    image: nginx
    volumeMounts:
    - name: logs
      mountPath: /var/log/nginx/
  volumes:
  - name: logs
    emptyDir: {}

2.2.2 sidecar 边车容器

通过创建边车容器实现将应用原本的日志文件输出到标准输出

示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: web
    image: nginx:1.22.1
    volumeMounts:
    - name: logs
      mountPath: /var/log/nginx/
  - name: accesslog
    image: busybox:1.28
    command: ['/bin/sh', '-c', 'tail -f /opt/access.log']
    volumeMounts:
    - name: logs
      mountPath: /opt
  volumes:
  - name: logs
    emptyDir: {}

以上