十分钟带你理解Kubernetes核心概念

十分钟带你理解Kubernetes核心概念

什么是Kubernetes?

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 将容器组织成组,并且提供容器间的负载均衡
  • 很容易地升级应用程序容器的新版本
  • 提供容器弹性,如果容器失效就替换它,等等...

k8s的集群至少有两个主机组成:master + node ,即为master/node架构,master为集群的控制面板,master主机需要做冗余,一般建议为3台,而node主机不需要,因为node的主要作用是运行pod,贡献计算能力和存储能力,而pod控制器会自动管控pod资源,如果资源少,pod控制器会自动创建pod,即pod控制器会严格按照用户指定的副本来管理pod的数量。客户端的请求下发给master,即把创建和启动容器的请求发给master,master中的调度器分析各node现有的资源状态,把请求调用到对应的node启动容器。

可以理解为k8s把容器抽象为pod来管理1到多个彼此间有非常紧密联系的容器,但是LAMP的容器主机A,M,P只是有关联,不能说是非常紧密联系,因此A,M,P都要运行在三个不同的pod上。

在k8s中,要运行几个pod,是需要定义一个配置文件,在这个配置文件里定义用哪个控制器启动和控制几个pod,在每个pod里要定义那几台容器,k8s通过这个配置文件,去创建一个控制器,由此控制器来管控这些pod,如果这些pod的某几个down掉后,控制器会通过健康监控功能,随时监控pod,发现pod异常后,根据定义的策略进行操作,即可以进行自愈。

k8s内部需要5套证书,手动创建或者自动生成,分别为,etcd内部通信需要一套ca和对应证书,etcd与外部通信也要有一套ca和对应证书。APIserver间通信需要一套证书,apiserver与node间通信需要一套证书,node和pod间通信需要一套ca

目前而言,还不能实现把所有的业务都迁到k8s上,如存储,因为这个是有状态应用,出现错误排查很麻烦,目前而且,k8s主要是运行无状态应用。

所以一般而言,负载均衡器运行在K8s之外,nginx或者tomcat这种无状态的应用运行于k8s集群内部而数据库,如mysql,zabbix,zoopkeeper,有状态的,一般运行于k8s外部,通过网络连接,实现k8s集群的pod调用这些外部的有状态应用。

k8s集群架构如下

k8s的master和node的详细架构如下

k8s的集群组件如下:

master: apiserver,scheduler,controller-manager,etcd

node:kubelet(agent),kube-proxy,docker(container engine)

Registry:harbor,属于集群外部的

Addons(附件):kube-dns,UI(如 dashboard)等等。在集群运行正常后,在集群上运行pod实现。

k8s部署集群整体环境架构

注意,下图的ip可根据实际环境调整

 

3  master主机

master 有三个最关键的组件,apiserver,scheduler,controller-manager,运行为三个守护进程:

apiserver:负责接入请求的入口,解析请求,处理请求,即网关,任何到达请求必须经过apiserver

 

scheduler:请求到达后,由scheduler计算后端node的相关资源,如cpu或者内存使用情况后,负责调度到合适的node,并启动pod,即选定某一节点后,有节点的kubelet负责节点上的操作如启动pod,即scheduler会先做预选,选择满足条件的node,然后再做优选,最合适的node,启动pod

 

controller-manager:控制器管理器,统一管控不同类型的资源,监控master上每个控制器的健康性,可以在每个master集群上做冗余高可用。其中,控制器用于确保已创建的容器处于健康状态。

controller:控制器,自动创建pod资源(容器启动),根据用户的需求启动和创建pod,可以在m个节点上运行n个容器,控制器根据label来识别pod。,使得pod能够按照指定的数量运行。

controller 通过 label selector  来关联 pod (lable),注意controller只是用来管理pod的健康性,不能进行pod流量导向,即管理pod,确保pod副本数量严格符合用户的定义。

每一组pod都需要独立的控制器来运行,实现跨节点自愈,管控pod的生命周期。控制器也是通过便签和便签选择器来实现感知自己管控组内的pod

在k8s环境中,推荐使用控制器管理的pod,控制器有如下几种:

ReplicationController。严格控制容器的副本数和滚动更新pod,在更新过程临时超出副本数。也支持滚动回滚操作。

RelicaSet:声明更新控制器

Deployment:负责无状态应用pod控制,支持二级控制器(HPA,HorizontalPodAutoscaler水平pod自动控制器)。

