Why Kubernetes ,我对Kubernetes的理解

2023-05-16


去年换工作后,开始真正在生产环境中接触容器与Kubernetes。边恶补相关知识的同时,也想把学到的内容和自己的理解整理出来。学习的途径包括k8s官方文档、书籍、极客时间专栏及网上各种博文。所涉及一些摘抄或描述,大多用自己的理解来组织语言,也就不一一注明出处了。


Kubernetes(简称K8S)与容器技术,可以说是近几年最火热的技术之一。提起K8S,大家都知道是google开源的容器编排工具。今天想先谈谈,我理解的容器、K8S是什么,以及为什么它们能火起来。

Why Docker

既然说K8S是一个容器编排的工具,那么要搞清楚K8S是什么,首先得搞清楚,容器是什么,以及为什么要用容器技术。

形象的来说,一个linux容器,实际就是一个进程,还是个被系统欺骗的进程。为什么这么说呢?一个运行在容器里的进程,主要有以下特点:

  • 它被宿主机操作系统隔离了,它看不到宿主机上的其他进程,以为自己就是pid为1的进程
  • 它被宿主机操作系统限制了硬件资源,它能使用的cpu、内存等硬件资源只是宿主机的一部分
  • 在被宿主机操作系统限制了存储空间,让这个进程认为宿主机的某个目录就是系统根目录
    这几个欺骗进程的技术,就是是容器技术的三板斧,用于资源隔离的namespace,用于资源限制的cgroup,以及用于伪装进程根目录的rootfs。这三种技术,都是是早已存在于linux中的,只是docker公司比较创新的把这三种技术整合在一起,并且,提出了容器镜像及镜像仓库等概念,把这个进程及相关的依赖环境都一起打包成可分发及重复使用的镜像文件,方便容器能在不同机器之间移植。这样,在任何地方,只要能运行docker,就能把容器镜像跑成一个包含这应用进程及相关依赖环境的容器实例。

这里用利用K8S官方文档的图,简单说下生产中的场景,看看容器技术能解决什么问题。

左图是传统的物理机部署应用方式的方式,可以看到除了一个应用的运行,除了程序本身,离不开应用配置、库、等等依赖环境。通常情况下,一个应用的上线,要经历开发环境、pre环境、beta环境、灰度测试、生产环境等等不同的基础环境。开发的同学在开发环境跑通了代码,到其他环境运行时,由于各环境依赖、配置、安全需求不同,可能会出现各种问题。运维的同学忙着在不同的环境中统一依赖。不同应用各种语言,各种应用的特殊依赖需求,也造成了CI/CD逻辑复杂,难以统一。

右图是用了容器技术之后的场景。一个容器镜像的实质就是程序进程加所有运行时环境及配置、依赖的集合。只要各个环境的底层能兼容docker,就能实现所有环境部署的一致性。开发同学不用关心生产环境和开发环境的差异可能会导致应用运行问题,运维同学部署一个应用,只要确保容器镜像能正常运行就好。CI/CD的自动化也相对容易实现很多。从而极大增加开发效率、应用迭代效率及节省了运维工作量。

说到这里,不得不说下容器与传统意义的虚拟机间的对比。其实二者都可以理解为虚拟化,它们最本质的区别是,容器是操作系统层级的虚拟化,而虚拟机是硬件层级的虚拟化。参看下图:
在这里插入图片描述
由于虚拟机多了一层Guest OS,需要宿主机额外的性能开销进行硬件虚拟化,同时因为是完整的操作系统,虚拟机镜像一般动辄大几G,很难在各环境间快速传播,hypervisor层相对Docker Engine也比较重。再看docker容器,实质就是宿主机上跑的一个进程,只不过通过docker与其他进程隔离开来。简单的说,敏捷和高效,是容器相比虚拟机最大的优势,当然也有劣势,由于容器只是操作系统级别的隔离,不同容器间隔离的不够彻底。

Why Kubernetes

简单说完了docker的理解,那么Kubernetes又是什么,它解决了哪些问题呢,为啥现在提容器技术必提k8s呢。这里再谈谈我理解的Why K8S。

