sidecar代理异常容器的日志
官网参考地址:https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/
背景
1.在k8s集群中异常的容器、非标准的容器通过kubect logs无法查看到容器内部的日志。
2.kubectl describe 查看到的是pod控制器信息的日志,根据报错无法查找到根本原因。
3.控制器的日志也没有明显的报错。
4.kubect debug命令没有,针对比较老的版本。
1.会挂掉的容器
现在的容器即使是启动起来通过kubectl logs -f
也不会输出日志信息,describe
也没有很有有用的信息。这是一个非标注定义镜像拉起来的容器。所以没有日志信息和任何输出。在这种情况下需要知道容器的日志目录来排查容器内部的信息,具体方法:
1.kubectl edit 资源名称 根据定义的yaml查看。
2.如果在yaml中找不到记录日志的目录,可以通过容器所在的节点使用
docker inspect 容器ID
查看容器的详细信息来查看容器中日志记录的位置。
cat busy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: busybox
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- image: busybox
name: busybox
args: [/bin/sh, -c, 'mkdir -p /var/log;for i in `seq 10`;do echo $i >> /var/log/echo.log;sleep 1;done;exit 1']
imagePullPolicy: IfNotPresent
2.添加挂载的目录
通过直接在线编辑的方式,需要直接更改控制器的配置文件,在更改之前可以先把原来的yaml备份。
# 备份
kubectl get deployments.apps busybox -o yaml > sidecar.yaml
# 主要的部分
kubectl get deployments.apps busybox -o yaml > 1.txt
[root@k8s ~]# cat 1.txt
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-04-13T16:12:48Z"
generation: 1
labels:
app: busybox
managedFields:
- apiVersion: apps/v1
name: busybox
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: busybox
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: busybox
spec:
containers:
- args:
- /bin/sh
- -c
# 这里是原容器把日志记录到的目录
- mkdir -p /var/log;for i in `seq 10`;do echo $i >> /var/log/echo.log;sleep
1;done;exit 1
image: busybox
imagePullPolicy: IfNotPresent
name: busybox
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
# 问题容器挂载的目录
- mountPath: /var/log
name: varlog
# sidecar查看挂载目录中打印的功能。
- args:
- /bin/sh
- -c
- tail -n+1 -F /var/log/echo.log
image: busybox:1.28
imagePullPolicy: IfNotPresent
name: count-log-2
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
# 在sidecar的容器中挂载目录
volumeMounts:
- mountPath: /var/log
name: varlog
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
# 定义了一个空目录的挂载点
volumes:
- emptyDir: {}
name: varlog
3.更改之后
- 直接保存退出
- 如果是导出的配置文件,先将原来的资源控制器删除,然后再次
kubectl apply -f
即可。
4.查看日志的方式
# 方式1
kubectl kubectl logs -f pod_name container_name
# 方式2
kubectl exec 进入手动查看。