Kubernetes菜鸡入门基础


上一篇也记录了一些关于kubernetes的基础知识,但是对于我这种没有任何k8s基础的人看起来可能还是一脸懵逼……所以再整一篇看上去比较通俗易懂的

容器和容器编排

什么是容器?

容器从字面意思上很好理解,他主要的作用就是 “装”。在IT里容器技术就是英文单词 Linux Container的直译。container就有集装箱的意思。现实生活里,在码头运输集装箱,我不需要过多的关注集装箱里的东西。比如或把一辆兰博基尼打包放入了一个集装箱,然后通过货轮可以轻而易举的从上海码头运到纽约的码头,并且在运输期间没有任何损坏,在到达目的地卸货后依旧可以炸街……
这里的话,兰博基尼就相当于我们的应用APP,集装箱就是我们的容器,上海码头相当于一套环境(CentOS),纽约码头相当于另一套环境(Ubuntu),货物没有损坏就相当于我的app没有任何文件的丢失,迁移到另一套环境后我的APP依旧可以正常运行。
在这里插入图片描述
所以专业的来说,容器就是一个软件的轻量级独立可执行的软件包,它包含了软件运行时所需要的一切:代码,系统工具,数据库,运行环境,三方依赖等等。这样就使得你的应用程序可以在任何地方以相同的方式运行。
docker logo

为什么要用容器

在开发的过程中,一般的流程都是:先本地搭建好环境,然后进行开发工作,完成测试,最后部署到生产
在这里插入图片描述
但是实际情况却是,相同的代码,在运行环境发生变化之后总是会出现各种奇葩问题,所以我们不得不花费大量的精力去处理这些问题,而容器化技术的目的就是让我们不要再花费大量的精力的环境上。
容器化技术包含了一整套的运行时环境,除了应用程序本身,所需要的的依赖,类库,配置文件等,都一并被打入了一个被称为容器镜像的包中。
在这里插入图片描述

容器的特点(docker)

  1. 轻量级:在一台机器上运行的容器共享该机器的操作系统内核。
  2. 标准:Docker容器基于开放标准,可在所有主要Linux发行版,Microsoft Windows以及任何基础架构(包括虚拟机,裸机和云中)上运行。
  3. 安全:Docker容器将应用程序彼此隔离并从底层基础架构中分离出来。Docker提供了最强大的默认隔离功能,可以将应用程序问题限制在一个容器中,而不是整个机器上。

容器和虚拟机的区别

在这里插入图片描述
VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;

Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。

那么问题来了,没有操作系统,怎么运行程序?

可以在Docker中创建一个ubuntu的镜像文件,这样就能将ubuntu系统集成到Docker中,运行的应用就都是ubuntu的应用。
容器就扯到这里。。再扯多了没意思

什么是容器编排(kubernetes)

他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。

其实从docker和k8s的logo上就可以看出一点他们之间的关系,docker的logo是集装箱,k8s的logo是一个轮船的舵
在这里插入图片描述
在这里插入图片描述
所以这么一看自然是有一些“暧昧”关系在里面的

在这里插入图片描述
简单来说就是,容器的生命周期管理工具。

kubernetes基础

Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用(就像canary deployments)。

整体架构

在这里插入图片描述
在这里插入图片描述
kubernetes属于一个主从分部署架构,主要由Master NodeWorker Node从组成,以及包括客户端命令行工具kubectl 和其他附加项
在这里插入图片描述
在k8s中,Master负责集群中应用的调度,更新,扩缩等操作。k8s中的执行角色为Node,一个Node一般就是一个物理机或者虚拟机,他上面运行着docker服务和kubelet服务(kubernetes的一个组件),当接收到Master下发的任务之后,Node就要去完成

这里master集群的意义主要在于冗余。

在这里插入图片描述
左边的API,UI,CLI被称为是用户客户端,他们向master节点发起请求,命令,然后由master负责实现Node节点上来执行操作(增删改查)。

基础概念

基础组件

Master组件

主要包括: kube-apiServer , kube-controller-manager , kube-scheduler
在这里插入图片描述
上图中,etcd并非是k8s自己原生的组成部分,但是他是k8s的一个重要组成部分。他是一个专门用来保存应用程序配置信息的守护进程。类似于Redis的K-V存储系统。当然他还有很多其他功能。
所有master的持续状态都存在etcd的一个实例中。因为有内部有watch(观察者)的支持,各部件协调中的改变可以很快被etcd察觉,并通知相关组件。如service映射pod规则,如果pod被增删,其动态变化信息会存放在Etcd中,并通知service,service会自动重新做映射。

  • APIServer:集群的统一入口,各组件的协调者。以HTTP API提供接口服务,所有对象资源的增删改查和监听都交给APIServer处理后再提交给Etcd来存储
  • controller-manager:处理集群中常规后台任务,一个资源对应一个控制器,而controllerManager就是负责管理这些控制器的。
  • scheduler:根据调度算法为新创建的Pod选择一个Node节点。