回到实际的场景来,假如你已经开始用docker镜像来打包应用,可以方便的进行分发和部署,不用去考虑不同环境的差异。但是不是还感觉还少了点什么?

因为正常的实际业务系统,不是应用能部署,能运行起来就完事了,还要考虑应用容器的访问、水平伸缩、监控、安全、备份、容灾等等因素。而对于一个完整的业务系统来说,也不是单个应用就能搞定的,还要考虑的是各应用间的关系,及应用运行的形态。比如一个web业务,可能需要web服务器、缓存系统、数据库等多个应用。容器化部署后,它们可能部署在不同宿主机的不同容器中,相互间的访问要怎么实现,这就涉及到容器间访问关系的处理。再比如,有个优化缓存的应用也跑在容器里,只需要定期运行容器实例执行优化任务,执行完毕就终止容器,这就需要处理不同容器应用的运行形态问题。类似上述这些对容器应用及容器间关系进行管理,就是所谓的容器编排及调度。而Kubernetes,就是目前的容器编排的平台的事实标准了。

那么,具体来说,K8S到底能做哪些事呢。

在官方文档中,对K8S功能的描述如下

Kubernetes 满足了生产中运行应用程序的许多常见的需求,例如:
Pod提供了一种复合的应用容器模型,
挂载外部存储,
Secret管理,
应用健康检查,
副本应用实例,
横向自动扩缩容,
服务发现,
负载均衡,
滚动更新,
资源监测,
日志采集和存储,
支持自检和调试,
认证和鉴权.

从这些功能介绍可以看出,K8S已很类似一个云平台了,可以完全能满足生产级别的容器应用管理需求。下面是一张最简单的K8S系统示意图:
在这里插入图片描述
K8S集群由一个主节点(master节点)及多个工作节点(node节点)构成,开发者提交应用容器镜像,并将镜像运行的数量、方法等通过描述文件提交给K8S master节点,K8S master节点或根据集群整体情况,将应用按照需求部署在工作节点中。对于开发者来说,利用K8S可以方便的部署程序,不用关心基础设施,而对于运维人员来说,工作重心从维护具体应用,转变为维护K8S集群。而且,不管是开发者还是运维人员,都不用关心应用具体部署在哪个节点,K8S会自动判断搞定一切。相比于传统的应用部署方式,有没有觉得K8S很棒棒?

在容器编排这个概念出现的时候,Kubernetes并不是唯一的一个容器编排工具,主流的工具还有Docker公司原生的swarm和Apache基金会的mesos,为什么K8S能笑到最后,成为容器编排的事实标准呢?我理解K8S对比它们有两个最大不同点:(这里不对swarm和mesos做详细介绍了,实际也确实没怎么玩过)

  1. K8S对容器又做了一层抽象,也就是POD。
    不同于与其他两个工具,K8S管理的原子对象,其实并不是容器,而是POD。按照官方文档的定义,一个POD,是由一个或多个共享存储及网络的容器,以及描述怎么运行这些容器的集合,所以,POD实际是一个抽象的概念。k8s对容器的所有操作,比如动态伸缩、监控等,实际上都是对pod的管理。那这层抽象的好处是什么呢?
    上面有提到过,容器实质就是被特殊处理的进程。想像一个web业务,web应用进程输出的日志需要被大数据agent进程处理。这个业务如果想容器化,通常有两个做法。一是分别起来两个容器,挂载宿主机同一个目录来存放日志。另一种是起一个操作系统级别的容器或supervisord容器作为enterpoint,来管理web服务和agent进程。前一种方式,这个两个容器就被框在这台宿主机上了,要实现业务实例横向扩缩容,要考虑两个容器的运行情况和存储挂载,逻辑比较复杂。后一种方式,你要为每个容器再额外开一个supervisord进程,更重要的是,由于entrypoint是supervisord进程,web应用和大数据agent对docker来说,都是不可见的。即使nginx出错频繁重启,只要supervisord还活着,Docker就认为这个容器是正常的。

    我们再来看看,使用了pod这个概念以后,有什么变化。一个pod里面同时起了web服务进程和大数据agent两个容器实例,首先,pod里的容器实例是共享存储和网络namespace的,也就是说,这两进程的存储数据是直接共享的,不需要额外的挂载动作。其次,这个pod是作为一个整体被k8s管理着的,k8s会监控pod里每个容器的状态,并根据策略在有问题时进行自动干预。从这个意义上说,pod才更类似传统的虚拟机。

  2. 声明式API
    第二点也是比较重要的方面,是K8S的声明式api(貌似swarm的新版也支持了,同样没玩过就不细说了)。什么是声明式API呢,可以参考上面系统图中的描述文件。比如要我需要集群中跑10个web服务容器,传统的命令式API是一步步调用命令构建出容器。而使用声明式api,只要告诉K8S我要10个web容器,K8S就会自动将web集群实例数维持在10个,并且,在某个pod出问题退出时,K8S会自动重新拉起新pod,使集群始终保持10个pod实例在跑。这就使得管理集群变得很简单,只要通过配置文件描述出希望的集群状态,而不用去关注中间的实现过程。

