前言
从即日起开写本系列,此系列是依据极客时间《深入剖析kubernetes》专栏整理的笔记,本系列会持续更新。
第一篇 容器技术基础之进程
进程可以看作是一个程序运行起来后的计算机执行环境的总和。
cgroup技术是用来制造约束的主要手段,用于限制资源。
namespace是用来修改进程视图的主要方法,用于实现对应资源等的隔离。
容器docker里面最开始运行的进程,是PID=1的进程,这个1号进程只是容器中虚拟出来的,在宿主机系统进程中的pid不是1,例如为100,这是被pid namespace机制做了隔离的结果,,使得容器内进程的pid被施了障眼法,看不到前面的99个进程,而自己就是pid=1。
Linux系统提供的namespace有:mount,uts,ipc,network,user,pid
docker实际上是在创建容器进程时,指定了一组namespace参数,容器只能看到当前namespace所限定的资源等,容器其实是一种特殊的进程
容器是单进程的,容器镜像里面集成了jdk,netstat,ping等,容器启动时里面java进程在运行,但在容器里面执行ping命令时,此时ping命令是不受docker控制的,所以单进程不是只能运行一个进程,而是只有一个进程是可控的,这里的可控是指exec进去之后启动的进程,不受控制,控制指它们的回收和生命周期管理,pod中的prestop,poststart是pid=1的进程的子进程,不能把pod的hook写成后台进程,因为容器中只有pid=1的进程是容器可控的。
镜像只是提供了一套镜像文件系统中的各种文件,而各种内核相关的模块或者特性支持,完全依赖于宿主机
虚拟机与容器的区别: 虚拟机是硬件级别(虚拟硬件)的隔离,而容器是进程的隔离
通过查看/proc/1/cgroup下的文件结构,可以判断目前是在容器里面还是在宿主机里
监控容器内jvm使用情况,可以使用一个sidecar容器来监控主容器内tomcat的jmx,并将其数据转换成prometheus拉取的格式