日志
K8S推荐的日志输出方式是将程序日志直接输出到标准输出和标准错误,此时容器运行时会捕捉这些数据,并把它们写到本地存储,然后再由节点上的日志代理或者Pod中的边车日志代理转运到独立的日志处理中心,以供后续分析使用。
这些日志保存在节点本地的 /var/log/container 目录下,我们可以实际创建一个Pod来确认下:
apiVersion: v1 kind: Pod metadata: name: pod-log-stdout spec: containers: - name: count image: busybox:latest args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date) a log entry."; i=$((i+1)); usleep 1000; done']
这个Pod每隔1毫秒会写1条数据到标准输出。要找到容器运行时根据标准输出创建的日志文件,首先要找到这个Pod部署的节点,然后登录到这个节点,就能找到对应的文件了。
如果程序输出的日志很多,占满磁盘空间就是早晚的事。
emptyDir
emptyDir 是一种基于节点本地存储的Volume类型,它通过在本地存储创建一个空目录来实际承载Volume。使用这种存储卷可以在Pod的多个容器之间共享数据,比如一个容器造数据,一个容器消费数据。
看下面这个例子:
apiVersion: v1 kind: Pod metadata: name: pod-vol-empty-dir spec: containers: - name: count image: busybox:latest args: [/bin/sh, -c, 'echo "k8s" > /cache/k8s.txt;sleep 1800'] volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
在 spec.volumes[] 中只需要添加一个名为 emptyDir 的字段,它的配置都可以使用默认值,然后这个卷会被挂载到容器的 /cache 路径。
容器的启动参数是一个shell命令,它会在容器的 cache 目录下创建1个名为 k8s.txt 的文件。容器创建后稍等一会,使用下面的命令获取这个文件的内容:
$ kubectl exec pod-vol-empty-dir -- cat /cache/k8s.txt k8s
可以看到,文件内容正是容器启动命令中写入的 k8s 字符。
K8S会在当前的Node自动创建一个目录来实际承载这个卷,目录的位置在Node的 /var/lib/kubelet/pods 路径下。要查看这个目录中的内容,需要先找到Pod Id和对应的Node,然后登录到这个Node,就能找到这个目录了。minikube中的查找方法如下图所示:
注意用颜色框圈出来的内容,不同的Pod对应的数据不同。查找Pod Id的命令:
kubectl get pods -o custom-columns=PodName:.metadata.name,PodUID:.metadata.uid,PodNode:.spec.nodeName
如果不对 emptyDir Volume 做一些限制,也是有很大的风险会使用过多的磁盘空间。