小结一下:
Why Dokcer: 用容器技术跑应用,相比原来的物理机及虚拟机更高效、轻量、省资源,同时大大方便了不同环境下的应用部署及分发。
Why Kubernetes:生产集群光跑容器还不够,还要对容器应用作为一个业务系统集群进行编排及管理,而K8S的一些优势使得它成为目前容器集群编排管理工具的事实标准。

最后再多提一点,实际上,容器技术不止Docker公司一家在做,Kubernetes也不是只能管理Docker容器。只是,无论从市场份额、应用性还是开发社区的热度来说,它们都是目前容器技术最主流的解决方案,就生产环境来说,目前基本没有必要去考虑其他的容器技术了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Why Kubernetes ,我对Kubernetes的理解 的相关文章

随机推荐

  • ardupilot编译过程,通过makefile的形式编译,分析make px4-v2指令

    ardupilot编译过程 xff0c 通过makefile的形式编译 xff0c 分析make px4 v2指令 我们都知道平时用的编译命令是make px4 v2 但是为什么是这个呢 xff0c 这个命令是怎样执行的呢 xff0c 挑干
  • AVT工业相机Windows、Opencv开发——驱动相机(超详细)

    一 概述 1 1使用Vimba控制相机需要经历以下几个步骤 1 打开Vimba 2 查找相机列表 3 打开特定相机 4 配置参数 xff08 可选 xff09 5 采集 xff1a 采集过程共分为5步 xff0c 具体见1 2 6 关闭相机
  • python-opencv尺寸测量

    首先 xff0c 利用机器视觉来测定零件尺寸 xff0c 我们能够直接得到的是图片的像素 xff0c 要想获得尺寸大小 xff0c 我们必须找到像素和实际尺寸间的关系 我们在这里定义一个比例概念 xff1a 每度量比的像素 xff08 pi
  • Bounding box(bbox) 预测

    在出现Bounding box预测之前 xff0c 一般都是通过滑动窗口进行目标检测 本文前两部分介绍滑动窗口算法 xff0c 这样是为了更好介绍 bounding box如何引出 为了解决什么问题而引出的 也可直接跳跃到第三部分看有关bo
  • YOLOv3网络结构分析以及工作流程

    注意 xff1a 本文章有很多图 xff0c 但是都是YOLOv3的结构图 xff0c 只是每张图表达出的信息都各有特色 xff0c 可将这些结构图结合起来 xff0c 能更好的理解 1 Darknet 53 模型结构 在论文中虽然有给网络
  • Qt中QDebug的使用

    QDebug类为调试信息 debugging information 提供输出流 它的声明在 lt QDebug gt 中 xff0c 实现在Core模块中 将调试或跟踪信息 debugging or tracing information
  • Ubuntu18.04安装教程——超详细的图文教程

    电脑配置 xff1a 名称 xff1a Lenovo 拯救者Y7000P 处理器 xff1a i7 10750H 内存 xff1a 32G 固态 xff1a 1TB 显卡 xff1a RTX2060 6G 一 准备工作 本文以 Ubuntu
  • Ubuntu18.04启动后无法进入桌面修复方法(图文)

    引言 xff08 吐槽可略过 xff09 xff1a Ubuntu是应用广泛的Linux操作系统 xff0c 特别是在机器学习应用中 xff0c 通过调用NVIDIA显卡的GPU进行计算和研究的主要平台之一 但是由于NV显卡的存在 xff0
  • VINS-Course代码解析——run_euroc前端数据处理

    vins mono总框架如下 xff1a 主要分为三大块 xff1a 我们先从主函数 main 入手 xff1a 主函数中有三个线程 xff0c 读取完数据集和配置文件的路径后就会进入这三个线程 xff0c 如下图 xff1a thd Ba
  • Gazebo11的更新与安装

    Melodic自带的Gazebo版本过低 xff0c 建议升级 Gazebo安装见gazebo官网 需注意以下四点 删除gazebo9以及相关插件选用Alternative installation step by step的安装方式 xf
  • XTDrone目标检测

    编译Darkent ROS 方法一 xff1a xff08 推荐 xff09 直接clone xff0c 记得加 recurse submodules xff0c 防止文件缺失 cd span class token operator sp
  • C++求解N个数的最大公约数、最小公倍数

    一 2个数的最大公约数 span class token comment 辗转相除法 span span class token keyword int span span class token function gcd span spa
  • 子序列个数——动态规划

    题目 xff1a 统计一个字符串中全部不同的子序列的个数 思路 xff1a 动态规划求解 令 f i 61 前 i 个元素中包含的全部子序列的个数 那么状态转移方程分为下面两种情况 xff1a 当第 i 个元素在前面 i 1 个字符中没有出
  • 字符串中特定子序列出现的次数(动态规划)

    题目 xff1a 给定一个字符串 xff0c 求子序列 cwbc 出现的次数 思路 xff1a 动态规划 令 dp i j 表示前 i 个字符中匹配了字符串 cwbc 中前 j 位 xff08 j 61 1 2 3 4 xff09 的个数
  • VMware ubuntu虚拟机无法上网的解决办法(笔记本连接WIFI情况)

    文章目录 一 虚拟机网络配置 一 虚拟机网络配置 1 设置Ubuntu网络适配器的网络连接方式为NAT模式 2 还原虚拟机网络配置 还原一下默认设置 3 window网络适配器设置适配器允许网络共享 4 Ubuntu启用联网 xff0c 连
  • ubuntu在树梅派上之VNC

    启动vncserver vncserver span class token operator span geometry 1600x900 杀死第一个桌面 vncserver span class token operator span
  • Sourcetree介绍及使用

    Sourcetree是一个操作简单但功能强大的免费Git客户端管理工具 xff0c 可应用在Windows和Mac平台 Sourcetree的安装 xff1a 1 从Sourcetree Free Git GUI for Mac and W
  • javascript创建一个基于数组的栈结构

    栈是一种遵从后进先出 xff08 LIFO xff09 原则的有序集合 新添加或待删除的元素都保存在栈的同 一端 xff0c 称作栈顶 xff0c 另一端就叫栈底 在栈里 xff0c 新元素都靠近栈顶 xff0c 旧元素都接近栈底 栈拥有以
  • Ubuntu16.04+RealsenseT265跑通VINS-Fusion

    一 提前条件 系统版本 xff1a ubuntu16 04 43 ROS xff08 kinetic xff09 默认已经掌握了ubuntu系统下的基本命令以及ROS的基本操作 二 realsenseT265的SDK测试 官方网站https
  • Why Kubernetes ,我对Kubernetes的理解

    去年换工作后 xff0c 开始真正在生产环境中接触容器与Kubernetes 边恶补相关知识的同时 xff0c 也想把学到的内容和自己的理解整理出来 学习的途径包括k8s官方文档 书籍 极客时间专栏及网上各种博文 所涉及一些摘抄或描述 xf