【良品】k8s的sidecar原理及实例妙解

请添加图片描述

一、 原理

提示:通过shell脚本,模拟输出的操作日志,并将其输出到某个文件

先要理解下面的shell脚本意思:执行之后会发现,每隔1秒屏幕将时间输出到/var/present.log文件中

vim sidecar-test.sh

内容如下:

#!/bin/bash
i=0
while true;
do
        echo "$(date) INFO $i"  >> /var/present.log;
        i=$((i+1));
        sleep 1;
done

执行脚本:sh sidecar-test.sh

举一反三:这样,如果某个服务异常,排错是不是可以通过这个命令获取有用信息?

再执行命令,可查看到pod内指定容器的日志:kubectl logs -f po/present busybox

为什么用它? 可能有疑问,为什么不直接用这个命令?而要多此一举。因为,那样,日志分散存在每个容器中,不方便统一管理,采取sidecar方式,万一某个容器挂了,日志自然也无法查看,它的日志若是存在sidecar里,即便如此,也可以存在。

详情可参看官方网址:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/


二、 示例要求

要求:有个名为present的pod,需要使用sidecar进行日志采集。

分析:
1、创建一个pod名为present
2、包含一个主容器,名为count
3、包含一个边车容器,名为busybox
4、在两个容器上挂载一个共享卷 /var
5、在名为count的容器执行上面的脚本,向日志文件写入内容
6、在名为busybox的容器执行命令查看到脚本写的内容。


三、创建并验证

1、完整的yml配置清单文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: legacy-app
  namespace: default
spec:
  containers:
  - args:
    - /bin/sh
    - -c
    - 'i=0; while true; do echo "$i: $(date)" >> /var/log/legacy-ap.log; i=$((i+1));
      sleep 1; done'
    image: busybox
    imagePullPolicy: IfNotPresent
    name: count
    resources: {}
    volumeMounts:
    - mountPath: /var/log
      name: logs
#与args对齐
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    args: [/bin/sh, -c, 'tail -n+1 -F /var/log/legacy-ap.log']
    volumeMounts:
    - name: logs
      mountPath: /var/log
#与containers对齐
  volumes:
  - name: logs
    emptyDir: {}

提示:缩进距离一定要准确
在这里插入图片描述

2、用上面的配置清单执行创建命令:
在这里插入图片描述
3、验证:成功则输出如下:
在这里插入图片描述