StatefulSet:负责有状态应用pod控制

DeamonSet:守护进程集,作用是在集群中每一个node上都启用一个pod副本,如果pod down了,DeamonSet会自动重启这个pod,如果新增node,会自动添加。即自动下载镜像,在这个node上启用这个pod。

Job,Ctonjob:周期性pod控制,如临时任务的job。

不同的控制器,满足客户不同类型的pod资源运行。

 

master 主机其他组件:

label  selector ;标签选择器,根据标签来选择符合条件的资源对象的机制,不仅仅用于pod资源,所有的对象都可以打上标签。k/v格式的数据。service和controller都是根据标签和标签控制器来识别pod资源。

 

etcd:分布式的高性能的键值存储的数据库系统,保存集群的对象状态信息,如apiserver对所有主机的操作结果,如创建pod,删除pod,调度pod的结果状态信息都保存在etcd中,如果这个插件异常,则整个集群运行都将异常,因为etcd异常后,整个集群的状态协议都将不能正常工作。因此etcd需要做高可用,防止单点故障。专门的组件,另外一个主机上安装的组件,建议至少三个节点,为restfull风格的集群。为https协议。

kubectl是和Kubernetes API交互的命令行程序。现在介绍一些核心概念。

 

master示意图如下

注意,API,UI,CLI都想API Server发送请求

集群

集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台。下图展示这样的集群。注意该图为了强调核心概念有所简化。这里可以看到一个典型的Kubernetes架构图。

 

上图可以看到如下组件,使用特别的图标表示Service和Label:
 

  • Pod
  • Container(容器)
  • Label()(标签)
  • Replication Controller(复制控制器)
  • Service()(服务)
  • Node(节点)
  • Kubernetes Master(Kubernetes主节点)

Pod

Pod(上图绿色方框)安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。你可能会有这些问题:

  • 如果Pod是短暂的,那么我怎么才能持久化容器数据使其能够跨重启而存在呢? 是的,Kubernetes支持的概念,因此可以使用持久化的卷类型。
  • 是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么?可以手动创建单个Pod,但是也可以使用Replication Controller使用Pod模板创建出多份拷贝,下文会详细介绍。
  • 如果Pod是短暂的,那么重启时IP地址可能会改变,那么怎么才能从前端容器正确可靠地指向后台容器呢?这时可以使用Service,下文会详细介绍。

Lable

正如图所示,一些Pod有Label(enter image description here)。一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用Label(tier=backend, app=myapp)标记后台Pod。然后可以使用Selectors选择带有特定Label的Pod,并且将Service或者Replication Controller应用到上面。

Replication Controller

是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么,能否将Pods划到逻辑组里?

 

Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,保持总数为3.如下面的动画所示:

 

如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动升级时很有用。

当创建Replication Controller时,需要指定两个东西:

Pod模板:用来创建Pod副本的模板

Label:Replication Controller需要监控的Pod的标签

现在已经创建了Pod的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是Service

Service

如果Pods是短暂的,那么重启时IP地址可能会改变,怎么才能从前端容器正确可靠地指向后台容器呢?

 

Service是定义一系列Pod以及访问这些Pod的策略的一层抽象。Service通过Label找到Pod组。因为Service是抽象的,所以在图表里通常看不到它们的存在,这也就让这一概念更难以理解。

现在,假定有2个后台Pod,并且定义后台Service的名称为‘backend-service’,lable选择器为(tier=backend, app=myapp)。backend-service 的Service会完成如下两件重要的事情:

●  会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。

●  现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下面的动画所示)。通过每个Node上运行的代理(kube-proxy)完成。这里有更多技术细节。

下述动画展示了Service的功能。注意该图作了很多简化。如果不进入网络配置,那么达到透明的负载均衡目标所涉及的底层网络和路由相对先进。如果有兴趣,这里有更深入的介绍。

 

Node

节点(上图橘色方框)是物理或者虚拟机器,作为Kubernetes worker,通常称为Minion。每个节点都运行如下Kubernetes关键组件:

Kubelet:是主节点代理。

Kube-proxy:Service使用其将链接路由到Pod,如上文所述。

Docker或Rocket:Kubernetes使用的容器技术来创建容器。

 

Kubernetes Master

集群拥有一个Kubernetes Master(紫色方框)。Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和复制Pod的Replication Controller。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值