继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

大蕉说k8s(开篇)No.181

一名叫大蕉的程序员
关注TA
已关注
手记 101
粉丝 118
获赞 464

Kubernetes,全名还是有点长的,业界缩写是 k8s,后续我也用k8s来代替全名。关于k8s,官方的介绍是这样的

Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.

k8s是一个提供 自动化部署、自动化扩缩容以及管理容器化应用的开源系统。

怎么理解呢?就是首先,k8s 是开源的,这是毋庸置疑的。其次呢,k8s 管理的对象是 容器化的应用,也就是说普通的非容器化的应用它不管。第三呢,它提供了 自动化部署和自动化扩缩容 的能力。

这三条合起来,可以实现一个普遍的现有系统自动化运维能力。

至于为什么用容器来作为运行基础,每个人有每个人的看法,我的看法比较势利,就是为了提高资源利用率,人和机器利用率,主要是机器。

直接部署在物理主机上或者云主机上是这样的,所有 App 公用操作系统以及硬件资源,各个App间可能互相影响,无法隔离,这确实是资源利用最高效的方式。

http://img.mukewang.com/5e649a40000156c603870362.jpg

虚拟机部署方式是这样的,好处是各个应用隔离非常彻底,缺点就是都要在主机操作系统上,跑多一层操作系统,资源浪费比较严重。

http://img.mukewang.com/5e649a400001325d03850353.jpg

容器化部署是这样的,好处就是App间隔离非常好,公用底层操作系统资源利用率蛮高,每个App都有自己的环境和资源分配。目前比较主流的开源容器技术有两,一是 Docker,二是Rocket。(小提问,Docker需要我来讲吗?)

http://img3.mukewang.com/5e649a4000010e1603970364.jpg

总得来说,k8s选择容器技术作为最基础运行单位,有着一定的考虑,比较重点的原因是容器技术可以做到 App 间隔离,以及相对于虚拟机的资源利用率。但是还有更加核心的一点,就是容器镜像。

有了容器镜像,开发者在本地运行的环境,跟放在服务端运行的环境可以保持 几乎 100% 一致,本地的表现是怎样的,打包成镜像后在服务端运行的表现就是怎样的。另外一方面,因为镜像很标准包含了应用所需的所有环境,应用可以在调度下,非常非常方便地进行水平扩容和缩容。

聊完基础的,聊聊 k8s 整体的大框架,图取自《kubernetes 实战》。

http://img2.mukewang.com/5e649a40000171a710800651.jpg

大的组件是这样的,我先大概讲一下各自的用途,后面每个组件详细说说,我们把 Kubernetes 当成小区公寓管理员,那么 Docker 可以认为是一个个的商品房套间里的一个房间。整个k8s 调度可以这样理解,一个是 status 状态,一个是 spec 期待,我们会有一个监控的程序,一直看着集群有任何一个部署的单元的状态,如果当前的状态跟期待值有区别,将会按照定义好的方式,把它搞到状态值跟期待值一致。

比如我定义了 

spec: 3只?

status: 2 只 ?

可以看到,当前的状态不对,需要再搞1 只?。那么管理员不管是现场生1只?,还是去路上捡1 只?,都要把它搞到 3只?,而且还要品种一样。这让管理应用集群的小伙子压力小多了。

Namespace: 命名空间,隔离用的,不同 NameSpace 相当于不同的单元。比如一单元二单元, 小区单元间默认是不互通的(当然也有办法打通,比如通过 Service)。

Deployment: 部署,我们最常见的应用就会部署在这里啦,他相当于一个套间,其中包含 Pod (整个套间,可能包含多个容器,荷兰?和中华田园?要分房间) 和 Volume (存储间)。

Pod: 部署的最小单位,一个 Pod 相当于整个套间,这个 Pod 要么完全起来要么完全没起来,起了一半的都算没起。k8s 的调度也是基于 Pod 维度的,也就是说,一旦一个 Pod 的 一个容器坏掉了要换,k8s 不会只换一个容器,会直接换掉整个 Pod (1 个?间坏了,整套公寓都要换掉)。

Volume: 在k8s 中,存储是伴随着目录的,如果没有特殊外部存储,那么一个容器的启动会新建一个目录,并且在销毁的时候会把它删掉,也就是说你连?粑粑可能都见不到。而看不到?粑粑是很难受的,排查问题都没法排查。所以我们可以把外部存储挂载进来。常见的有三种,一种是本地空目录,一种是主机目录,另外一种是 PV (Persistent Volume 持久化卷)。

ConfigMap: 我们会把几乎所有的配置放在 ConfigMap 中,是典型的 kv 存储。这样维护起来很简单,也不需要每次启动容器的时候手动改配置。

Secret: 跟ConfigMap 是一模一样的,区别就是只有在运行时的时候可以由程序获取到,其他时间任何人都是看不见的。

DaemonSet: 后台程序,跟 Deployment 没什么区别,会一直在后台运行,会在每一个加入集群的节点中都启动一个,保证自己是启动的,一般会是一些守护容器或者监控或者代理容器。

StatefulSet: 跟 Deployment 没什么区别 ,区别点有两个,第一个是 StatefulSet 是有唯一固定的标识的。Deployment 来说杀掉一个 1 号 Pod,可能会创建一个8 号 Pod 来代替。但是 StatefulSet 杀掉一个 1 号 Pod,也会创建一个一样的 1 号 Pod 来代替。第二个是会配合外部固定的持久化存储使用,保证新创建的 Pod 数据也是跟原来的 Pod 保持一致。一般 Mysql 这类需要固定存储的会用这类存储。

CrobJob: 内容跟 Deployment 差不多,区别点就是Deployment 会一直运行着,CrobJob 会定时运行,运行完成就杀掉自己。

Job: 跟 CrobJob 一样,区别就是运行一次就杀掉自己,一般没人用。

LabelSelector: 标签选择器,k8s 内部基本所有资源筛选都会通过打标签的形式。比如Pod 选择部署的节点,Service 服务选择提供服务的 Pod。定义的形式就是典型的字符串 kv。比如 wealth :  rich,height : 180,outlook : hansome。

Service: 选择一批 Pod 作为服务提供者,并且与集群的 dns 联动,生成统一的域名,集群内一般通讯都通过 Service 进行。特定的 Service 比如 Ingress 和 Nginx 还可以对外暴露端口进行服务提供。比如 Service 名叫荷兰?,会寻找 Label 为荷兰?的 Pod,然后直接把它们暴露给需要服务的人。

其他没什么好说的,基础概念说完了。如果你只能记住一句话,那么就记住这个叭。Pod 是最基础部署单元,有很多个容器,带了一定的标签,可以通过 Service 对外提供服务。


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP