【良品】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、验证:成功则输出如下: