请选择 进入手机版 | 继续访问电脑版
在线投稿 文字标题 文字标题 文字标题 文字标题 文字标题
切换皮肤
开启新的专题【研发工程师学容器化】第14节【服务编排k8s从概念开始】,前面分了2次说了docker swarm,你会发现docker swarm很简单,只需要初始化一个集群,默认的manager节点,如果两台机器的网络想通,可以通过manager的token连接,成为worker节点,这样swarm集群就搭建完毕了,也可以调度。会发现docker里面很多时候没有一些概念可谈,这也是为什么企业里面会选择k8s的原因,docker使用上很简单,会受限于很简单的架构,导致做高可用,做集群不是那么容易。如果想调度上千台机器,上万台,例如淘宝,京东,网易,业务系统都是通过业务编排来进行容器化的。在k8s。上1万台就会发现使用swarm就很困难,前面也说过swarm适合于中小企业,集群数在几千以内,可以去使用,超过上万了,应用实例或者服务器,使用k8s会更好一些,这里就涉及到k8s基础知识,今天一起来了解什么是k8s。



(一)为什么需要kubernetes
① 为什么需要服务编排

在开发的过程中, 多少个子模块就可以建立多少个容器,100个容器应用,就难以管理,当一个整合系统拆分成多个微服务后,技术问题不说,服务监控,网络成本,部署成本,运维成本,以前挂一个项目就可以了,现在我需要挂100个,导致容器的管理非常非常的困难,最终你需要后退一步,对容器进行分布,以便跨所有的容器,提供网络安全和监控,k8s和swarm,其实就是docker引入后,docker要求职责单一化,项目非常的庞大,运维成本很高,swarm和k8s就出现了。帮我们编排管理docker 容器的。

② 介绍

Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 “kube” ,是一种可自动实施 Linux 容器操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,您可以将运行 Linux 容器的多组主机聚集在一起,由 Kubernetes 帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云、私有云或混合云部署主机(只要k8s可以管理到的)。因此,对于要求快速扩展的云原生应用而言(例如借助 Apache Kafka 进行的实时数据流处理),Kubernetes 是理想的托管平台。
Kubernetes 最初由 Google 的工程师基于 go 语言开发和设计出来并于2014年6月开源。Google 是最早研发 Linux 容器技术的企业之一,曾公开分享介绍 Google 如何将一切都运行于容器之中(这是 Google 云服务背后的技术)。Google 每周会启用超过 20 亿个容器——全都由内部平台 Borg 支撑。Borg 是 Kubernetes 的前身,多年来开发 Borg 的经验教训成了影响 Kubernetes 中许多技术的主要因素。google当初就是自己在做,它害怕出现类似的系统替代它的系统,在其他厂家还没有开源的时候,其实内部google还是使用的Borg,就类似阿里的dubbo一样,其实阿里的内部是不用dubbo的,所以开源了。
趣闻:Kubernetes 徽标的七个轮辐代表着项目最初的名称“九之七项目”(Project Seven of Nine)。
红帽是第一批与 Google 合作研发 Kubernetes 的公司之一,作为 Kubernetes 上游项目的第二大贡献者,我们甚至在这个项目启动之前就已参与其中。2015 年,Google 将 Kubernetes 项目捐赠给了新成立的云原生计算基金会。

(一)为什么需要 kubernetes

真正的生产型应用会涉及多个容器。这些容器必须跨多个服务器主机进行部署。Kubernetes 可以提供所需的编排和管理功能,以便您针对这些工作负载大规模部署容器。借助 Kubernetes 编排功能,您可以构建跨多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的健康状况。
Kubernetes 还需要与联网、存储、安全性、遥测和其他服务集成整合,以提供全面的容器基础架构。



当然,这取决于您如何在您的环境中使用容器。Linux 容器中的基本应用将它们视作高效、快速的虚拟机。一旦把它部署到生产环境或扩展为多个应用,您显然需要许多托管在相同位置的容器来协同提供各种服务。随着这些容器的累积,您运行环境中容器的数量会急剧增加,复杂度也随之增长。
Kubernetes 通过将容器分类组成 “容器集” (pod),解决了容器增殖带来的许多常见问题容器集为分组容器增加了一个抽象层,可帮助您调用工作负载,并为这些容器提供所需的联网和存储等服务。Kubernetes 的其它部分可帮助您在这些容器集之间达成负载平衡,同时确保运行正确数量的容器,充分支持您的工作负载。
如果能正确实施 Kubernetes,再辅以其它开源项目(例如 Atomic 注册表、Open vSwitch、heapster、OAuth 以及 SELinux),您就能够轻松编排容器基础架构的各个部分。



