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. 基于Netty 实现简单的私有协议

    原文链接 基于Netty 实现简单的私有协议 代码仓库地址 基于Netty 实现简单的私有协议 在学习了Netty的不同的编码器和解码器之后,我们可以通过编解码器实现简单的自定义协议,这个自定义的协议 ...

  2. Java:配置环境(Mac)——Tomcat

    1.官网下载 2.把下载的文档解压,放到合适的路径下. 3.打开eclipse 4.在Apache文件夹下选择Tomcat的对应版本 5.选择刚才下载的文件 6.可以右键Start了

  3. go get获取gitlab私有仓库的代码

    目录 目录 1.Gitlab的搭建 2.如何通过go get,获取Gitlab的代码 目录 1.Gitlab的搭建   在上一篇文章中,已经介绍了如何搭建Gitlab Https服务<Nginx ...

  4. 轻松学习UML之用例图,时序图

    本文主要讲解UML图中的用例图(Use Case Diagram)和时序图(Sequence Diagram)相关内容,如有不足之处,还请指正. 概述 统一建模语言(UML,UnifiedModeli ...

  5. 前端开发之基础知识-HTML(二)

    1.6 html链接 html链接 <a>标签可以在网页上定义一个链接地址,通过src属性定义跳转的地址,通过title属性定义鼠标悬停时弹出的提示文字框. <a href=&quo ...

  6. Structs2 中拦截器获取请求参数

    前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...

  7. struct导入项目工程时工程旁边出现红色的×号

    在我们学习java的过程中难免要导入java工程项目,那么当我们导进去的时候出现错误怎么办呢, 一,首先 二,其次 选择Properties 三,再选择 四,再选择 (高版本的选择1.5尽量用1.6的 ...

  8. python之三行代码发送邮件

    (1)首先进入cmd,输入pip install yagmail (2)思路:1 .连接服务器:yagmail.SMTP(邮箱账号,邮箱密码,邮箱服务器地址,邮箱服务器端口) 2 .准备正文内容:co ...

  9. idea中Springcloud同时运行多个模块、微服务

    idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的打开Run DashBoard面板 在工程的.idea中找到workspace.xml,并找 ...

  10. 一个 C# 文件权限的帮助类

    直接贴代码了: FilePermissionHelper.cs using System.Collections.Generic; using System.IO; using System.Secu ...