概述

日志是我们在运维部署当中非常重要的一个东西,对于我个人工作经验而言,一般出现问题,第一步事情就是查看日志,其次是服务器资源查看这样去定位问题,那么在kubernets集群当中呢,我主要给其分了两种类型:

  • kubernetes组件日志
  • 运行于kubernetes上的容器应用日志

kubernetes组件日志

我们知道在kubernetes集群是有多个组件组成,协同为我们提供一个运行容器的环境。当运行当中出现问题,也是需要查看对应组件的日志,进行问题排查、处理。那么常见的日志如下:

1
2
3
4
5
/var/log/kube-apiserver.log
/var/log/kube-proxy.log
/var/log/kube-controller-manager.log
/var/log/kube-scheduler.log
/var/log/kubelet.log

当然根据搭建集群的方式不同,我们配置的日志目录也不尽相同,所以只是列举一下;
如果组件的安装方式由systemd来管理的话 我们还可以通过以下命令进行排错

1
2
3
journalctl -u kubelet

systemctl status kubelet -l

如果使用的是kuernetes插件式方式部署的组件则使用以下命令

1
kubectl logs -f <组件名称>

运行于kubernetes上的容器应用日志

运行于kubernetes上的,比如一个nginx容器;我们如何查看这个应用的日志呢?

从容器标准输出截获

用法类似于docker

1
kubectl logs -f {POD_NAME} -c {Container_NAME}

进入容器进行查看

1
2
kubectl exec -it {POD_NAME} -c {Container_NAME} /bin/sh
docker exec -it {Container_NAME} /bin/sh

将日志文件挂载到主机目录

比如我要把nginx的日志挂载到运行于该POD的宿主机的某个目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 编写yaml文件
# 这里我们知道手写一个yaml是很烦的,而且那么多关键词不是那么容易记住,
# 那么此时就需要在现有环境中找一个pod然后把他的yaml导出再做修改
# 如果环境中还是没有pod,那就直接run一个

$ kubectl get pod nginx-67ccc95d8c-fd5nk -o yaml --export > nginx.yaml

# 删除一些不必要的字段
$ vim nginx.yaml

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
run: nginx
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- mountPath: /var/log/nginx # nginx应用默认日志目录
name: nginx-log-volume
volumes:
- name: nginx-log-volume
hostPath:
path: /var/k8s/log # 宿主机目录

$ kubectl create -f nginx.yaml
pod "nginx" created

# 查看宿主机,这样容器的日志目录我就挂到了宿主
# 而不用在进入容器中查看了
$ ll /var/k8s/log/
total 0
-rw-r----- 1 root root 0 Dec 18 15:17 access.log
-rw-r----- 1 root root 0 Dec 18 15:17 error.log

注意点: 写yaml的时候一定要养成导出现有资源类型的yaml的习惯再去修改;这样能避免手动编写时格式的一些问题,如果关键字记不住那就一定要用kubectl explain获取资源文档