Kubernetes-如何打赢容器之战 (kubernetes与docker的关系)

教程大全 2025-07-12 20:31:09 浏览

Kubernetes 如何打赢容器之战?

2019-11-05 11:09:59早期的主流做法基本上是租 AWS 或者 OpenStack 的虚拟机,然后把这些虚拟机当作物理机一样,用脚本或者手工的方式在上面部署应用。

背景

PaaS 技术,一句话概括就是:它提供了“应用托管”的能力。

早期的主流做法基本上是租 AWS 或者 OpenStack 的虚拟机,然后把这些虚拟机当作物理机一样,用脚本或者手工的方式在上面部署应用。这个过程中如何保证本地环境和云端环境的一致性是一个很大的课题,而提供云计算服务的公司的核心竞争力就是比拼谁做的更好。从某种意义上来说 PaaS 的出现,算是一个比较好的解决方案。

以 Cloud foundry 为例,在虚拟机上部署上 Cloud Foundry 项目后,用户可以很方便地把自己的应用上云。以上帝视角来看这个过程:Cloud Foundry 最核心的是提供了一套应用的打包和分发机制,它为不同的编程语言定义了不同的打包格式,它能把可执行文件、启动参数等等一起打包成压缩包然后上传至 Cloud Foundry 存储中心,最后由调度器选择虚拟机,由虚拟机上的 Agent 下载并启动应用。

分布式系统

随着软件的规模越来越大,业务模式越来越复杂,用户量的上升、地区的分布、系统性能的苛刻要求都促成服务架构从最初的单体变成 SOA 再到如今的微服务,未来还可能演变为 Service Mesh ,Serverless 等等。

如今,一个完整的后端系统不再是单体应用架构了,多年前的 DDD 概念重新回到大家的视线中。现在的系统被不同的职责和功能拆成多个服务,服务之间复杂的关系以及单机的单点性能瓶颈让部署和运维变得很复杂,所以部署和运维大型分布式系统的需求急迫待解决。

容器技术

前面提到诸如 Cloud Foundry 的 PaaS,用户必须为不同语言、不同框架区分不同的打包方式,这个打包过程是非常具有灾难性的。而现实往往更糟糕,当在本地跑的好好的应用,由于和远端环境的不一致,在打包后却需要在云端各种调试,最终才能让应用“平稳”运行。

而 Docker 的出现改变了一切,它凭借镜像解决了这个问题。Docker 一不做二不休,干脆把完整的操作系统目录也打包进去,如此高的集成度,保证了云端和本地环境的高度一致,并且随时随地轻易地移植。

谁也不知道就因为“镜像”这个简单的功能,Docker 完成了对 PaaS 的降维打击,占有了市场。此时,一些聪明的技术公司纷纷跟进 Docker,推出了自家的容器集群管理项目,并且称之为 CaaS。

容器技术利用 Namespace 实现隔离,利用 Cgroups 实现限制;在 Docker 实现上,通过镜像,为容器提供完整的系统执行环境,并且通过 UnionFS 实现 Layer 的设计。

Docker 容器是完全使用沙箱机制,相互之间不会有任何接口。通过 Docker,实现进程、网络、挂载点和文件隔离,更好地利用宿主机资源。Docker 强大到不需要关心宿主机的依赖,所有的一切都可以在镜像构建时完成,这也是 Docker 目前成为容器技术标准的原因。所以我们能看到在 Kubernetes 中默认使用 Docker 作为容器(也支持 rkt)。

Kubernetes

铺垫了这么多,终于说到本文的主角了。说 Kubernetes 之前,不得不提 Compose、Swarm、Machine 三剑客,其实在 Kubernetes 还未一统江湖之前,它们已经能实现大部分容器编排的能力了。但是在真正的大型系统上,它们却远远不如 Mesosphere 公司出品的大型集群管理系统,更别说之后的 Kubernetes 了。

在容器化和微服务时代,服务越来越多,容器个数也越来越多。Docker 如它 Logo 所示一样,一只只鲸鱼在大海里自由地游荡,而 Kubernetes 就像一个掌舵的船长,带着它们,有序的管理它们,这个过程其实就是容器编排。

