【云原生-Kubernetes篇】深入刨析Kubernetes

简介: 【云原生-Kubernetes篇】深入刨析Kubernetes

正文


文是《深入剖析k8s》学习笔记的第一篇,主要帮助深入理解容器的发展历史和底层原理,顺便了解k8s区别于Docker、Mesos的的地方及优势。


一、容器的历史介绍


k8s难以理解的原因在于从过去物理机和虚拟机为主体的开发运维环境,向以容器为核心的基础设施转变的过程,并不是一次温和的改革,而是涵盖了对网络、存储、调度、操作系统和分布式原理等各个方面的容器化改造。


Docker之所以能击败其它Paas产品的杀手锏就是Docker镜像。大家虽然都是用namespace和cgroups技术创建沙盒来实现应用隔离,但是Paas是对应用程序打包,这个包可以在本地运行不代表在其它环境也能正常运行,会受限于各种各样的环境因素。Docker直接基于本地运行时的操作系统环境打包,把应用程序、所有运行依赖、环境变量都打包了,从而保证了本地和远端环境的高度一致,实现了只要本地能跑,部署到其它任何环境下肯定也能跑的终极目标。


Docker为什么会想出Docker镜像这一创新概念,是由其目标客户的定位所决定的。Paas的用户是运维人员,这也就决定了它不会考虑把系统依赖和环境变量作为考虑的焦点;而Docker的目标客户是开发,开发人员不一定懂得操作系统、网络原理等运维技术,他们只需要简单、便捷、可靠地随处运行自己的代码,为了实现这一目标,Docker镜像便出现了。


Docker Compose和Docker Swarm,前者是容器编排,后者是集群管理,是Docker公司走向Paas平台化的两大重要工具。


Docker、Mesos、k8s三者之争中,Docker将其开源项目和商业产品紧密绑定,造就了一个极端封闭的生态,违背了为其开发者用户考虑的初衷;Mesos则是因为其所属的Apache社区的封闭性,鲜有创新;最终后来的k8s依靠其开放、可靠、强大成为了最终的赢家。


二、容器的概念介绍


容器本质上是一种特殊的进程,操作系统使用了Namespace技术,为容器的运行创造一个新的进程空间,这个进程空间包含一组限定的资源,比如文件、设备、配置等,使得容器以为这个空间就是一个全新的操作系统。容器无法看到宿主机、其它进程空间的任何资源。


和虚拟机相比,Docker Engine在使用效果上确实等同Hypervisor,它们看起来都是为了创建和管理沙盒的。但实际上,Docker Engine只是旁路式的辅助和管理,并不像Hypervisor一样对沙盒的隔离性负责,真正为容器负责隔离性的是宿主机的操作系统。


虚拟机和Docker对比图

13.webp.jpg


虚拟机Hypervisor创建的每一个沙盒都有独立的Guest OS,所以隔离性是能够得到保障的,但缺点就是笨重、效率低下。Docker Engine与之相比依靠的是操作系统的namespace,因此更加敏捷和高性能,但是问题就是沙盒之间隔离地不够彻底,比如它们共享宿主机的操作系统内核、无法隔离时间这样的特殊资源。


因为容器只是一种特殊的进程,因此就存在会和宿主机其它进程竞争资源的情形,Cgroups技术就是为了限制某些进程能够使用的资源上限而存在的,是容器沙盒资源隔离的重要实现手段,通过进行一系列的配置,就能限制容器使用CPU、内存、磁盘、网络带宽的用量。


容器本身的设计就是希望容器能和应用同生命周期,而容器作为一个进程,就意味着我们在启动容器时,没法同时启动两个应用,除非能事先找到这两个应用的共同父进程作为启动进程,比如systemd、supervisord等,但是问题也随之而来,如果出现容器正常、父进程正常,但是应用挂掉的情形,就无法进行健康监控了。


容器进程在创建之后,为了能和宿主机的文件系统相互隔离而又保持各个容器的文件目录一致(各环境下的高度一致性),才有了容器镜像这个概念,其作用就是在容器的根目录(var/lib/docker/aufs/mnt/***)下挂载一个标准且完整的rootfs。rootfs只是包含一个操作系统所拥有的文件、配置和目录而已,并不包含操作系统的内核。形象地说,每一个新建容器的rootfs仅是操作系统的分身躯壳,操作系统的内核灵魂仍然只有一个,就是宿主机的操作系统内核。


以上总结下来,Namespace决定了容器内的应用能看到什么资源(四周的墙),Cgroups决定了容器内的应用使用某种资源能用多少(天空),rootfs保证了各个容器使用的文件系统都是一致的(大地),从这三个维度限制了容器内应用的运行,从而模拟出了一个任意环境下都高度一致的沙盒运行环境。


在下图中,容器进程“python app.py”运行在由 Linux Namespace 和 Cgroups 构成的隔离环境里;而它运行所需要的各种文件,比如 python,app.py,以及整个操作系统文件,则由多个联合挂载在一起的 rootfs 层提供。这些 rootfs 层的最下层,是来自 Docker 镜像的只读层。在只读层之上,是 Docker 自己添加的 Init 层,用来存放被临时修改过的 /etc/hosts 等文件。而 rootfs 的最上层是一个可读写层,它以 Copy-on-Write 的方式存放任何对只读层的修改,容器声明的 Volume 的挂载点,也出现在这一层。

容器分成示意图

123.webp.jpg


Copy-on-Write简称写时复制,是一种为了满足读多写少高并发场景下的延时程序设计策略。其基本策略时当多个对象共享同一块内容时,并不给所有对象都复制该内容,而是采用延时策略,多个对象都引用到该内容上,如此对象的复制和读写都很快,能承受较高的并发,只有当某个对象需要对该内容进行修改的时候,才将内容真的复制给该对象。在Docker中的应用就体现在可读写层和只读层的关系上。


容器本身没有价值,容器编排才有意义。容器编排是指定义容器组织形式和管理规范的技术。k8s不仅仅是为了拉取镜像、运行镜像和做一些集群运维工作,这些工作使用Mesos、Docker Compose&Swarm都可以实现,k8s更重要的是它能定义和解决大规模集群中各种任务之间的复杂关系。比如Pod可以将紧密的容器结合在一起;Service可以屏蔽后端Pod的细节,固定对外暴露的访问方式;还有Job、StatefulSet、DaemonSet、HPA等API对象,都是为了实现不同场景下容器编排和集群管理的需求。


k8s组件示意图

12.webp.jpg


k8s中API对象

11.webp.jpg

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
95 2
|
25天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
1月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
63 1
|
26天前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
18天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
16天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
26天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
40 3
下一篇
DataWorks