1 k8s介绍
谷歌在2014年开放了Kubernetes项目。Kubernetes建立在谷歌大规模运行生产工作量的十五年经验基础上,结合了社区中最佳的创意和实践。
kubernets是Google开源的容器集群管理系统。是一个可移植、可扩展的自动化容器管理的开源平台。主要用于管理容器化工作负载和服务,有助于声明性配置和自动化。 它拥有庞大,快速发展的生态系统。
在Docker技术的基础上,k8s为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes 特点有:
可移植:支持公有云,私有云,混合云;
可扩展:模块化,热插拨,可组合;
自愈:自动替换,自动重启,自动复制,自动扩展。
更详细介绍请参考:https://www.cnblogs.com/xhyan/p/6656062.html
https://jimmysong.io/kubernetes-handbook/concepts/
2 k8s架构
Kubectl是控制k8s的一个命令,假如说我们要使用kubectl创建一组容器,使用kubectl敲一条命令,首先这个请求会发送给APIserver,告诉它说我要创建一组容器,容器副本数是3份,其实我们创建的就是pod,先理解为容器;
此时,schedule就来了,它听说有人要创建容器,首先它会看有哪些node,选一个node做调度,找到了一个node是空闲的,就提示往这个node创建;然后我们的apiserver就通知kubelet,kubelet是代理,装在node上,这时kubelet就开始帮我创建了这个容器;
Controller manager有一个rep controller(复制控制器),听说这个容器有3个副本,要创建3个一模一样的,我就在整个集群当中看看是不是有3个,如果不是3个,我就给改成3个。最后所有的数据存储到etcd中。Kube-Proxy做负载均衡,比如有3个nginx需要负载均衡,就由kube-proxy做负载均衡。
kubernets架构和组件:
3 k8s基本功能
它可以实现容器部署、调度和集群节点之间扩展等操作。docker可以看成是kubernets内部使用的低级别插件,还支持rocket,这是另一种容器技术
① 自动化容器的部署和复制
② 随时扩展和收缩容器的规模
③ 将容器组织成组,并提供容器间的负载均衡
④ 很容易并快速的升级应用程序容器的新版本
⑤ 提供容器弹性,如果容器失效就替换它,等等
4 核心组件介绍
kubernetes组件由两类节点组成,分别为master和node。
其中master组件是控制整个集群大脑,它包括apiserver、scheduler、controller manager、etcd组件。apiserver为外部控制集群提供了REST API,并提供了安全机制;etcd是k8s记录各种资源的唯一数据库,只有api server能够直接访问;controller manager用来管理controller,保证了每种资源的正常工作;schedula是用来调度pod 到具体的节点。
node节点包含了3个组件,分别为kubelete和kubeproxy和docker,kubelete是pod管家,管理着pod的生命周期,与此同时与api server保持联系,实时上报pod的数据;kubeproxy组件实现了 service的抽象,使应用能够被访问。docker为Node上需要运行容器服务。
4.1 master
Master节点是集群的大脑,是集群逻辑上的控制中心。Master组件起到控制整个集群的作用。 Master组件做出关于群集的全局决策(例如调度),以及检测和响应群集事件(当rc控制器的’副本’字段不满足时启动新的pod)。
4.11 api server
- 供Kubernetes API接口,主要处理 REST操作以及更新ETCD中的对象
- 所有资源增删改查的唯一入口。
api server是唯一可以操作etcd 数据库的组件,并提供了认证、授权等机制。它严格遵守了REST规范,去操作这些资源,具有CRUD特性。它是Kubernetes控制的前端工程,它能够水平扩展,可以通过部署多个实例来达到高可用的目的。
api server 为k8s提供各类资源对象(pod,rc,service等)的增删改查及watch等https rest接口,是整个系统的数据总线和数据中心。主要功能性表现:
1、提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
2、提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd);
3、是资源配额控制的入口;
4、拥有完备的集群安全机制.
4.12 scheduler
资源调度,负责pod到node的调度
scheduler调度器是k8s中唯一一个以plugin形式存在的的模块。k8s的基础单元pod的部署就是通过scheduler完成的
4.13 etcd
etcd记录系统状态、存储状态的数据库;所有持久化的状态信息以KV的形式存储在ETCD中,类似zookeeper,提供分布式协调服务,支持集群
4.14 controller manager
controller manage,资源对象的自动化控制中心,既集群内部管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
4.2 node
Node是K8s集群中真正的工作负载节点,K8s集群由多个Node共同承担工作负载,pod被分配到某个具体的node上执行。k8s通过node controller对node资源进行管理。支持动态在集群中添加或删除node。
4.21 kubelet
管理pods以及容器、镜像、volume等,实现对集群对节点的管理。
kubelet对每个node节点运行的容器进行生命周期的管理。主要功能就是定时获取pod/container的期望状态:运行什么容器、运行副本数量、网络或存储如何配置等,并调用对应的容器平台接口达到这个状态。
4.22 kube-proxy
kubeproxy : 提供网络代理以及负载均衡,实现与service通信。Service抽象概念的实现,将到service的请求按策略(负载均衡算法分发到后端的pod )上,默认使用iptables mode实现;支持nodeport模式,实现从外部访问集群内的service。
kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。在Kubernetes集群中Kube-Proxy组件充当负载均衡的功能,默认使用iptables,生产环境建议使用ipvs进行负载均衡。
4.23 docker engine
负责节点的容器的管理工作;我们在所有的node节点上还要跑一个docker,就像openstack上的Nova computer做虚拟机的管理, 真正创建虚拟机的是KVM。
4.3 pod(资源池)
pod是所有业务类型的基础单元、它是一个或多个容器的组合。是k8s在容器上的一层封装。这些容器共享存储、网络和命名空间,以及如何运行的规范。
Kubernetes为每个Pod都分配了唯一的IP地址,称之为PodIP,一个Pod里的多个容器共享PodIP地址。要求底层网络支持集群内任意两个Pod之间的直接通信,通常采用虚拟二层网络技术来实现(Flannel)。
4.4 service(微服务)
kubernetes中的核心。通过分析、识别并建模系统中的所有服务为微服务,最终系统有多个提供不同业务能力而又彼此独立的微服务单元所组成,服务之间通过TCP/IP进行通信。每个Pod都会被分配一个单独的IP地址,而且每个Pod都提供了一个独立的Endpoint以被客户端访问。
Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同Label的Pod,用户不需要了解后台Pod是如何运行。外部系统访问Service的问题。
首先需要弄明白Kubernetes的三种IP这个问题
Node IP:Node节点的IP地址
Pod IP: Pod的IP地址
Cluster IP:Service的IP地址
Node IP是Kubernetes集群中节点的物理网卡IP地址,所有属于这个网络的服务器之间都能通过这个网络直接通信。这也表明Kubernetes集群之外的节点访问Kubernetes集群之内的某个节点或者TCP/IP服务的时候,必须通过Node IP进行通信
Pod IP是每个Pod的IP地址,他是Docker Engine根据docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络。
Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点:
① Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址
② Cluster IP无法被ping,他没有一个“实体网络对象”来响应
③ Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
Kubernetes集群之内,Node IP网、Pod IP网于Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式的特殊路由规则。
4.5 label(标签)
Label是一个 key=value的键值对,由用户指定,可以附加到 K8S资源之上。 给某个资源定义一个标签,随后可以通过label进行查询和筛选 ,类似SQL的where语句。
Label可以给对象创建多组标签。
4.6 RC(复制控制器)
RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。 指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。 即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。
Replication Controller声明某个Pod的副本数在任意时刻都符合某个预期值。定义包含如下:
(1)Pod期待的副本数(replicas)
(2)用于筛选目标Pod的Label Selector
(3)当Pod副本数小于期望时,用于新的创建Pod的模板template
(4)通过改变RC里的Pod副本数量,可以实现Pod的扩容或缩容功能
(5)通过改变RC里Pod模板中的镜像版本,可以实现Pod的滚动升级功能