每日一问系列

为什么 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 打破

为什么 kubelet 不使用容器化部署?的更多相关文章

  1. .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...

  2. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  3. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署

    1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...

  4. 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))

    容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器

  5. angular应用容器化部署

    angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...

  6. Flask容器化部署原理与实现

    本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...

  7. Ubuntu系统下容器化部署gitlab

    容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...

  8. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

  9. Jaeger容器化部署

    概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...

  10. Gogs的Docker容器化部署流程遇到的问题

    Gogs的Docker容器化部署流程遇到的问题   最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...

随机推荐

  1. Linux环境变量及其配置

    为什么要说这个呢? 本人喜欢使用Linux开发(工作是个硬要求,有些时候不能使用Linux,比如我上一个工作.但是有些时候呢,工作环境比较开放,我可以选择我喜欢的系统进行工作:比如我现在的工作.红红火 ...

  2. 今天能恢复我的Django吗——恢复了!

    今天能用两小时恢复我的Django吗 实在是累了,昨天和队友改bug的时候为了能在我的电脑上实现他的程序就在datagrip中删了我django建的表.没想到啊,这一删就全是报错!! 不说了,今天看看 ...

  3. PowerBI(一) : 如何将powerBI报表嵌入内部web应用程序?

    最近做了一个PowerBI报表嵌入内部web应用系统的项目,分享一下主要步骤以及踩坑记录. 微软官网完整教程这里:https://learn.microsoft.com/zh-cn/power-bi/ ...

  4. Pillow + pytesseract + tesseract-ocr 破解简单的图形验证码

    前言: 我们在做WEB UI自动化测试时,会遇到一些图形验证码,今天就来简单介绍下,如何来识别简单的图形验证码. 一.安装 ◇ Pillow pip3 install Pillow ◇ pytesse ...

  5. 是时候,升级你的 Windows 了「GitHub 热点速览」

    不知道多少小伙伴用着 Windows 操作系统,可能会有一个烦恼是有时候操作系统过慢,因为众多拖慢 Windows 系统的组件.Atlas 作为一个修改版的 Windows 系统,能极大提高操作系统运 ...

  6. 大家都在用-神奇的Markdown格式

    概述 Markdown 是一种轻量级标记语言,它可以使我们专注于写作内容,而不用过多关注排版,很多博主.作家等都用它来撰写文章~ 本文将给各位小伙伴介绍 Markdown 语法的使用,本篇文章索奇就是 ...

  7. 【设计模式】使用 go 语言实现简单工厂模式

    最近在看<大话设计模式>,这本书通过对话形式讲解设计模式的使用场景,有兴趣的可以去看一下. 第一篇讲的是简单工厂模式,要求输入两个数和运算符号,得到运行结果. 这个需求不难,难就难在类要怎 ...

  8. Linux(redhat)镜像

    作为一个合格的程序猿,Linux那就是必须得会玩哟呵,搜集了一些镜像分享大家,望笑纳. 云盘地址https://pan.baidu.com/s/1cB-llYI5RdRm9xJDmjFoWg 提取码 ...

  9. windows内核学习一

    变量类型 kernel user ULONG unsigned long PULONG unsigned long* UCHAR unsigned char PUCHAR unsigned char* ...

  10. SpringBoot打包成WAR包的时候把第三方jar包打到LIB文件夹下和把第三方jar包打入到SpringBoot jar包中

    SpringBoot打包成WAR包的时候把第三方jar包打到LIB文件夹下和把第三方jar包打入到SpringBoot jar包中 转载 首先我们应该知道我们把SPRINGBOOT项目打包成WAR包和 ...