如何打赢容器之战

Kubernetes 起源于 Google,很多设计都是源自于 Borg,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,并且提供了应用部署,规划,更新,维护的一种机制。

小结

至此,读者了解了 Kubernetes 的前世今生,由 PaaS 的火热,引爆了容器技术的战争,而赢得这场战争中最关键的即是拥有强大的容器编排的能力,而 Kubernetes 无疑是这场战争的胜利者。

设计理念

这一部分,我们会围绕 Kubernetes 的四个设计理念看看这些做法能给我们带来什么。

声明式 VS 命令式

声明式和命令式是截然不同的两种编程方式,在命令式 API 中,我们可以直接发出 服务器 要执行的命令,例如: “运行容器”、“停止容器”等;在声明式 API 中,我们声明系统要执行的操作,系统将不断向该状态驱动。

我们常用的 SQL 就是一种声明式语言,告诉数据库想要的结果集,数据库会帮我们设计获取这个结果集的执行路径,并返回结果集。众所周知,使用 SQL 语言获取数据,要比自行编写处理过程去获取数据容易的多。

我们来看看相同设计的 YAML,利用它,我们可以告诉 Kubernetes 最终想要的是什么,然后 Kubernetes 会完成目标。

声明式 API 使系统更加健壮,在分布式系统中,任何组件都可能随时出现故障。当组件恢复时,需要弄清楚要做什么,使用命令式 API 时,处理起来就很棘手。但是使用声明式 API ,组件只需查看 API 服务器的当前状态,即可确定它需要执行的操作。

显式的 API

Kubernetes 是透明的,它没有隐藏的内部 API。换句话说 Kubernetes 系统内部用来交互的 API 和我们用来与 Kubernetes 交互的 API 相同。

这样做的好处是,当 Kubernetes 默认的组件无法满足我们的需求时,我们可以利用已有的 API 实现我们自定义的特性。

无侵入性

感谢 Docker 容器技术的流行,使得 Kubernetes 为大家提供了无缝的使用方式。在容器化的时代,我们的应用达到镜像后,不需要改动就可以遨游在 Kubernetes 集群中。

Kubernetes 还提供存储 Secret、Configuration 等包含但不局限于密码、证书、容器镜像信息、应用启动参数能力。如此,Kubernetes 以一种友好的方式将这些东西注入 Pod,减少了大家的工作量,而无需重写或者很大幅度改变原有的应用代码。

有状态的移植

在有状态的存储场景下,Kubernetes 如何做到对于服务和存储的分离呢?假设一个大型分布式系统使用了多家云厂商的存储方案,如何做到开发者无感于底层的存储技术体系,并且做到方便的移植?

为了实现这一目标,Kubernetes 引入了 PersistentVolumeClaim(PVC)和 PersistentVolume(PV)API 对象。这些对象将存储实现与存储使用分离。

PersistentVolumeClaim 对象用作用户以与实现无关的方式请求存储的方法,通过它来抹除对底层 PersistentVolume 的差异性。这样就使 Kubernetes 拥有了跨集群的移植能力。

架构

首先要提及的是 Kubernetes 使用很具代表性的 C/S 架构方式,Client 可以使用 kubectl 命令行或者 RESTful 接口与 Kubernetes 集群进行交互。下面这张图是从宏观上看 Kubernetes 的整体架构,每一个 Kubernetes 集群都由 Master 节点 和 很多的 Node 节点组成。

Master 是 Kubernetes 集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有 Etcd 存储服务,运行 API Server 进程,Controller Manager 服务进程及 Scheduler 服务进程,关联工作节点 Node。

Kubernetes API Server 提供 HTTP Rest 接口的关键服务进程,是 Kubernetes 里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程; Kubernetes Controller Manager 是 Kubernetes 所有资源对象的自动化控制中心,它驱使集群向着我们所需要的最终目的状态; Kubernetes Schedule 是负责 Pod 调度的进程。

