05 :从进程说起

1、容器本身没有价值,有价值的是"容器编排"

2、什么是进程?

一旦"程序"被执行起来,它就从磁盘上的二进制文件,变成

1、计算机内存中的数据
2、寄存器里的值
3、堆栈中的指令
4、被打开的文件
5、以及各种设备的状态信息的一个集合。

像这样一个程序运行起来后的计算机执行环境的综合,就是我们今天的主角:进程

3、容器技术的核心功能:

1、就是通过约束和修改进程的动态表现,从而为其创造出一个"边界"

2、Cgroups 技术是用来制造约束的主要手段

3、Namespace 技术则是用来修改进程视图的主要方法。

4、Linux容器最基本的实现原理了

[root@luoahong ~]# docker run -it busybox /bin/sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
57c14dd66db0: Pull complete
Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0
Status: Downloaded newer image for busybox:latest
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
6 root 0:00 ps

请帮我启动一个容器,在容器里执行 /bin/sh,并且给我分配一个命令行终端跟这个容器交互

本来,每当我们在宿主机上运行了一个 /bin/sh 程序,操作系统都会给他分配一个进程编号,比如PID=100
这个编号是进程的唯一标识,就像员工的工牌一样,所以PID=100,可以粗略地理解为这个/bin/sh是我们公司里的第
100号员工,而第1号员工就自然是比尔 · 盖茨这样统领全局的人物。

而除了我们刚刚用到的 PID Namespace,Linux操作系统还提供了 Mount、UTS、IPC、
Network 和 User 这些 Namespace用来对各种不同的进程上下文进行“障眼法”操作

5、容器,其实是一种特殊的进程而已

实际上是在创建容器进程时,指定了这个进程所需要启用的一组 Namespace 参数。这样,容器就只能“看”到当前
Namespace 所限定的资源、文件、设备、状态,或者配置而对于宿主机以及其他不相关的程序,它就完全看不到了。

6、容器和虚拟机的比较

这时,这些进程就会觉得自己是各自 PID Namespace,里的第 1 号进程,只能看到各自 Mount Namespace里挂载

用来对各种不同的进程上下文进行“障眼法”操作

06 :隔离与限制

Namespace 技术实际上修改了应用进程看待整个计算机"视图"被操作系统做了限制,只能"看到"某些指定的内容

1、容器相对于虚拟机最大的优势是?

“敏捷”和“高性能”是容器相较于虚拟机最大的优势,也是它能够在 PaaS 这种更细粒度的资源管理平台上大行其道的重要原因

优点:“敏捷”和“高性能”
缺点:隔离的不彻底

不能被Namespace 化的资源和对象 比如时间

2、限制

1、Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等

[root@luoahong container]# pwd
/sys/fs/cgroup/cpu/container
[root@luoahong container]# while : ; do : ; done &
[1] 1447
[root@luoahong container]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
-1
[root@luoahong container]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
100000
[root@luoahong container]# echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
[root@luoahong container]# echo 1447 > /sys/fs/cgroup/cpu/container/tasks

2、Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合

docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us
100000
$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us
20000

3、容器是一个单进程模型

[root@k8s-master ~]# docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
root@beac9236771e:/# cd /sys/fs/cgroup/cpu/
root@beac9236771e:/sys/fs/cgroup/cpu# ls
cgroup.clone_children cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat cpuacct.usage notify_on_release
cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares cpuacct.stat cpuacct.usage_percpu tasks
root@beac9236771e:/sys/fs/cgroup/cpu# cat cpu.cfs_period_us
100000
root@beac9236771e:/sys/fs/cgroup/cpu# cat cpu.cfs_quota_us
20000
root@beac9236771e:/sys/fs/cgroup/cpu# pwd
/sys/fs/cgroup/cpu $ mount -l | grep tmpfs
none on /tmp type tmpfs (rw,relatime) [root@k8s-master cpu]# mount -l | grep tmpfs
devtmpfs on /dev type devtmpfs (rw,nosuid,size=1006112k,nr_inodes=251528,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=203192k,mode=700)

这就意味着这个 Docker 容器,只能使用到 20% 的cpu带宽

深入剖析Kubernetes学习笔记:容器基础(05-06)的更多相关文章

  1. 深入剖析Kubernetes学习笔记:开篇词(00)

    一.关于Kubernetes初学的疑惑 就在这场因"容器"而起的技术变革中,kubernetes项目已经成为容器技术的事实标准,重新定义了基础设置领域对应用编排与管理的种种可能 1 ...

  2. 深入剖析Kubernetes学习笔记:预习篇(01-04)

    01 初出茅庐 1.PaaS 项目被大家接纳的一个主要原因? 就是它提供了一种名叫"应用托管". 2.像 Cloud Foundry 这样的 PaaS 项目,最核心的组件是? 一套 ...

  3. 深入剖析Kubernetes学习笔记:深入理解镜像(08)

    一.Python 应用案例环境 [root@k8s-node1 Flask]# pwd /opt/Dockerfile/Flask [root@k8s-node1 Flask]# ll total 1 ...

  4. 深入剖析Kubernetes学习笔记:深入理解镜像(07)

    一.容器里的进程看到的文件系统又是什么样子呢? 1.你会看到好多宿主机的文件 [root@k8s-master ~]# vim ns.c [root@k8s-master ~]# gcc -o nl ...

  5. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  6. Kubernetes学习笔记(八):Deployment--声明式的升级应用

    概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...

  7. bootstrap学习笔记之基础导航条 http://www.imooc.com/code/3111

    基础导航条 在Bootstrap框中,导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多.我们先来看导航条中最基础的一个--基础导航条. 使用方法: 在制作一个基础导航条时,主要分 ...

  8. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  9. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

随机推荐

  1. java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10116298.html 在项目过程中出现了上述错误. 会出现这样的错误是在我使用: notifyItem ...

  2. 【English】十六、时间相关

    〇.其他 date: I have a date with her tomarrow. n.约会;日期,日子;时代,年代; vt.过时;使…显老;显示出…时代(或年龄);鉴定…的年代 vt.& ...

  3. 好代码是管出来的——使用GitHub

    前面的文章介绍了Git的基本概念和用法,本文则是基于GitHub的一个实践介绍,主要内容有: GitHub简介 个人与组织 仓库的创建与维护 Fork与pull request 小结 GitHub简介 ...

  4. js清空数组的方法

    方式1:splice函数 arrayObject.splice(index,howmany,element1,.....,elementX) index:必选,规定从何处添加/删除元素. howman ...

  5. Git源代码管理

    一. 分支管理 使用 git 进行源代码管理,一般将某个项目的所有分支分为以下几条主线 1. Master 顾名思义,既然名字叫 Master ,那么该分支就是主分支的意思. master 分支永远是 ...

  6. EOS开发环境搭建

    EOS开发环境搭建   在上一篇文章<扒一扒EOS的前世今生>中,我们已经了解了EOS以及他的创始人Daniel Larimer的故事,本次为大家带来的是关于EOS开发环境搭建的内容.首先 ...

  7. Python之Scripy框架

    为什么要用到cmd界面 --- 在这里操作的是Scripy框架的指令,不是Python代码 Parse --- Scripy的回调函数 fiddler --- 用于爬取JS存储数据的页面 项目: 1. ...

  8. ERROR:"org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /config/topics/test" when creating or deleting Kafka operations authorized through the Ranger policies

    PROBLEM DESCRIPTION When creating or deleting topics in Kafka, they cannot be authorized through the ...

  9. SpringBoot中使用JNnit4(一)之Mockito的使用

    经过入门篇,可以编写出一个简单的测试用例. 这篇讲的是BDDMockito的使用. BDDMockito用于测试时进行打桩处理:通过它可以指定某个类的某个方法在什么情况下返回什么样的值. 在单元测试时 ...

  10. sys系统模块

    import sys # print(0)## sys.exit(0)## print(123) # print(sys.version)# print(sys.maxsize)# print(sys ...