共计 5048 个字符,预计需要花费 13 分钟才能阅读完成。
对于 K8s 的基本概念咱们将会围绕如下七点开展:
- Docker 的治理痛点
- 什么是 K8s?
- 云架构 & 云原生
- K8s 架构原理
- K8s 外围组件
- K8s 的服务注册与发现
- 关键问题
Docker 的治理痛点
如果想要将 Docker 利用于宏大的业务实现,是存在艰难的编排、治理和调度问题。
于是,咱们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵便的治理。
Kubernetes 应运而生!Kubernetes,名词源于希腊语,意为「舵手」或「飞行员」。
Google 在 2014 年开源了 Kubernetes 我的项目,建设在 Google 在大规模运行生产工作负载方面领有十几年的教训的根底上,联合了社区中最好的想法和实际。
K8s 是 Kubernetes 的缩写,用 8 代替了「ubernete」,下文咱们将应用简称。
什么是 K8s?
K8s 是一个可移植的、可扩大的开源平台,用于治理容器化的工作负载和服务,可促成申明式配置和自动化。
K8s 领有一个宏大且快速增长的生态系统。K8s 的服务、反对和工具宽泛可用。
通过 K8s 咱们能够:
- 疾速部署利用
- 疾速扩大利用
- 无缝对接新的利用性能
- 节俭资源,优化硬件资源的应用
K8s 有如下特点:
- 可移植:反对私有云,公有云,混合云,多重云 multi-cloud。
- 可扩大:模块化,插件化,可挂载,可组合。
- 自动化:主动部署,主动重启,主动复制,主动伸缩 / 扩大。
云架构 & 云原生
①云和 K8s 是什么关系
云就是应用容器构建的一套服务集群网络,云由很多的大量容器形成。K8s 就是用来治理云中的容器。
②常见几类云架构
常见几类云架构如上图所示:
- On-Premises(本地部署)。
- IaaS(基础设施即服务):用户:租用(购买 | 调配权限)云主机,用户不须要思考网络,DNS,硬件环境方面的问题;运营商:提供网络,存储,DNS,这样服务就叫做基础设施服务。
- PaaS(平台即服务 - 中间件):MySQL/ES/MQ/…
- SaaS(软件即服务 - 浏览器页面):钉钉,财务管理。
- Serverless:无服务,不须要服务器。站在用户的角度思考问题,用户只须要应用云服务器即可,在云服务器所在的根底环境,软件环境都不须要用户关怀。
如果感觉不好了解,举荐浏览这篇文章:如何艰深解释 IaaS、PaaS、SaaS 的区别:
https://www.zhihu.com/question/21641778/answer/62523535
能够预感:将来服务开发都是 Serverless,企业都构建了本人的公有云环境,或者是应用私有云环境。③云原生
为了让应用程序(我的项目,服务软件)都运行在云上的解决方案,这样的计划叫做云原生。
云原生有如下特点:
- 容器化,所有服务都必须部署在容器中
- 微服务,Web 服务架构式服务架构
- CI/CD
- DevOps
K8s 架构原理
①K8s 架构
k8s 架构解释:
概括来说 K8s 架构就是 一个 Master 对应一群 Node 节点
。上面咱们来逐个介绍 K8s 架构图中的 Master 和 Node。
Master 节点构造如下:
apiserver
即 K8s 网关,所有的指令申请都必须要通过 apiserver。Scheduler 调度器
,应用调度算法,把申请资源调度到某一个 Node 节点。Controller 控制器
,保护 K8s 资源对象。etcd
: 存储资源对象。
Node 节点构造如下:
Kubelet
在每一个 Node 节点都存在一份,在 Node 节点上的资源操作指令由 Kubelet 来执行。Kube-proxy 代理服务
,解决服务间负载平衡。Pod
是 K8s 治理的根本单元(最小单元),Pod 外部是容器,K8s 不间接治理容器,而是治理 Pod。- Docker 运行容器的根底环境,容器引擎。
- Fluentd 日志收集服务。
在介绍完 K8s 架构后,咱们又引入了很多技术名词。不要焦急,先有整体概念,再各个击破。请急躁浏览下文,置信你肯定会有不一样的播种。
K8s 外围组件
①K8s 组件
K8s 是用来治理容器,然而不间接操作容器,最小操作单元是 Pod(间接治理容器):
- 一个 Master 有一群 Node 节点与之对应。
- Master 节点不存储容器,只负责调度、网管、控制器、资源对象存储。
- 容器的存储在 Node 节点,容器是存储在 Pod 外部的)。
- Pod 外部能够有一个容器,或者多个容器。
- Kubelet 负责本地 Pod 的保护。
- Kube-proxy 负责负载平衡,在多个 Pod 之间来做负载平衡。
②Pod 是什么?解释如下:
- Pod 也是一个容器,这个容器中装的是 Docker 创立的容器,Pod 用来封装容器的一个容器,Pod 是一个虚拟化分组。
- Pod 相当于独立主机,能够封装一个或者多个容器。
- Pod 有本人的 IP 地址、主机名,相当于一台独立沙箱环境。
**③Pod 到底用来干什么?
通常状况下,在服务部署时候,应用 Pod 来治理一组相干的服务。一个 Pod 中要么部署一个服务,要么部署一组有关系的服务。一组相干的服务是指:在链式调用的调用连路上的服务。
**④Web 服务集群如何实现?
** 实现服务集群:只须要复制多方 Pod 的正本即可,这也是 K8s 治理的先进之处,K8s 如果持续扩容,只须要管制 Pod 的数量即可,缩容情理相似。
**⑤Pod 底层网络,数据存储是如何进行的?
具体如下:
- Pod 外部容器创立之前,必须先创立
Pause
容器。 - 服务容器之间拜访 localhost,相当于拜访本地服务一样,性能十分高。
⑥ReplicaSet 正本控制器
- 管制 Pod 正本「服务集群」的数量,永远与预期设定的数量保持一致即可。
- 当有 Pod 服务宕机时候,正本控制器将会立马从新创立一个新的 Pod,永远保障正本为设置数量。
正本控制器:标签选择器 - 抉择保护一组相干的服务(它本人的服务)
- ReplicationController 正本控制器:单选。
- ReplicaSet 正本控制器:单选,复合抉择。
selector:app = web
Release = stable
在新版的 K8s 中,倡议应用 ReplicaSet 作为正本控制器,ReplicationController 不再应用了。
⑦Deployment 部署对象
Deployment 部署对象如下:
- 服务部署构造模型
- 滚动更新
ReplicaSet 正本控制器管制 Pod 正本的数量。然而,我的项目的需要在一直迭代、一直的更新,我的项目版本将会不停的的发版。版本的变动,如何做到服务更新?
部署模型:
ReplicaSet 不反对滚动更新
,Deployment 对象反对滚动更新,通常和 ReplicaSet 一起应用。- Deployment 治理 ReplicaSet,RS 从新建设新的 RS,创立新的 Pod。
⑧MySQL 应用容器化部署,存在什么样的问题?
问题如下:
- 容器是生命周期的,一旦宕机,数据失落
- Pod 部署,Pod 有生命周期,数据失落
Deployment 与 StatefulSet(有状态与无状态部署策略)
对于 K8s 来说,不能应用 Deployment 部署有状态服务。通常状况下,Deployment 被用来部署无状态服务,那么对于有状态服务的部署,应用 StatefulSet 进行有状态服务的部署。
什么是有状态服务?
- 有实时的数据须要存储。
- 有状态服务集群中,把某一个服务抽离进来,一段时间后再退出机器网络,如果集群网络无奈应用。
什么是无状态服务?
- 没有实时的数据须要存储。
- 无状态服务集群中,把某一个服务抽离进来,一段时间后再退出机器网络,对集群服务没有任何影响。
⑨StatefulSet
为了解决有状态服务应用容器化部署的一个问题:
- 部署模型
- 有状态服务
StatefulSet 保障 Pod 从新建设后,Hostname 不会发生变化,Pod 就能够通过 Hostname 来关联数据。
K8s 的服务注册与发现
①Pod 的构造是怎么的?
构造如下:
- Pod 相当于一个容器,Pod 有独立 IP 地址,也有本人的 Hostname,利用 Namespace 进行资源隔离,独立沙箱环境。
- Pod 外部封装的是容器,能够封装一个,或者多个容器(通常是一组相干的容器)。
②Pod 网络 具体如下:
- Pod 有本人独立的 IP 地址。
- Pod 外部容器之间拜访采纳 Localhost 拜访。
- Pod 外部容器拜访是 Localhost,Pod 之间的通信属于近程拜访(集群外部服务可见)。
**③Pod 是如何对外提供服务拜访的?
Pod 是虚构的资源对象(过程),没有对应实体(物理机,物理网卡)与之对应,无奈间接对外提供服务拜访。那么该如何解决这个问题呢?
Pod 如果想要对外提供服务,必须绑定物理机端口。也就是说在物理机上开启端口,让这个端口和 Pod 的端口进行映射,这样就能够通过物理机进行数据包的转发。概括来说:先通过物理机 IP+Port 进行拜访,再进行数据包转发。–【NodePort】
④一组相干的 Pod 正本,如何实现拜访负载平衡?
咱们先明确一个概念,Pod 是一个过程,是有生命周期的。宕机、版本更新,都会创立新的 Pod。这时候 IP 地址会发生变化,Hostname 会发生变化,应用 Nginx 做负载平衡就不太适合了。所以咱们须要依赖 Service 的能力。
⑤Service 如何实现负载平衡?
简略来说,Service 资源对象包含如下三局部:
- Pod IP:Pod 的 IP 地址。
- Node IP:物理机 IP 地址。
- Cluster IP:虚构 IP,是由 K8s 形象出的 Service 对象,这个 Service 对象就是一个 VIP 的资源对象。
⑥Service VIP 更深刻原理探讨
具体如下:
- Service 和 Pod 都是一个过程,Service 也不能对外网提供服务。
- Service 和 Pod 之间能够间接进行通信,它们的通信属于局域网通信。
把申请交给 Service 后,Service 应用 iptable,ipvs 做数据包的散发。
⑦Service 对象是如何和 Pod 进行关联的?
具体如下:
- 不同的业务有不同的 Service。
- Service 和 Pod 通过标签选择器进行关联。
selector:app=x 抉择一组订单的服务 pod,创立一个 service;通过 endpoints 寄存一组 pod ip;
Service 通过标签选择器抉择一组相干的正本,而后创立一个 Service。
⑧Pod 宕机、公布新的版本的时候,Service 如何发现 Pod 曾经产生了变动?
每个 Pod 中都有 Kube-Proxy,监听所有 Pod。如果发现 Pod 有变动,就动静更新(etcd 中存储)对应的 IP 映射关系。
关键问题
①企业应用 K8s 次要用来做什么?
有如下三个方面:
- 自动化运维平台,守业型公司,中小型企业,应用 K8s 构建一套自动化运维平台,主动保护服务数量,放弃服务永远和预期的数据放弃一致性,让服务能够永远提供服务。这样最间接的益处就是降本增效。
- 充分利用服务器资源,互联网企业,有很多服务器资源「物理机」,为了充分利用服务器资源,应用 K8s 构建公有云环境,我的项目运行在云。这在大型互联网公司尤为重要。
- 服务的无缝迁徙,我的项目开发中,产品需要不停的迭代,更新产品。这就意味着我的项目不停的公布新的版本,而 K8s 能够实现我的项目从开发到生产无缝迁徙。
②K8s 服务的负载平衡是如何实现的?
- Pod 中的容器很可能因为各种起因产生故障而死掉。Deployment 等 Controller 会通过动态创建和销毁 Pod 来保障利用整体的健壮性。
- 换句话说,Pod 是软弱的,但利用是强壮的。每个 Pod 都有本人的 IP 地址。当 Controller 用新 Pod 代替产生故障的 Pod 时,新 Pod 会调配到新的 IP 地址。这样就产生了一个问题:如果一组 Pod 对外提供服务(比方 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并拜访这个服务呢?
- K8s 给出的解决方案是 Service。Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 Label 来筛选。Service 有本人 IP,而且这个 IP 是不变的。客户端只须要拜访 Service 的 IP,K8s 则负责建设和保护 Service 与 Pod 的映射关系。无论后端 Pod 如何变动,对客户端不会有任何影响,因为 Service 没有变。
③无状态服务个别应用什么形式进行部署?
Deployment 为 Pod 和 ReplicaSet 提供了一个 申明式定义方法,通常被用来部署无状态服务。Deployment 的次要作用:定义 Deployment 来创立 Pod 和 ReplicaSet 滚动降级和回滚利用扩容和索容暂停和持续。Deployment 不仅仅能够滚动更新,而且能够进行回滚,如果发现降级到 V2 版本后,服务不可用,能够迅速回滚到 V1 版本。