controller会监听APIServer上的资源变动,一旦有变动,就会去执行改动

Node组件

Node组件中包括了

  1. kube-proxy:在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
  2. kubelet: kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容易,Pod挂载数据卷,获取容器和节点状态等工作。kubelet将每个pod转换成一组容器。
  3. Container Runtime:容器引擎

在这里插入图片描述
粗略的来讲,结合Master中的图,当用户请求到达master时,比如创建容器,APIServer接收到请求之后会写到etcd中,同时scheduler监听到之后,会在当前集群中调度,选一个合适的Node作为真正执行的节点。调度完之后,调度结果也会保存到etcd中。然后每一个Node的内部中,有一个kubelet组件,这个组件也会监听APIServer上的资源变动。所以当scheduler选定了某一个Node执行任务时,此Node也会得知当前任务由自己操作,然后就是调用docker,由docker来执行具体的容器操作。

大致的流程

在这里插入图片描述

但是上述的过程也有一个问题,就是在k8s之上,每一个运行的容器在k8s中被封装了一层,称之为Pod,Pod相当于是容器的又一层外壳。一个Pod中可以存在多个容器,这多个容器是作为一个原子单元来运行的
K8S运行的核心基本单元是Pod,而不是容器

在这里插入图片描述
每个Pod中都有一个基础架构容器,即图中的infra,任何容器加入到Pod中,都会共享这个infra。不论是网络,还是挂载的存储卷,同一个Pod中的容器都是可以共享的。

kubernetes Objects

在这里插入图片描述
基础对象:Pod,Service,Namespace,Volume
控制器对象:ReplicaSet,Deployment,DaemonSet,StatefulSet和Job

k8s:cluster,容器编排系统
核心任务:容器编排
容器:应用程序

当容器被我们放入Pod中时运行,如何保证外部可以访问我们的Pod,或者如果Pod出现了故障又要如何处理。一般来说容器编排系统都需要有健康监测的机制,而k8s对这一块的支持,是通过Pod控制器来实现的。所以这时候就要用到Pod Controller,最基础的Pod Controller叫做Deployment。由这个deployment(控制器)来管理Pod。例如创建Pod的时候,不是由k8s直接创建的,而是先创建一个控制器,由这个deployment来创建。

当Pod创建完成之后,Pod内部容器种运行的是我们的应用程序,但是外部如何来访问我们这些应用??尤其是在新增了或者更换了Pod之后,新建或更换的Pod的IP地址是动态分配的。所以原本客户端访问的IP地址将失效,无法访问到容器。
为了解决这个问题,必须要使用服务注册与发现的机制来保证客户端和服务端之间的访问。此时,k8s就在客户端和Pod之间,加了一个中间层:Service。由客户端访问Service,Service再去访问对应的Pod(若有多个Pod,还可以实现负载均衡的效果)。Service 也有一个IP地址,叫做Service-ip(cluster-ip)。此时的service的作用就有点类似于nginx的作用。
service又是如何做到Pod 的代理?
k8s使用的是 Label 来给Pod打标签。然后通过标签来访问
在这里插入图片描述

给Pod打上app:nginx,然后service通过标签选择器来选择标签
在这里插入图片描述

总结

上面写的很jer乱,那很正常哈,毕竟水平有限,我自己看得懂就好了哈哈哈哈哈。

kubernetes核心概念

  • Cluster:是计算,存储和网络资源的合集,kubernetes利用这些资源进行各种基于容器的应用
  • Master:是cluster的大脑,他的主要职责就是负责调度,即决定将应用放在哪里运行。
  • Node:职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,并根据Master的要求管理容器的生命周期。
  • Pod:Pod是kubernetes的最小工作单元。每一个Pod包含一个或者多个容器。Pod容器会作为一个整体被Master调度到一个Node上运行。一个Pod里的所有容器共用一个namespace
  • Controller:管理Pod的工具,kubernetes通过他来管理集群中的Pod
  • Deployment:是最常用的一个Controller,Deployment可以管理Pod的多个副本,并确保Pod按照期望运行
  • ReplicaSet:实现了Pod的多副本管理。使用deployment时会字段创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本的。通常是不需要直接使用ReplicaSet
  • DaemonSet:DaemonSet 用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。
  • StatefuleSet:StatefuleSet 能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。
  • Job:Job 用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。
  • Service:Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,并把这个IP和后端的Pod所跑的服务的关联起来。Service 为 Pod 提供了负载均衡。
  • namespace:可以将一个物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。不同 Namespace 里的资源是完全隔离的。Kubernetes 默认创建了两个 Namespace,default和kube-system

这一篇写的也很通俗易懂,就很舒服:https://blog.csdn.net/qq_21187515/article/details/101290820
这个也很牛皮:http://www.imooc.com/article/285913?block_id=tuijian_wz

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值