最低三台服务器(虚拟器)centos7,第一台master(3G),第二台node1(2G),第三台node2(2G)。基于这三台手动来进行安装,到底是如何工作的,真实的生产环境肯定是通过kubeadm工具来进行安装,屏蔽的一切的过程。如果是新手对你来说没有任何的好处。

③ kubernetes 有哪些用途

在您生产环境中使用 Kubernetes 的主要优势在于,它提供了一个便捷有效的平台,让您可以在物理机和虚拟机集群上调度和运行容器。更广泛一点说,它可以帮助您在生产环境中,完全实施并依托基于容器的基础架构运营。由于 Kubernetes 的实质在于实现操作任务自动化,所以您可以将其它应用平台或管理系统分配给您的许多相同任务交给容器来执行。
利用 Kubernetes,您能够达成以下目标:

1.跨多台主机进行容器编排。
2.更加充分地利用硬件,最大程度获取运行企业应用所需的资源。
3.有效管控应用部署和更新,并实现自动化操作。
4.挂载和增加存储,用于运行有状态的应用。
5.快速、按需扩展容器化应用及其资源。
6.对服务进行声明式管理,保证所部署的应用始终按照部署的方式运行。
7.利用自动布局、自动重启、自动复制以及自动扩展功能,对应用实施状况检查和自我修复。

但是,Kubernetes 需要依赖其它项目来全面提供这些经过编排的服务。因此,借助其它开源项目可以帮助您将 Kubernetes 的全部功用发挥出来。这些功能包括:

1.注册表,通过 Atomic 注册表或 Docker 注册表等项目实现。
2.联网,通过 OpenvSwitch 和智能边缘路由等项目实现。
3.遥测,通过 heapster、kibana、hawkular 和 elastic 等项目实现。
4.安全性,通过 LDAP、SELinux、RBAC 和 OAUTH 等项目以及多租户层来实现。
5.自动化,参照 Ansible 手册进行安装和集群生命周期管理。
6.服务,可通过自带预建版常用应用模式的丰富内容目录来提供。
(二)kubernetes 核心概念
① 全景图

Internet 加上防火墙这是一部分,意味着对node节点,访问的proxy代理访问的是某一个node节点。
可以理解k8s里面有两个核心的概念一个是master,一个是node。
一起通过上图,了解下,发起命令后,k8s如何进行操作的。
输入命令,先进入master节点,authrntication 有个鉴权认证的过程。给每个客户端颁发一个token,有这个token,可以进行操作。
回想下 docker其实分两块,docker server和docker client。docker client 有对应的rest 的api。
docker server提供了接口,通过docker client进行调用。k8s也是一样有个对应rest风格的API可以获得(pods,services,rep,controllers)
scheduler 定时任务,有定时任务的监控 scheduling actuator 定时任务的监控。
controller manager 控制中心
监控 etcd 会注册到REST服务上去。
通过rest的接口都是可以获取到的,master components 需要跟node节点进行关联,双向的线,node会主动给master节点进行沟通,master节点会主动沟通node节点。
kubelet 可以对node节点的pod进行操作,你想操作node节点的pod就需要通过kubelet 。
pod节点外边是个docker 容器,意味node节点可能是个宿主机或者物理机。
一个pod是一个多个docker容器的分组。pod是k8s中最小的单位。
② 介绍

Kubernetes 有各类资源对象来描述整个集群的运行状态(Node、Pod、Replication Controller、Service等都可以看作一种“资源对象”)。这些对象都需要通过调用 kubernetes api 来进行创建、修改、删除并将其保存在etcd中持久化存储,可以通过 kubectl 命令工具,也可以直接调用 k8s api,或者使用对象语言的客户端库(例如:golang , pythion )。
从这个角度来看,Kubernetes其实是一个高度自动化的资源控制系统,它通过跟踪对比etcd库里保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错的高级功能。
每个 kubernetes 对象都会包含两个关键字段:Object Spec 和 Object Status。spec 描述了对象所期望达到的状态,status 描述了该对象的实际状态。
在介绍资源对象之前,我们先了解一下Kubernetes集群的两种管理角色:Master和Node。

