首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大蕉说k8s(开篇)No.181

大蕉说k8s(开篇)No.181

作者头像
大蕉
发布2020-02-25 09:30:54
4800
发布2020-02-25 09:30:54
举报

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

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

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

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

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

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

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

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

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

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

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

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

大的组件是这样的,我先大概讲一下各自的用途,后面每个组件详细说说,我们把 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 对外提供服务。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一名叫大蕉的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档