1.定义
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化。它拥有庞大且快速发展的生态系统。Kubernetes 服务、支持和工具广泛可用。
Kubernetes 集群由代表控制平面的组件和一组称为节点的机器组成。
Kubernetes API 允许您查询和操作 Kubernetes 中对象的状态。Kubernetes 控制平面的核心是 API 服务器和它公开的 HTTP API。用户、集群的不同部分和外部组件都通过 API 服务器相互通信。
Kubernetes 对象是 Kubernetes 系统中的持久实体。Kubernetes 使用这些实体来表示集群的状态。了解 Kubernetes 对象模型以及如何使用这些对象。
2.命令式命令
通过创建一个 Deployment 对象来运行一个 nginx 容器的实例:
kubectl create deployment nginx --image nginx
Docker:使用Cgroups和Namespace实现的“沙盒”而已。
Docker Image:直接由一个完整操作系统的所有文件和目录构成,所以这个压缩包里的内容跟你本地开发和测试环境用的操作系统是完全一样的。
编排:主要是指用户如何通过某些工具或者配置来完成一组虚拟机以及关联资源的定义,配置,创建,删除等工作,然后由云计算平台按照这些制度的逻辑来完成的过程。而容器时代,“编排”显然就是对Docker容器的一些列定义,配置和创建动作的管理。
Prometheus:监控容器的项目。
容器技术的核心功能:就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。实际上是在创建容器进程时,指定了这个进程所需要启用的一组namespace参数。这样,容器就只能“看”到当前Namespace所限定的资源,文件,设备,状态或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。其实是一种特殊的进程而已。
Cgroups:用来制造约束的主要手段。
Namespace:用来修改进程试图的主要方法。
虚拟机工作原理: Hypervisor软件,它通过硬件虚拟机化功能,模拟出了运行一个操作系统需要的各种硬件,比如CPU,内存,I/O设备等等。然后,它在这些虚拟的硬件上安装了一个新的操作系统,即Guest OS。这样,用户的应用进程就可以运行在这个虚拟的机器中,它能看到的自然也只有Guest OS的文件和目录,以及这个机器里的虚拟设备。这就是为什么虚拟机也起到将不同的应用进程相互隔离的作用。硬件级隔离。
使用虚拟化技术作为应用沙盒,就必须要由Hypervisor来负责创建虚拟机,这个虚拟机是真实存在的,并且它里面必须运行一个完整的Guest OS才能执行用户的应用进程。这就不可避免地带来了额外的资源消耗和占用。
Docker容器的工作原理:在使用Docker的时候,并没有一个真正的“Docker容器”运行在宿主机里面。Docker项目帮助用户启动的,还是原来的应用进程,只不过在创建这些进程时,Docker为他们加上了各种各样的Namespace参数。这时,这些进程就会觉得自己是各自PID Namespace里的第1号进程,只能看到各自Mount Namespace里挂载的目录和文件,只能访问各自Network Namespace里的网络设备,就仿佛运行在一个个“容器”里面,与世隔绝。
Linux Cgroups:就是Linux内核中用来为进程设置资源限制的一个重要功能。linux Control Group
它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU,内存,磁盘,网络带宽等。
由于一个容器的本质就是一个进程,用户的应用进程实际上就是容器里 PID=1 的进程,也是其他后续创建的所有进程的父进程。这就意味着,在一个容器中,你没办法同时运行两个不同的应用,除非你能事先找到一个公共的 PID=1 的程序来充当两个不同应用的父进程,这也是为什么很多人都会用 systemd 或者 supervisord 这样的软件来代替应用本身作为容器的启动进程。
但是,在后面分享容器设计模式时,我还会推荐其他更好的解决办法。这是因为容器本身的设计,就是希望容器和应用能够同生命周期。
Linux 下的 /proc 目录存储的是记录当前内核运行状态的一系列特殊文件,用户可以通过访问这些文件,查看系统以及当前正在运行的进程的信息,比如 CPU 使用情况、内存占用率等,这些文件也是 top 指令查看系统信息的主要数据来源。
你是否知道如何修复容器中的 top 指令以及 /proc 文件系统中的信息呢?
1 之前遇到过,但是没有考虑如何解决,临时抱佛脚,查了 lxcfs,尝试回答一下。top 是从 /prof/stats 目录下获取数据,所以道理上来讲,容器不挂载宿主机的该目录就可以了。lxcfs就是来实现这个功能的,做法是把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制。从而使得应用获得正确的资源约束设定。
Linux 容器文件系统的实现方式:
而这种机制,正是我们经常提到的容器镜像,也叫作:rootfs。它只是一个操作系统的所有文件和目录,并不包含内核,最多也就几百兆。而相比之下,传统虚拟机的镜像大多是一个磁盘的“快照”,磁盘有多大,镜像就至少有多大。
-
既然容器的 rootfs(比如,Ubuntu 镜像),是以只读方式挂载的,那么又如何在容器里修改 Ubuntu 镜像的内容呢?(提示:Copy-on-Write)