宜信容器云排错东西集

宜信容器云是一套依据kubernetes的容器处理途径。事务线用户在容器云上安顿运用程序时,常常会遇到容器无法建议或许运用程序作业不正常的状况。为了便当用户排查在运用上云进程中的问题,咱们在web端集成了一系列的排错办法,如下图:

宜信容器云排错东西集

一、终端信息

终端信息检查的是容器实例作业时的规范输出日志。

作用等同于:kubectl logs PODNAME [-c CONTAINER]

根柢原理如下图:

宜信容器云排错东西集

运用安顿时,所属节点的kubelet经过grpc调用容器作业时接口(container runtime interface),来央求docker照顾进程创立容器作业时。

此刻,docker照顾进程会创立一个协程来接纳容器作业时的规范输出日志,这个协程究竟将STDOUT(规范输出)的日志写到容器作业时地址节点的对应目录下:/var/lib/docker/containers/container_id/{container_id-json.log}

如下图:

宜信容器云排错东西集

在web端检查对应实例的终端信息时,kubelet将接纳的Api-server央求转化成docker client来央求docker照顾进程。Docker照顾进程到相应的目录下读取对应容器的日志文件数据,再由kubelet回来日志数据到Api-server,究竟闪现到web端,供用户检查。

容器日志的生命周期与容器的生命周期一同,容器毁掉后,其相关的日志文件也会毁掉。

二、events

events是kubelet用来记载容器建议及作业进程中的作业。

作用等同于:kubectl get events

相同,当运用kubectl describe pod来检查pod时,也相同能看到与该pod相关的events,从这些信息中可以很清楚看到作业的状况改动,然后得知pod建议失利的多种原因。比方:

1)没有可用的node供调度,如调度的节点资源不行;

2)健康状况检查失利;

3)拉取镜像失利,如下图:

宜信容器云排错东西集

events的根柢完毕如下图:

宜信容器云排错东西集

events中包括作业相关的类型、原因、来历、音讯等,会在kubelet和controller manager等组件中生成,播送出去后,经过一系列的函数过滤、聚合等,再发送给Api-server存到etcd中。当web端检查events作业时,央求Api-server读取etcd中相应的作业,并回来闪现,供用户检查异常参数、过失状况等。

三、web terminal

web terminal可供给一个交互式的界面shell,可实施各种指令。

作用等同于:kubectl exec -it <podName> -c <containerName> bash

web端闪现如图:

宜信容器云排错东西集

完毕如下:

宜信容器云排错东西集

web terminal主要是经过websocket技能完毕的,前端交互界面运用的是开源项目container-terminal(https://github.com/kubernetes-ui/container-terminal),其供给了一个容器的TTY(虚拟终端)。

当检查web terminal时,前端web建议了一个websocket央求,到Api-server。再由所属节点的kubelet响应该Api-server的央求,并与容器作业时树立联接。

之所以kubelet可以与容器作业时树立联接,是由于kubelet 界说了一个 CRI 规范中的 RuntimeServiceClient 接口,而容器作业时中的RuntimeServiceServer(即Streaming Server,供给了streaming API)完毕了该接口。

kubelet 和容器作业时树立联接后,kubelet回来央求,Api-server将央求晋级SPDY(SPDY答应在单个的TCP央求中复用独立的STDIN/STDOUT/STDERR),并将WS的流映射到SPDY相应的规范流上,便与方针容器作业时Streaming Server树立了流,Api-server便完毕了web与容器作业时的数据交互。

此刻,在web端输入指令,下发实施完后,可看到回来的作用,如此便完毕了交互。

web terminal供给了进入容器的便当,用户都可以实施任何操作,为了安全,咱们做了必要的安全措施:

1)记载了用户的操作指令。

待用户输入指令后,记载操作,作为安全审计。

2)出产环境运用普通用户进入容器。

即在exec进入容器时的指令/bin/bash -i更改为/bin/bash –c chmod -R 777 $KUBERNETES_FILELOGS;useradd spider > /dev/null 2>&1;su spider,其间环境变量$KUBERNETES_FILELOGS为在容器创立时需求赋权的文件目录。主要是避免用户误操作,删去存储挂载等。

四、debug容器

debug容器是经过东西容器来对事务容器排障。

在运用web terminal来调试运用程序的进程中,事务线用户常常需求林林总总的指令来调试程序。之前的解决方案要么是给事务线定制他们所需的根底镜像,尽量包括多的所需指令,要么就是在事务线用户构建镜像时在Dockerfile中增加指令。

可是,由于事务线许多,定制根底镜像作业量过大;而在构建事务镜像时增加过多指令,又操作繁琐,并可能会带来安全危险危险。这些解决方案实际上都不契合容器技能的实践准则--尽可能构建最简容器镜像,而精简后的镜像又极度缺失所需的指令东西。

鉴于存在这样的仇视,咱们集成并改造了kubectl-debug(https://github.com/aylei/kubectl-debug)这个插件。容器实质上是由cgroup和namespace捆绑的一组进程,只需可以加入到这个进程的各项namespace,就可完毕交互。因而,debug容器的根柢思路是:建议一个包括许多排障东西指令的容器,来加入到事务容器的namespace中,便可以在东西容器中完毕对事务容器的排障。

作用类似于:

docker run -it --network=container:<container_ID> --pid=container:<container_ID> --ipc=container :<container_ID> -v /log/container _ID:/debugviewlogs <image>

web端闪现如下图:

宜信容器云排错东西集

debug容器原理如下图:

宜信容器云排错东西集

将Debug-agent以DaemonSet的办法安顿到kubernetes集群的悉数节点中,并挂载了宿主机的/var/docker/docker.sock,完毕与docker daemon的通讯。如上图的进程:

1)web端供给pod的cluster、namespace、podname信息,向后端服务Backend server建议websocket央求;

2)后端服务Backend server接纳到央求后,向Api-server验证该pod是不是真的存在,并回来pod地址的宿主机Node和pod的容器信息,依据状况判别是否可以debug;

留神:假定pod的状况reason是CrashLoopBackOff,那么Backend server将会央求Api-server让kubelet复制一个pod, 复制的Pod被改写了建议指令(sleep)、去掉了label及健康检查。后续debug操作是对复制后pod进行的。

3)Backend server传递debug的pod信息,建议debug央求(晋级的SPDY央求,映射了WS的规范流)。

4)Debug-agent收到央求后,开始拉取debug东西镜像,然后创立一个debug容器,并将debug容器的各个namespace设置为方针事务容器app的namespace。再将宿主Node的目录/log/ 挂载到debug容器的目录/debugviewlogs中,便可完毕将debug容器中生成的文件在web端下载。如下两图:

宜信容器云排错东西集

宜信容器云排错东西集

创立完debug容器后,Debug-agent将Backend server的SPDY央求中继到debug容器。debug容器将SPDY的规范流attach到事务容器中。如此,web端便可与debug容器完毕交互。在debug操作完毕后,Debug-agent便会将debug容器拾掇收回。相同的,debug的操作也做了安全审计。

因而,咱们只需构建一个包括许多排障东西的镜像,不只实践了事务镜像尽可能最简的准则,还供给了调试运用程序所需的各种指令东西。

总结

终端信息、events、web terminal及debug容器都供给了一个可视化的web,让用户都可以便当快速地完毕对pods排错和对运用程序的排障。

作者:段德华

来历:宜信技能学院