③ Master

Kubernetes里的Master指的是集群控制节点,每个Kubernetes集群里需要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它来负责具体的执行过程,我们后面执行的所有命令基本都是在Master节点上运行的。Master节点通常会占据一个独立的服务器(高可用部署建议用3台服务器),其主要原因是它太重要了,是整个集群的“首脑”,如果宕机或者不可用,那么对集群内容器应用的管理都将失效。

Master节点上运行着以下一组关键进程:
Kubernetes API Server (kube-apiserver):提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。
Kubernetes Controller Manager (kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心,可以理解为资源对象的“大总管”。
Kubernetes Scheduler (kube-scheduler):负责资源调度(Pod调度)的进程,相当于公交公司的“调度室”。

另外,在Master节点上还需要启动一个etcd服务,因为Kubernetes里的所有资源对象的数据全部是保存在etcd中的,etcd可以认为是类似redis,可以做到高可用集群,效率非常快,对外访问,集群做高可用。



正常的生产环境master必须2到3台主机来进行,来进行高可用(2n+1)方便进行选举,这个太重要了,master节点一挂整个k8s都没办法使用了。

④ node 节点

除了Master,Kubernetes集群中的其他机器被称为Node节点,在较早的版本中也被称为Minion。与Master一样,Node节点可以是一台物理主机,也可以是一台虚拟机。Node节点才是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上去。 每个Node节点上都运行着以下一组关键进程:

kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作 ,实现集群管理的基本功能。
kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件。
Docker Engine (docker):Docker引擎,负责本机的容器创建和管理工作。

Node节点可以在运行期间动态增加到Kubernetes集群中,前提是这个节点上已经正确安装、配置和启动了上述关键进程,在默认情况下kubelet会向Master注册自己,这也是Kubernetes推荐的Node管理方式。一旦Node被纳入集群管理范围,kubelet进程就会定时向Master节点汇报自身的情报,例如操作系统、Docker版本、机器的CPU和内存情况,以及当前有哪些Pod在运行等,这样Master可以获知每个Node的资源使用情况,并实现高效均衡等资源调度策略。而某个Node超过指定时间不上报信息时,会被Master判断为“失联”,Node的状态被标记为不可用(Not Ready),随后Master会触发“工作负载大转移”的自动流程。


⑤ . Pod

Pod是Kubernetes的最重要也最基本的概念,如下图所示是Pod的组成示意图,我们看到每个Pod都有一个特殊的被成为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。


Pod的组成

为什么Kubernetes会设计出一个全新的Pod概念并且Pod有这样特殊的组成结构?

> 原因之一:在一组容器作为一个单元的情况下,我们难以对“整体”简单地进行判断及有效地进行行动。比如,一个容器死亡了,此时算是整体死亡么?引入业务无关并且不易死亡的Pause容器作为Pod的根容器,以它的状态代表整体容器组的状态,就简单、巧妙地解决了这个难题。
> 原因之二:Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume,这样既简化了密切关联的业务容器之间的通信问题,也很好地解决了它们之间的文件共享问题。
Kubernetes为每个Pod都分配了唯一的IP地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP地址。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,这通常采用虚拟而层网络技术来实现,例如Flannel、Open vSwitch等,因此我们需要牢记一点:在Kubernetes里,一个Pod里的容器与另外主机上的Pod容器能够直接通信。
> Pod其实有两种类型:普通的Pod及静态Pod(Static Pod),后者比较特殊,它并不存放在Kubernetes的etcd存储里,而是存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动运行。而普通的Pod一旦被创建,就会被放入到etcd中存储,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器并且启动起来。在默认情况下,当Pod里的某个容器停止时,Kubernetes会自动检测到这个问题并且重新启动这个Pod(重启Pod里的所有容器),如果Pod所在的Node宕机,则会将这个Node上的所有Pod重新调度到其他节点上。Pod、容器与Node的关系图如下图所示。

PS:今天就说到这里,之前写的专题docker走向k8s,不太适合研发人员学习,为了提供更多的干货直接有了这个专题,其实k8s的核心概念不止这些,因为篇幅内容的问题,下节继续说k8s的核心概念和常用术语。

回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    Archiver|手机版|小黑屋|齐聚无忧 |网站地图

    Powered by Discuz! X3.4  © 2001-2013 Comsenz Inc.