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.更改之后

  1. 直接保存退出
  2. 如果是导出的配置文件,先将原来的资源控制器删除,然后再次kubectl apply -f即可。

4.查看日志的方式

# 方式1
kubectl kubectl logs -f pod_name container_name

# 方式2
kubectl exec 进入手动查看。
posted @ 2022-04-15 11:23  Gshelldon  阅读(137)  评论(0编辑  收藏  举报