关于后端:k8s的认知与学习

4次阅读

共计 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 版本。

正文完
 0