Node 是 Kubernetes 集群架构中运行 Pod 的服务节点。Node 是 Kubernetes 集群操作的单元,用来承载被分配 Pod 的运行,是 Pod 运行的宿主机。关联 Master 管理节点,拥有名称和 IP、系统资源信息。运行 Docker Runtime、kubelet 和 kube-proxy。

kubelet 负责对 Pod 对于的容器的创建、启停等任务,发送宿主机当前状态; kube-proxy 实现 Kubernetes Service 的通信与负载均衡机制的重要组件; Docker Runtime 负责本机容器的创建和管理工作。

实现原理

为了尽可能地让读者能明白 Kubernetes 是如何运作的,这里不会涉及到具体的细节实现,如有读者感兴趣可以自行参阅官网文档。这里以一个简单的应用部署示例来阐述一些概念和原理。

创建 Kubernetes 集群

介绍架构的时候我们知道,Kubernetes 集群由 Master 和 Node 组成。

Master 管理集群的所有行为例如:应用调度、改变应用的状态,扩缩容,更新/降级应用等。

Node 可以是是一个虚拟机或者物理机,它是应用的“逻辑主机”,每一个 Node 拥有一个 Kubelet,Kubelet 负责管理 Node 节点与 Master 节点的交互,同时 Node 还需要有容器操作的能力,比如 Docker 或者 rkt。理论上来说,一个 Kubernetes 为了应对生产环境的流量,最少部署3个 Node 节点。

当我们需要在 Kubernetes 上部署应用时,我们告诉 Master 节点,Master 会调度容器跑在合适的 Node 节点上。

我们可以使用 Minikube 在本地搭一个单 Node 的 Kubernetes 集群。

部署应用

当创建好一个 Kubernetes 集群后,就可以把容器化的应用跑在上面了。我们需要创建一个 Deployment,它会告诉 Kubernetes Master 如何去创建应用,也可以来更新应用。

当应用实例创建后,Deployment 会不断地观察这些实例,如果 Node 上的 Pod 挂了,Deployment 会自动创建新的实例并且替换它。相比传统脚本运维的方式,这种方式更加优雅。

我们能通过 kubectl 命令或者 YAML 文件来创建 Deployment,在创建的时候需要指定应用镜像和要跑的实例个数,之后 Kubernetes 会自动帮我们处理。

查看 Pods 和 Nodes

下面来介绍下 Pod 和 Node:

当我们创建好 Deployment 的时候,Kubernetes 会自动创建 Pod 来承载应用实例。Pod 是一个抽象的概念,像一个“逻辑主机”,它代表一组应用容器的集合,这些应用容器共享资源,包括存储,网络和相同的内部集群 IP。

任何一个 Pod 都需要跑在一个 Node 节点上。Node 是一个“虚拟机器”,它可以是虚拟机也可以是物理机,一个 Node 可以有多个 Pods,Kubernetes 会自动调度 Pod 到合适的 Node 上。

Service 与 LabelSelector

Pods 终有一死,也就是说 Pods 也有自己的生命周期,当一个 Pod 挂了的时候,ReplicaSet 会创建新的,并且调度到合适的 Node 节点上。考虑下访问的问题,Pod 替换伴随着 IP 的变化,对于访问者来说,变化的 IP 是合理的;并且当有多个 Pod 节点时,如何 SLB 访问也是个问题,Service 就是为了解决这些问题的。

Service 是一个抽象的概念,它定义了一组逻辑 Pods,并且提供访问它们的策略。和其他对象一样,Service 也能通过 kubectl 或者 YAML 创建。Service 定义的 Pod 可以写在 LabelSelector 选项中(下文会介绍),也存在不指定 Pods 的情况,这种比较复杂,感兴趣的读者可以自行查阅资料。

Service 有以下几种类型:

Labels 和 Selectors 能够让 Kubernetes 拥有逻辑运算的能力,有点像 SQL。举个例子:可以查找 app=hello_word 的所有对象,也可以查找 app in (a,b,c) abc的所有对象。

Labels是一个绑定在对象上的 K/V 结构,它可以在创建或者之后的时候的定义,在任何时候都可以改变。

扩容应用

前文提到我们可以使用 Deployment 增加实例个数,下图是原始的集群状态:

我们可以随意的更改 replicas (实例个数)来扩容,当我们更改了 Deployment 中的 replicas 值时,Kubernetes 会自动帮我们达到想要的目标实例个数,如下图

更新应用

更新应用和扩容类似,我们可以更改 Deployment 中的容器镜像,然后 Kubernetes 会帮住我们应用更新(蓝绿、金丝雀等方式),通过此功能,我们还可以实现切换应用环境、回滚、不停机 CI/CD。下面是部署的过程,需要注意的是我们可以指定新创建的 Pod 最大个数和不可用 Pod 最大个数:

总结

到了最后,大家对 Kubernetes 有个大概的了解了,但 Kubernetes 远远不止本文所介绍的这些内容。在云原生概念逐渐清晰的今天,Kubernetes 作为 CNCF 中一个接地气的落地项目,其重要性不言而喻。


古代米粮的重量单位。一石等于几斗或几斤?一斗又是几升?一升等于几斤?斛的容量又是多少?

一升米重1.25斤, 一斗为十升,十斗为一石, 一升为十合,一合为十勺,一勺为十抄,一抄为十作,一作为十厘。 中国古代计量方法极为精确,且为十进位制。 即:一斗为十升,每升约重1.5公斤;一升为十合,每合重150克;一合为十勺,每勺重15克;一勺为十抄,每抄重1.5克;一抄为十作,每作重0.15克;一作为十厘,仅重0.015克(约一粒米)。 一斛,古时早期,以十斗为一斛,后来改以五斗为一斛,按照(30斤/斗)计算,一斛应为300斤或150斤.一石相当于一斛,一斛有十斗,一斗相当于现在的二千毫升

兽人战士学什么专业技能好

背包系统商店卖的包很小 并且很贵

建议找工会里裁缝的人带做 给他布就好了

另外在拍卖行里面一般也会有商人大量出售

搜索容器就有了

兽人战士 PVP的话建议学工程+锻造

PVE就很随意了 学学珠宝 FM都很不错

想赚钱还可以学双采

火影忍者中的九眼冥王是谁来的?

