云原生技术分享| 由浅入深掌握Kubernetes系列:十分钟初识K8S

Posted 兴兵乐儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生技术分享| 由浅入深掌握Kubernetes系列:十分钟初识K8S相关的知识,希望对你有一定的参考价值。

云原生技术部落第二波主题文章来了!kubernetes系列文章将为大家带来kubernetes和容器编排相关的基础知识和使用技巧,包括kubernetes的基本概念,kubernetes的常用操作和kubernetes的设计理念和实现原理,深入浅出地为大家讲解kubernetes的相关知识。


第一篇入门级和大家分享kubernetes的基础知识点。


News

应用平台部 林鑫/文


kubernetes是一个跨主机集群的、开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作,提供以容器为中心的基础架构。说起kubernetes的前身,不得不提到大名鼎鼎的Google,kubernetes来源于Google内部使用的Borg系统,Google于2014年6月将Borg项目开源,后续又捐赠给CNCF(云原生计算基金会),在CNCF孵化发展,才演变为了今天的kubernetes。

kubernetes这个单词是希腊语,它的中文翻译是舵手,正如它的命名一样,kubernetes就像舵手为放着许多集装箱(contianer)的大型邮轮指引方向一样,它将已经打包好的应用容器进行编排,从而管理多个容器和微服务架构的复杂应用关系。


kubernetes的核心功能


kubernetes参考了12factor中的微服务设计模式,设计了基于声明式API来管理容器的运行和关系,所有的操作都可以通过API来操作,所以我们也称kubernetes为容器编排引擎。相比于docker关注于容器的构建传输运行,kubernetes更专注于容器运行时的生命周期管理,容器组的关系,而且提供了以下核心功能来承载整个容器组的编排:


○ 故障自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。kubernetes主要处理两类故障自愈:应用故障和节点故障。

kubernetes应用故障自愈


应用故障是由于代码的bug或者应用的负载超过了配置的资源,导致的应用不可用,kubernetes通过预先声明的应用健康检查接口(tcp,http,命令行)来监听应用,如果发现应用故障,则会尝试重新启动来恢复。

云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

kubernetes节点故障迁移


节点故障是由于运行的物理机故障导致的应用不可用,kubernetes会监听节点的健康状态,如果应用故障,会迁移应用到其他存活节点。


○ 弹性伸缩: 通过监控容器的CPU的负载值,例如负载值平均高于80%,增加容器的数量,如果负载值平均低于10%,减少容器的数量。

云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

kubernetes弹性扩缩容


kubernetes有检查应用负载的能力,在检查到项目负载过大的情况下,可以设置自动,或者手动来增加副本,从而达到应对瞬时高负载的业务情况。


云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

kubernetes服务发现


之前提到了kubernetes的应用可以故障自愈和弹性扩缩容,容器所在的节点和ip也是变化的,这种变化对于调用方来说是不可接受的,于是kubernetes声明了服务资源,来解决这个问题,kubernetes会监听服务资源和应用资源,将所有访问服务资源的API请求转发到应用,在应用扩容和重新启动后,kubernetes也会更新服务资源的请求:

○ 滚动升级和一键回滚: kubernetes逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。如果出现问题,kubernetes会为您恢复应用的更改,保障应用持续运行。


云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

kubernetes滚动升级


kubernetes设计了滚动升级和回滚的流程,kubernetes在升级时会按照比例启动至少一个新的应用节点,如果升级后的应用无法启动,则会保留升级前的应用,从而持续提供服务;当升级后的应用成功启动并通过健康检查,kubernates会删除升级前的服务,同时切换服务,完成升级。

kubernetes通过以上的能力来实现了容器组和微服务的编排,保证了大型分布式系统的持续迭代,运行和扩展。


kubernetes核心概念


在kubernetes中,将节点,应用,服务,应用组都抽象为了一种资源,通过这些资源定义的API来实现对应的容器编排能力。


//Node


kubernetes通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。每个节点都包含用于运行 Pod 所需要的服务,这些服务由控制面负责管理。通常集群中会有若干个节点。可以通过kubernetes管理节点:增加和退役节点,设置节点标签等。


