【问题标题】:Mount Pod Logs to Desired Volume directory将 Pod 日志挂载到所需卷目录
【发布时间】:2021-11-10 17:12:12
【问题描述】:

我正在尝试将我的 Pod 日志目录从 /var/log/pods 挂载到本地节点卷 /var/data10

部署文件:

apiVersion: apps/v1
kind: Deployment
metadata:       
   name: nginx-counter
   namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:      
      app: my-nginx
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
       nodeSelector:
         kubernetes.io/hostname: kworker3
       containers:
       - name: count
         image: busybox
         args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
         ports:
         - containerPort: 80
         volumeMounts:
           - name: dirvol
             mountPath: "/var/log/containers"
             readOnly: true
         env:
           - name: POD_NAMESPACE
             valueFrom:
               fieldRef:
                 fieldPath: metadata.namespace
           - name: POD_ID
             valueFrom:
               fieldRef:
                 fieldPath: metadata.uid
           - name: POD_NAME
             valueFrom:
               fieldRef:
                 apiVersion: v1
                 fieldPath: metadata.name
       volumes:
           - name: dirvol
             persistentVolumeClaim:
                     claimName: nginx-pvc

PV+PVC文件:

---
kind: PersistentVolume
apiVersion: v1
metadata:
    name: nginx-pv
    namespace: default
spec:
  storageClassName: nginx-sc
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
      path: "/var/data10"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: nginx-pvc
    namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
     requests:
         storage: 50Gi
  storageClassName: nginx-sc
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
    name: nginx-sc
    namespace: default
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---

终端窗口:

us@kworker3:~$ cd /var/log/pods/default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b/
us@kworker3:/var/log/pods/default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b$ cd count/
us@kworker3:/var/log/pods/default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b/count$ ls
0.log
us@kworker3:/var/log/pods/default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b/count$ cd
us@kworker3:~$ 
us@kworker3:~$ 
us@kworker3:~$ 
us@kworker3:~$ cd /var/data10
us@kworker3:/var/data10$ cd default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b/
us@kworker3:/var/data10/default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b$ ls
us@kworker3:/var/data10/default_nginx-counter-6bdd59f45f-psd9x_f1999c22-6702-41b6-afb7-26db4239977b$ ls

我正在尝试获取日志文件 0.log 并将其放入持久卷 /var/data10 但您可以看到它是空的。

我知道我可以使用像 fluentd 这样的日志代理来获取我的容器日志,但我正在尝试使用这种方式来获取我的日志。

请注意,我正在尝试将此场景应用于真正的 Web 应用程序,kubernetes pod 通常会将日志扔到节点上的 /var/log/containers 目录中,我的目标是挂载将(容器的)日志文件保存到 hostDisk (/var/data10),这样当 pod 被删除时,我的卷中仍然有日志。

【问题讨论】:

  • 你能分享你的 PV 和 PCV yamls 吗?
  • 更新为包含 PV+PVC

标签: kubernetes logging


【解决方案1】:

符号链接在 hostPath 中不起作用。使用 tee 在 pod echo ... | tee /pathInContainer/app.log 中制作一个副本,然后挂载到 /var/data10 hostPath 卷。如果tee 不理想,最好的办法是运行一个日志代理作为sidecar。

请注意,您的 PV hostPath.path: "/var/data10" 不会包含任何数据,因为您的标准输出不会保存在此处。您将此 hostPath 挂载在容器中,因为“/var/log/containers”将毫无用处。

【讨论】:

  • 有没有办法将我的容器日志保存在卷 hostPath 内的 /var/log/containers/<..> 目录中?
  • 您的动机是复制您的应用程序日志。但请注意,在现实世界中您不太可能像这样使用 hostPath,否则您的应用程序将一直被绑定到特定节点 - 这是不现实的,因为节点可以来来去去。
  • 感谢您的洞察力,我有为这种情况运行日志代理的想法,但认为可能有更简单的方法。我同意你的观点,因为卷安装到特定节点,所以这个想法不能应用于生产级别。最好使用不同的卷类型,例如 NFS 或 CSI。
  • Pod 也可以来来去去(例如缩放),保存在 hostPath 上的日志文件将分散在整个集群中......稍后您仍然需要整合这些“分布式”日志以获得正确的时间顺序命令。最好在一开始就集中摄取它们。使用 NFS 可能会缓解到处存在日志文件的问题,但它并不能帮助您整合日志消息。例如,仅查看日志文件名并不能说明太多。
  • 官方弹性栈日志代理将被Beat(例如FileBeat,MetricBeat)。当然,Fluentd、FluentBit 等可以工作,但与 Beat 相比,提供的集成功能较少。如果您使用 EKS 等云托管 K8,则使用 Container Insight 和许多其他 AWS 托管服务可能更容易。但这取决于你。享受吧!
猜你喜欢
  • 2023-03-03
  • 2021-06-14
  • 2021-10-30
  • 2021-11-22
  • 1970-01-01
  • 2019-09-27
  • 2018-07-10
  • 1970-01-01
  • 2020-10-12
相关资源
最近更新 更多