节点级别的日志
This commit is contained in:
@ -409,6 +409,7 @@ module.exports = {
|
|||||||
{
|
{
|
||||||
title: 'Kubernetes 高级',
|
title: 'Kubernetes 高级',
|
||||||
collapsable: true,
|
collapsable: true,
|
||||||
|
path: '/learning/k8s-advanced/index',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
title: 'Kubernetes 日志',
|
title: 'Kubernetes 日志',
|
||||||
|
|||||||
10
.vuepress/public/statics/learning/logs/counter-pod.yaml
Normal file
10
.vuepress/public/statics/learning/logs/counter-pod.yaml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: counter
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: count
|
||||||
|
image: busybox
|
||||||
|
args: [/bin/sh, -c,
|
||||||
|
'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
|
||||||
@ -28,7 +28,7 @@ Kubernetes Dashboard 是 Kubernetes 的官方 Web UI。使用 Kubernetes Dashboa
|
|||||||
|
|
||||||
为了帮助大家选择适合自己的工具,本文将详细描述如何在 Kubernetes 集群中安装 Kubernetes Dashboard。
|
为了帮助大家选择适合自己的工具,本文将详细描述如何在 Kubernetes 集群中安装 Kubernetes Dashboard。
|
||||||
|
|
||||||
## 安装 Kubernetes Dashboard
|
## 安装
|
||||||
|
|
||||||
执行如下命令,以安装 Kubernetes Dashboard
|
执行如下命令,以安装 Kubernetes Dashboard
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ Kubernetes Dashboard 是 Kubernetes 的官方 Web UI。使用 Kubernetes Dashboa
|
|||||||
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
|
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
## 访问 Kubernetes Dashboard UI
|
## 访问
|
||||||
|
|
||||||
Kubernetes Dashboard 默认部署时,只配置了最低权限的 RBAC。当前,只支持使用 Bearer Token登录。
|
Kubernetes Dashboard 默认部署时,只配置了最低权限的 RBAC。当前,只支持使用 Bearer Token登录。
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ description: Kubernetes教程_高级篇_主要涉及日志采集_安全_监控_
|
|||||||
|
|
||||||
Kubernetes教程的深入篇部分,主要涉及的内容有如下几个方面:
|
Kubernetes教程的深入篇部分,主要涉及的内容有如下几个方面:
|
||||||
|
|
||||||
* Kubernetes 日志采集及可视化
|
* [Kubernetes 日志](./logs/)
|
||||||
* Kubernetes 安全
|
* Kubernetes 安全
|
||||||
* Kubernetes 监控
|
* Kubernetes 监控
|
||||||
* Kubernetes 联邦
|
* Kubernetes 联邦
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
vssueId: 125
|
vssueId: 125
|
||||||
layout: LearningLayout
|
layout: LearningLayout
|
||||||
description: Kubernetes教程_本文介绍了如何使用kubectl_Kuboard查看和浏览Kubernetes上的节点_容器组_部署等信息_并依据这些信息作出问题诊断
|
description: Kubernetes教程_本章节中,您将了解到如何在 Kubernetes 中使用最基本的日志,此时,日志信息将输出到标准输出流(standard output stream)。
|
||||||
meta:
|
meta:
|
||||||
- name: keywords
|
- name: keywords
|
||||||
content: Kubernetes教程,K8S教程,日志,Logging
|
content: Kubernetes教程,K8S教程,日志,Logging
|
||||||
@ -9,4 +9,46 @@ meta:
|
|||||||
|
|
||||||
# 基本的日志
|
# 基本的日志
|
||||||
|
|
||||||
正在撰写...
|
本章节中,您将了解到如何在 Kubernetes 中使用最基本的日志,此时,日志信息将输出到标准输出流(standard output stream)。请参考下面的例子,该例子中的 Pod 包含一个容器,该容器每秒钟向标准输出写入一些文本内容:
|
||||||
|
|
||||||
|
<<< @/.vuepress/public/statics/learning/logs/counter-pod.yaml
|
||||||
|
|
||||||
|
* 执行命令
|
||||||
|
``` sh
|
||||||
|
kubectl apply -f https://kuboard.cn/statics/learning/logs/counter-pod.yaml
|
||||||
|
```
|
||||||
|
* 使用 `kubectl logs` 命令查看日志,如下所示:
|
||||||
|
``` sh
|
||||||
|
kubectl logs -f counter
|
||||||
|
```
|
||||||
|
输出结果如下所示:
|
||||||
|
```
|
||||||
|
0: Mon Jan 1 00:00:00 UTC 2001
|
||||||
|
1: Mon Jan 1 00:00:01 UTC 2001
|
||||||
|
2: Mon Jan 1 00:00:02 UTC 2001
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
如果容器已经崩溃停止,您可以仍然使用 `kubectl logs --previous` 获取该容器的日志,只不过需要添加参数 `--previous`。 如果 Pod 中包含多个容器,而您想要看其中某一个容器的日志,那么请在命令的最后增加容器名字作为参数。更多信息请参考 [kubectl logs](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs)。
|
||||||
|
|
||||||
|
常用的日志命令示例如下:
|
||||||
|
``` sh
|
||||||
|
# 追踪名称空间 nsA 下容器组 pod1 的日志
|
||||||
|
kubectl logs -f pod1 -n nsA
|
||||||
|
|
||||||
|
# 追踪名称空间 nsA 下容器组 pod1 中容器 container1 的日志
|
||||||
|
kubectl logs -f pod1 -c container1 -n nsA
|
||||||
|
|
||||||
|
# 查看容器组 nginx 下所有容器的日志
|
||||||
|
kubectl logs nginx --all-containers=true
|
||||||
|
|
||||||
|
# 查看带有 app=nginx 标签的所有容器组所有容器的日志
|
||||||
|
kubectl logs -lapp=nginx --all-containers=true
|
||||||
|
|
||||||
|
# 查看容器组 nginx 最近20行日志
|
||||||
|
kubectl logs --tail=20 nginx
|
||||||
|
|
||||||
|
# 查看容器组 nginx 过去1个小时的日志
|
||||||
|
kubectl logs --since=1h nginx
|
||||||
|
|
||||||
|
```
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
vssueId: 125
|
vssueId: 125
|
||||||
layout: LearningLayout
|
layout: LearningLayout
|
||||||
description: Kubernetes教程_本文介绍了如何使用kubectl_Kuboard查看和浏览Kubernetes上的节点_容器组_部署等信息_并依据这些信息作出问题诊断
|
description: Kubernetes教程_当集群中出现任何问题时,应用程序日志和系统日志是非常有效的定位问题的手段,可以让我们知道集群中正在发生的事情。绝大多数的应用程序都有日志机制,主流的容器引擎也都支持某种形式的日志。
|
||||||
meta:
|
meta:
|
||||||
- name: keywords
|
- name: keywords
|
||||||
content: Kubernetes教程,K8S教程,日志,Logging
|
content: Kubernetes教程,K8S教程,日志,Logging
|
||||||
@ -9,7 +9,9 @@ meta:
|
|||||||
|
|
||||||
# 日志架构
|
# 日志架构
|
||||||
|
|
||||||
当集群中出现任何问题时,应用程序日志和系统日志是非常有效的定位问题的手段,可以让我们知道集群中正在发生的事情。绝大多数的应用程序都有日志机制,主流的容器引擎也都支持某种形式的日志。对容器化应用程序来说,最简单也是被采纳得最多的一种日志方式是,将日志写入到标准输出流(例如,Java中的 System.out.println() 语句,或 log4j 中的 Console Appender)和标准错误流里(例如,Java中的 System.error.println() 语句)
|
> 参考文档: [Logging Architecture](https://kubernetes.io/docs/concepts/cluster-administration/logging/)
|
||||||
|
|
||||||
|
当集群中出现任何问题时,应用程序日志和系统日志是非常有效的定位问题的手段,可以让我们知道集群中正在发生的事情。绝大多数的应用程序都有日志机制,主流的容器引擎也都支持某种形式的日志。对容器化应用程序来说,最简单也是被采纳得最多的一种日志方式是,将日志写入到标准输出流(例如,Java中的 `System.out.println` 语句,或 log4j 中的 Console Appender)和标准错误流里(例如,Java中的 `System.error.println` 语句)
|
||||||
|
|
||||||
然而,容器引擎默认提供的功能通常不足以支撑一个完整的日志解决方案。例如:如果一个容器崩溃了、一个Pod被驱逐了、或者一个节点停机了,您通常仍然需要访问您应用程序的日志。为此,您需要一个生命周期与节点、Pod、容器相对独立的存储空间来存储应用程序日志和系统日志。此时,我们引入了一个新的概念:`集群级别的日志 cluster-level-logging`。集群级别的日志需要一个独立的后端,用于存储、分析、查询日志。Kubernetes默认不提供存储日志信息的方案,但是,有很多种现有的日志存储方案可以集成到 Kubernetes 集群中来。
|
然而,容器引擎默认提供的功能通常不足以支撑一个完整的日志解决方案。例如:如果一个容器崩溃了、一个Pod被驱逐了、或者一个节点停机了,您通常仍然需要访问您应用程序的日志。为此,您需要一个生命周期与节点、Pod、容器相对独立的存储空间来存储应用程序日志和系统日志。此时,我们引入了一个新的概念:`集群级别的日志 cluster-level-logging`。集群级别的日志需要一个独立的后端,用于存储、分析、查询日志。Kubernetes默认不提供存储日志信息的方案,但是,有很多种现有的日志存储方案可以集成到 Kubernetes 集群中来。
|
||||||
|
|
||||||
@ -17,4 +19,4 @@ meta:
|
|||||||
|
|
||||||
* [基本的日志](./basic.html)
|
* [基本的日志](./basic.html)
|
||||||
* [节点级别的日志](./node.html)
|
* [节点级别的日志](./node.html)
|
||||||
* [集群级别的日志](.cluster.html)
|
* [集群级别的日志](./cluster.html)
|
||||||
|
|||||||
@ -9,4 +9,46 @@ meta:
|
|||||||
|
|
||||||
# 节点级别的日志
|
# 节点级别的日志
|
||||||
|
|
||||||
正在撰写...
|
## 日志存储
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
容器化应用程序写入到 `stdout` 和 `stderr` 中的任何信息,都将被容器引擎重定向到某个地方。例如,Docker 容器引擎将 `stdout` 和 `stderr` 这两个输出流重定向到 [logging driver](https://docs.docker.com/engine/admin/logging/overview),Kubernetes的默认配置中,最终 logging driver 最终把日志写入了一个 json 格式的文件。
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
Docker 的 json logging driver 将每一行日志都当做一个单独的消息处理(即 json 文件中的一个对象),它并不直接支持多行的日志消息(multi-line message)。此时,您需要自行在日志代理层或者更高层将 json 日志中的多个对象合并成一个多行日志消息。
|
||||||
|
|
||||||
|
典型的多行日志消息有:Java语言中的 stackTrace,被打印成了多行,但是应该被认为是一条日志消息
|
||||||
|
:::
|
||||||
|
|
||||||
|
默认配置下,如果容器重启了,kubelet 只为该容器保留最后一份日志。如果 Pod 从节点上驱逐,当中所有的容器也将一并被驱逐,连同他们的日志也将被删除。
|
||||||
|
|
||||||
|
## 日志轮转
|
||||||
|
|
||||||
|
在节点级别的日志里,一个非常重要的考量是实现 log rotation(日志轮转),这样的话,日志文件就不会耗尽节点上的存储空间。Kubernetes当前并不负责对日志进行轮转,而是期望由 kubernetes 安装工具来配置一个合适的解决方案。例如,在使用 `kube-up.sh` 脚本安装的 kubernetes 集群中,配置了 [logrotage](https://linux.die.net/man/8/logrotate) 工具,该工具每小时执行一次日志轮转的操作。您也可以配置容器引擎,使其自动轮转应用程序的日志,例如,使用 Docker 的 `log-opt`。在 `kube-up.sh` 脚本中,后者被用在了 GCP 的 COS 镜像中,而前者则用在了任何其他环境。两种情况下,默认的配置是,日志文件达到 10MB 时进行轮转。
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
`kube-up.sh` 脚本如何设置节点级别的日志轮转参数并不重要,因为我们更多人使用 `kubeadm` 安装了 Kubernetes。Kuboard 网站将在随后提供与此相关的配置信息。
|
||||||
|
:::
|
||||||
|
|
||||||
|
<!-- FIXME -->
|
||||||
|
|
||||||
|
当您在 [基本的日志](./basic.html) 章节中执行 [kubectl logs](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs) 命令时,节点上的kubelet 在接收到该请求时,直接读取了日志文件,并将日志文件的内容作为相应返回到 kubectl 的终端界面上。
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
如果KUbernetes的外部系统执行了文件的轮转,只有最新日志文件中的内容可以通过 `kubectl logs` 命令返回。例如,如果假设日志文件刚刚达到 10MB, `logrotate` 执行了日志轮转,将所有日志挪到一个带时间戳的日志存档文件中,并清空了当前日志文件,此时 `kubectl logs` 将返回空的日志信息(因为当前日志文件为空)
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 系统组件的日志
|
||||||
|
|
||||||
|
Kubernetes中存在两种类型的系统组件:
|
||||||
|
* 运行在容器中的系统组件
|
||||||
|
* 不运行在容器中的系统组件
|
||||||
|
|
||||||
|
例如:
|
||||||
|
* kubenetes scheduler 和 kube-proxy 运行在容器中
|
||||||
|
* kubelet 和容器引擎(例如 docker)不运行在容器中
|
||||||
|
|
||||||
|
在带有 `systemd` 的机器上,kubelet 和容器引擎将日志写入 Linux 系统的 `journald` 中。如果没有 `systemd`,kubelet 和容器引擎将日志写入目录 `/var/log` 中的 `.log` 文件。运行在容器中的系统组件则使用将日志写入目录 `/var/log` 中(绕过了默认的日志机制--即将日志写入`stdout` 和 `stderr`)。这些系统组件在记录日志是,都使用了 [klog](https://github.com/kubernetes/klog) 日志工具包。您可以通过 [development docs on logging](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md) 查看他们关于日志的约定。
|
||||||
|
|
||||||
|
与容器化应用程序的日志相似,记录在 `/var/log` 目录下的系统组件的日志也应该进行轮转。在使用 `kube-up.sh` 脚本安装的集群中,这些日志文件将由 `logrotate` 工具进行轮转,轮转的时机是:每天或者每当日志文件超过 100MB 时。
|
||||||
|
|||||||
Reference in New Issue
Block a user