一尾 守鹤神话传说:生长在奈良沙漠,受异界魔力影响,被风沙掩埋堆积而产生的狸猫怪物,以在沙漠中被风沙困死的死者怨灵而生,本体为一只狸猫,生**玩,喜欢用风沙掩埋自己眼前所有的东西。 身上文身为紫罗兰色,文身的意思代表风神的图案。 上古9神兽战情况:参战5场,1胜3负1逃胜:鼠蛟负:雷兽猫又矶怃逃:八娱大蛇下场:被奈良和尚(Oraga Nakashimu)先以法术把守鹤瞬间变小,然后用 “法器 鹿角盅“ (不知道什么东西,翻译不出来,应该是一种特制的大锅)封印在风之祭坛二尾 猫又居住在日本极北的北海道死之森,黑色猫妖,有巨大黑天使翅膀,原为死神的宠物,后私自越过三界之门逃到人间界,以吸食死人灵魂为乐,当灵魂不够时就杀人然后取得死人怨灵,可以随意召唤死者的灵魂为自己战斗,并且从冥界召唤异界魔物。 脑顶的第三只眼一旦张开死人的灵魂就会被其吞噬上古9神兽战: 自恃甚高,自以为天下无敌,与彭侯结盟进攻九尾狐,惨败,最后一刻被死神救走,幸免于难参战3场 2胜一败胜:貉负:九尾狐下场:在九尾狐杀死其的一霎那灵魂被死神以异界召唤的形势救走,本体则被留在死之森的神社内,以死神封印所封住三尾 矶怃前额有勾状角突起的鲨鱼怪物,常年生活在 日本西部的四国岛 南斗-和川海域,住在日本海深处的须贺海沟底,每隔数月就会浮上海面透气,当矶怃浮上海面时,雷电交加,暴风雨大作,海上波涛汹涌,在日本海上的一切船只都会被其吞没作为食物。 玑怃手下的一条跟班鱼,名为鲛机(就是鬼鲛的那吧大刀啦),平时贴在矶怃肚子上,负责清理残余物,并且从矶怃肚子里吸取食物,提炼大量查克拉,然后把查克拉送回矶怃体内。 鲛机的力量在于其可以从食物里提取正常可提取查克拉5倍的查克拉,储存在鲛机体内的查克拉会在矶怃战斗的时候源源不断,送入矶怃体内上古神兽战: 参战 4 场 2胜1负1逃胜:貉守鹤负: 猫又逃:八娱大蛇下场: 横滨的渔民勇士 takuma muramasa 以牺牲2名村内勇士的情况下冒死K近矶怃,将跟班鱼 鲛机 封印在取自水之祭坛的 “法器 鲨鳉壶“ 矶怃无法提取大量查克拉,精力耗尽时也被封印进去,鲨鳉壶则被封印在水之祭坛四尾 鼠鲛常年居住在富士山火山里,受火山灰和火山化学反应的毒气影响,由鸡怪 灵鬼 和蛇怪 茂鬼 合体而成, 鼠蛟所在的地方周围100里生气全无,草木枯萎,毒气蔓延,属于剧毒之物,每隔几年鼠蛟在富士山冬眠的时候, 鼾声所引起的剧毒气体会造成富士山火山爆发上古神兽战:参战 4场, 3负1逃负:守鹤貉彭侯逃: 雷兽下场: 被日本幕府第一妖术师 yamazaki ishiro 以 “法器 网月笼“ 封印在富士山底部,永远无法把毒气散发出山口以外五尾 彭侯吸收 风雷水火土五个祭坛各自的部分力量而生的犬类怪物,五条尾巴可以放出五种元素的强力攻击,以破坏大自然而夺取大自然的元素力量精华为乐,在富士山顶击败鼠蛟后不可一世,在古战场击败强敌猫又后与猫又联手进攻九尾,然而九尾狐的查克拉量为无限,猫又,彭侯支持不住,彭侯虽然侥幸以风遁逃,然而重伤上古神兽战: 参战 4场 3 胜一负胜: 鼠蛟猫又雷兽负: 九尾狐下场:重伤后逃离日本岛,躲到九州岛的火山附近一棵树里疗伤,无人知道此树的具体位置六尾 雷兽雷之祭坛从上古就开始供奉的雷神,受到八娱大蛇的邪恶力量所影响成为妖物,嗜血,六条闪电状尾巴可以放出无限伏的电压。 喜爱在黑夜里释放强力雷电,天火,烧毁所有周围的东西上古神兽战 :5 场, 2 胜 3负胜:守鹤鼠蛟负:彭侯八娱大蛇九尾狐下场: 被名忍者 sarutobi(就是猿飞) ryoka 以 “禁术 雷切“(日文上就是写的这俩汉字,不知道是不是卡卡西的雷切)把雷兽的雷切断,从而力量反逆回去,雷兽自己受到自己攻击,重伤,被sarutobi-sama以 “法器 隐雷圈“ 封印在雷之祭坛七尾 貉最为狡猾的尾兽,体形不大(.只是相比较,真实身高为17米~~~),善于伪装,很少在地面上露面,一般都在地下掘洞而行,喜欢伪装到猎物脚下,然后把猎物脚下的土破坏,从而使猎物直接掉进它的肚子。 喜欢袭击商旅,每次上到地面上就会变身成各个形状,大小,样子,无法区分,在没有粘土的地方无法变身,一旦遇到危险就变颜色逃跑上古神兽战: 4场 1胜3逃胜:鼠蛟逃:猫又矶怃八娱大蛇下场: 被勇士 ikkyo sojun 把其藏身的粘土洞烧焦,貉无法变化,被勇士们以 “法器 土零坛“ 封印在土之祭坛八尾 八娱大蛇日本恒古以来最强的S级魔物,八头八尾的巨大蛇类,拥有魔界的力量,黑暗力量的起源,邪恶的代表.八个头分别代表 魂 鬼 恶 妖 魔 屠 灵 死. 其本身的黑暗实力本来不如五尾彭侯的元素力量和二尾猫又的死亡力量,但是草稚家族的后人莽撞行事,动用本家族神器 草稚剑 强行击杀大蛇,结果大蛇把所有的黑暗力量凝聚在脖子上,使神器的剑锋也不能完全砍断,而大蛇尾兽的惊人回复力将草稚剑吸收入体内,化为自己的一股超强力量,能力一鼓超过猫又,彭侯两大强敌,之后,自大的大蛇自以为九尾并非他的对手,于是八娱大蛇有了可以控制三界的邪恶力量,它为了一统三界,散发强大的邪恶力量,揭开风 雷 水 火 土五个祭坛的封印,放出沙之守鹤,雷之雷兽,火之九尾狐, 水之矶怃, 土之貉5只神兽危害人界,邪恶的气息还惊醒了鼠蛟 猫又 彭侯 三只远住在关西的怪物,然而,8只怪物不肯听从八娱大蛇,引发了长达522年的上古九大神兽战,而大蛇虽然以其超强的魔力打败众多魔兽,却低估了9大神兽之首的九尾狐的实力,在消耗战中败北,赖以自豪的神器 草稚剑也被打开一个小缺口,可以说是完败,于是,八娱大蛇自我封印到草稚家族的世代仇敌八神一族的灵魂里, 希望总有一天八神一族的天才后代能够重新唤醒自己的力量再与九尾狐决一胜负.上古神兽战: 参加5场 4胜1负胜: 守鹤矶怃貉雷兽负: 9尾狐下场:据传在八娱大蛇的力量在八神一族中传承,如果后裔中出现千年一次的天才,八娱大蛇的能力就可以在此后人面临生死关头的时候被解放出来,是毁灭一切的力量,八娱大蛇的真身一旦复出,在没有找到九尾狐决战之前,会杀死任何所看到的人,物,甚至神兽. 手动解放八尾力量的方法则是一种秘传解封印术,一旦八神一族的后人能够领会,就可以在任何时候解放八尾的强大力量.九尾 九尾狐九尾狐是九大神兽最强的一个,其强大主要体现在查克拉上面,与别的尾兽提取查克拉的方式不同(一尾,七尾,四尾,六尾K食人制作查克拉,二尾,八尾利用异界力量,三尾利用跟班鱼鲛机,五尾吸收大自然精华),九尾不用借助外力制作查克拉,九尾体内的火神封印可以自动制作查克拉,使九尾的查克拉永远是无限,持久作战能力强。 与八尾的大战中,虽然八尾与九尾的实力相差无几,但是在100多年的持久作战中,八尾的查克拉后续不上,而被九尾击败。 九尾的九条尾巴拥有巨大的能量,一起转动可以引起飓风,配合浑身毛发可以像天空发射查克拉形成陨石雨的法术,再9大神兽战中屡屡击败强敌,较弱的尾兽如鼠蛟,守鹤等,根本不敢前来古战场。 火之祭坛为五大祭坛之首,据传除了火之封印的查克拉产生器外尚有2种特有绝技。 遭受八娱大蛇的黑暗波动影响后,九尾被从火之祭坛唤醒,九尾是最有人类智慧的灵兽,与八娱大蛇一样,并不像诸如守鹤,彭侯之类纯以杀戮为目标,九尾希望找出唤醒自己的魔物,并且找到并杀死上次封印自己的忍者们, 然而,八娱大蛇直到被击败都没有说出自己就是唤醒九尾的怪物上古神兽战:4战 全胜胜:猫又彭侯雷兽八娱大蛇下场:行踪不明,再没有被再次封印之前,九尾的目标就是找到八娱大蛇,或者杀死所有忍者直到找到封印他的忍者为止(然后,就被我们的四代给KO了)

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