//Pod


什么是Pod呢?Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。一个Pod是一个可运行应用节点的最小抽象,每个Pod包含来多个container,它们共享存储和网络,一起提供一组服务,即Pod是一组container的集合。

下图就描述了一个应用节点中Pod是如何提供服务的,该应用包含两个container,一个container是应用服务,一个container作为后台程序与内容服务交互获取信息,更新服务内容。两个应用部署开发各自独立,运行时共享网络和存储,后台应用更新数据,应用数据读取数据提供服务。


云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

kubernetes应用架构


那我们一般如何创建一个Pod呢。我们一般使用Pod模版来创建Pod,Pod模板是包含在工作负载对象中的规范,负载资源包括 Deployment、Job和 DaemonSets等kubernetes资源。工作负载的控制器会使用负载对象中的PodTemplate 来生成多个等同的Pod。PodTemplate是你用来运行应用时指定的负载资源的目标状态的一部分。


//Volume


容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubernetes将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。Kubernetes抽象出Volume对象来解决这两个问题。

其中使用最多的存储卷资源是persistentVolumeClaim,我们以persistentVolumeClaim为例子,来介绍下kubernetes是如何在Pod中注入持久化存储。PVC是用户对存储的请求,概念上与Pod类似; 通过申请PVC就可以申请节点的存储资源,而且可以在PVC里配置存储大小和存储访问权限。

持久卷(PersistentVolume,PV)其实就是集群中一块存储的抽象,可以由管理员事先供应也可以通过storageClass动态供应,PV使用kubernetes卷插件来实现,实现了统一的存储接口,来屏蔽后端存储的类型(NFS,ISCSI,特定的存储CSI抽象)。


云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

Volume示意图


/Deployment


Pod是最基本的运行单元,那Deployment就是kubernetes中最常用的负载资源,是kubernetes中最常用部署管理镜像的资源对象。开发者负责描述Deployment中的目标状态,而Deployment控制器会监听Deployment资源,将其变为目标状态,包括PodTemplate,CPU,memory资源,volume资源等。


云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

//Service



Service资源可以设置关联的服务label,暴露的端口,还可以设置Service服务的类型,默认会创建ClusterIP类型的Service:

◐ ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部可以访问,这也是默认的设置。

◐ NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求节点IP和端口,可以从集群的外部访问一个 NodePort 服务。

◐ LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。

◐ ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。该类型可以在引入外部服务的时候使用。

云原生技术分享| 由浅入深掌握Kubernetes系列(一):十分钟初识K8S

Service示意图


//Namespace


kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为Namespace。Namespace为名称提供了一个范围。资源的名称需要在Namespace内是唯一的,但不能跨Namespace。Namespace不能相互嵌套,每个 kubernetes 资源只能在一个Namespace中。不同的Namespace的资源可以通过Quota资源来限制,不同Namespace的访问策略可以通过NetworkPolicy资源来限制。

当你创建一个Service时, Kubernetes 会创建一个相应的 DNS 条目。该条目的形式是 <Service名称>.<Namespace名称>.svc.cluster.local,这意味着如果容器只使用 <Service名称>,它将被解析到本地名字空间的服务。这也是kubernetes中部署多个版本的相同应用的最佳实践,通过Namespace隔离。


总结


○ kubernetes是一个自动化的容器编排平台,它负责应用的部署、应用的弹性以及应用的管理,这些都是基于容器的。


○ kubernetes通过定义了各种资源对象和API来承载应用的部署,弹性,管理的能力。


本期话题


关于kubernetes,大家有什么不一样的想法呢?欢迎留言。

以上是关于云原生技术分享| 由浅入深掌握Kubernetes系列:十分钟初识K8S的主要内容,如果未能解决你的问题,请参考以下文章

每周一书《云原生服务网格Istio:原理实践架构与源码解析》分享!

如何高效学习 Kubernetes 知识图谱?

如何高效学习 Kubernetes 知识图谱?

如何高效学习 Kubernetes 知识图谱?

云原生技术之kubernetes学习笔记

云原生势头不减,你还没学会 Kubernetes ?