首页 > 其他分享 >为什么 kubelet 不使用容器化部署?

为什么 kubelet 不使用容器化部署?

时间:2023-07-12 12:13:02浏览次数:56  
标签:容器 部署 宿主机 namespace kubelet init 挂载

每日一问系列

为什么 kubelet 不使用容器化部署?

通过脚本(shell/ansible 等)在节点上部署 kubelet 服务时,涉及 kubelet 进程 service 启动配置、证书等,为什么不使用容器化部署 kubelet 呢?直接 docker run ... 一键部署多简单?

这里的主要原因是 kubelet 除了需要调用容器运行时,还需要直接操作宿主机以配置目标业务容器的网络、数据卷等

假设 kubelet 在容器中运行

容器运行时如 docker 可以通过挂载 docker sock 实现

网络问题可以通过共享宿主机 net namespace 实现,如 docker 的 --net host

对于目标业务容器的卷挂载问题就会比较麻烦,kubelet 隔着容器的 Mount Namespace 和文件系统不能直接操作宿主机的文件系统

比如,如果用户想要使用 NFS 做容器的持久化数据卷,那么 kubelet 就需要在容器进行绑定挂载前,在宿主机的指定目录上,先挂载 NFS 的远程目录

可是,这时候问题来了。由于现在 kubelet 是运行在容器里的,mount namespace 是直接开启的,这就意味着它要做的这个“mount -t nfs”命令,被隔离在了一个单独的 mount namespace 中,即 kubelet 做的挂载操作,不能被“传播”到宿主机上

正常情况容器数据卷的挂载流程

kubelet 直接运行在宿主机时容器数据卷的挂载流程是怎么样的呢?例如将宿主机的 /home 目录挂载到容器的 /test 目录

准备容器的 rootfs:kubelet 通过容器运行时下载镜像并通过指定的 storage driver 在宿主机上联合挂载出 rootfs,如 overlay2 的 MergedDir /var/lib/docker/overlay2/{id}/merged

创建 init 进程:kubelet 通过容器运行时创建出一个 init 进程,如 dockerinit 并为 init 进程开启 cgroup 和 namespace,此时 mount namespace 开启了,但是默认继承了宿主句的 mount namespace 视图,所以 init 进程可以看到上述宿主机准备的 rootfs 和在宿主机上要被挂载到容器的目录

执行 bind 挂载操作:bind 挂载即绑定挂载,可以将一个目录或者文件挂载到另一个目录。由于此时的 init 进程可以看到宿主机文件系统,所以 bind 挂载的 src 就是宿主机目录 /home,dst 就是 /var/lib/docker/overlay2/[可读写层 ID]/test

挂载 rootfs:在容器的 mount namespace 视图下,执行 chroot 或者 pivot_root,这样 init 进程看到的 rootfs 就切换成了前面准备好的 rootfs

启动业务进程:init 进程使用 execv 系统调用将用户定义的 ENTRYPOOINT+CMD 取代自己为 1 号进程

值得注意的是:执行 bind 挂载动作在容器 mount namespace 视图下执行,因此宿主机看不到挂载信息,保证容器的隔离性不会被 Volume 打破

标签:容器,部署,宿主机,namespace,kubelet,init,挂载
From: https://www.cnblogs.com/orchidzjl/p/17547163.html

相关文章

  • nginx部署vue网站
    1.背景        最近gpt很火,于是尝试用gpt来进行古诗词取名,做了一个vue的网站进行展示,第一次部署,踩了一些坑。2.实施nodejs安装:在任意目录执行如下命令进行安装包下载:wgethttps://npm.taobao.org/mirrors/node/v14.17.6/node-v14.17.6-linux-x64.tar.gz解压 tar......
  • XXL-JOB 打包成war部署
    1、修改配置xxl-job.pom.xml<failOnMissingWebXml>false</failOnMissingWebXml> 2、修改xxl-job-admin.pom.xml<packaging>war</packaging> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId&g......
  • Docker部署
    概述最近在学习后端的各种中间件,如果一个个安装,估计所有的时间都得在部署运维上面了,没有时间编写测试代码了,因此学习记录下docker的方法,意在简化部署方式,将主要精力放在研究使用中间件上。官网下载安装dockerhttps://docs.docker.com/desktop/install/docker流程1.dockerpul......
  • 核心容器总结
       ......
  • 容器
          ......
  • ASP.Net Core 项目部署
    安装环境部署环境有两种:.NetCoreSDK包含所有运行时和程序开发包,用于程序开发使用,体积相对较大。.NetCoreRuntime仅用于程序运行,不包含开发包,体积小。注:部署程序时不推荐安装SDK,优先使用Runtime环境。下载地址:[https://dotnet.microsoft.com/download]控制台运行......
  • 实例分享| anyRTC 部署安徽某市应急实战指挥平台
    在当前的社会环境下,应对各种突发事件和危机管理是各级政府和企事业单位的重要职责,为了提高应急指挥的效率和效果,充分利用现代信息技术为突发事件的应急处理服务是当前的大趋势,整合相关资源,应对各种自然灾害等突发紧急事件,第一时间应对突发紧急事件、实现快速反应、减少损失的目标......
  • 实例分享| anyRTC 部署安徽某市应急实战指挥平台
    在当前的社会环境下,应对各种突发事件和危机管理是各级政府和企事业单位的重要职责,为了提高应急指挥的效率和效果,充分利用现代信息技术为突发事件的应急处理服务是当前的大趋势,整合相关资源,应对各种自然灾害等突发紧急事件,第一时间应对突发紧急事件、实现快速反应、减少损失的目标。......
  • go项目的打包部署
    1.go项目在window下编译简易打包1).在windows下直接编译生成main.exe文件在项目main.go同级目录下执行以下命令gobuildmain.go2).将当前目录下的main.go打包成gotest.exe文件(在windows下可以直接执行)在项目main.go同级目录下执行以下命令gobuild-ogotest.exemain.go9294......
  • 业务系统常规部署交接模板
    1总体情况ip应用192.168.1.1前端1192.168.1.2后端1......1.1前端1#1.进程查看#2.服务路径以及启停#3.版本更新#4.日志查看#5.配置文件说明1.2后端1#1.进程查看#2.服务路径以及启停#3.版本更新#4.日志查看......