为什么 kubelet 不使用容器化部署?
每日一问系列
为什么 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 不使用容器化部署?的更多相关文章
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...
- 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...
- 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))
容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器
- angular应用容器化部署
angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...
- Flask容器化部署原理与实现
本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...
- Ubuntu系统下容器化部署gitlab
容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...
- spring boot本地开发与docker容器化部署的差异
spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...
- Jaeger容器化部署
概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...
- Gogs的Docker容器化部署流程遇到的问题
Gogs的Docker容器化部署流程遇到的问题 最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...
随机推荐
- Deep-DRM算法理解
title: GCN学习笔记 categories: - 生物信息学 date: 2023-03.13 hidden: true mathjax: true GCN GCN(Graph Convolu ...
- WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
本文将介绍 Wasm,以及 Apache APISIX 如何实现 Wasm 功能. 作者朱欣欣,API7.ai 技术工程师 原文链接 什么是 Wasm Wasm 是 WebAssembly 的缩写.W ...
- 关于Java中方法重载和方法重写
方法重写是子类继承父类(默认继承Object类)后覆盖父类的方法 需要保证同名 同参 同返回值 且访问权限范围不能缩小(public>protected>default>privat ...
- springCloud Alibaba服务的注册与发现之eureka搭建
1.创建eureka微服务模块.导入maven依赖. <dependency> <groupId>org.springframework.cloud</groupId&g ...
- Linux 内存管理 pt.1
哈喽大家好,我是咸鱼 今天我们来学习一下 Linux 操作系统核心之一:内存 跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令.数据.缓存等 关于内存的学习,我会尽 ...
- C# 模拟界面点击/UI自动化测试
有一些UI自动化测试框架,能够实现自动化测试. 本文介绍Peer(微软的TAF技术),也可以实现自动化测试,或是对其他进程进行UI操作.下面是案例~ 在界面上添加俩个按钮: 并处理相应的点击事件: 1 ...
- 深入理解 slab cache 内存分配全链路实现
本文源码部分基于内核 5.4 版本讨论 在经过上篇文章 <从内核源码看 slab 内存池的创建初始化流程> 的介绍之后,我们最终得到下面这幅 slab cache 的完整架构图: 本文笔者 ...
- 2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。
2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式. 答案2023-02-24: 使用 github.com ...
- 2020-12-06:mysql中,多个索引会有多份数据吗?
福哥答案2020-12-06: 数据不会有多份,索引有几个就有几份.聚簇索引存数据和索引,非聚簇索引存索引,聚簇索引只有一个,非聚簇索引可以有多个.
- status能否设置为布尔值类型,前端采用复选框形式
是的,可以将status设置为布尔类型,这样可以在前端使用复选框形式展示.在模型中的定义可以如下: class Acceptance(models.Model): # ... status = mod ...