我们了解到k8s主要分为两种部署方式,一种是kubeadm
,另外一种是二进制,而kubeadm
方式部署的k8s集群,除了kubelet
之是使用systemd
之外,其他组件都是以容器化
的方式部署的,而二进制部署的集群,都是用systemd
方式管理组件服务的,因此这两种部署方法查看日志的方式也不一样。
指定kubelet
日志:
journalctl -u kubelet
提示:日志过多建议重定向到文件中方便查看。
而journal
这个命令实际查看的日志来源于:/va/log/messages
补充:主配置文件地址:
/var/lib/kubelet/config.yaml
注意:二进制部署方式一般会指定日志的路径,故上述方法不适用二进制部署方式
kubectl logs <pod名称> -n <命名空间>
可搭配
--tail
和-f
使用
该日志被docker容器接管,实际目录为:/var/lib/docker/containers/<container-id>/<container-id>-json.log
查看方式:查询该pod所在的节点-》查询对应的docker容器id-》进入对应目录查看
查看日志方式:进入pod中-》查看对应目录下的日志
改进办法:将日志文件持续化到宿主机上
扩展:
docker中涉及的两个卷volume
和bind mount
,其中volume
是卷目录由docker管理,bind mount
是挂载宿主机上文件或者目录到容器中,而k8s与docker相对应的,也有两种卷,分别为emptydir
和hostpath
,emptydir
由k8s管理,文件存放在k8s自己设定的目录中,hostpath
可以由用户控制,可以放到宿主机上任意目录中。
示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: web
image: lizhenliang/nginx-php
volumeMounts:
- name: logs
mountPath: /usr/local/nginx/logs
volumes:
- name: logs
hostPath:
path: /tmp/logs
type: Directory
apply之前先在每个节点上创建
、tmp/logs
目录,否则pod会创建失败
参数解释:
volumes
:设置数据卷来源type
:挂载的类型,文件还是目录path
:挂载的文件或者目录的路径volumeMounts.name
与volumes.name
:卷名称需要对应mountPath
:容器中目录挂载的路径pod创建成功后,会在对应节点的/tmp/logs
下发现有两个nginx的日志文件
curl 10.244.36.92 后会在access.log下实时刷出日志:
将日志文件挂载到宿主机目录,这样一来,就可以进容器查看或者在宿主机查看日志了。
示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod2
spec:
containers:
- name: web
image: lizhenliang/nginx-php
volumeMounts:
- name: logs
mountPath: /usr/local/nginx/logs
volumes:
- name: logs
emptyDir: {}
emptyDir日志目录查看方法:
/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/
:curl 同样达到上述效果。
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:kubernetes日志管理分析