1 Kubernetes简介及原理
1.1 什么是Kubernetes?
1.2 k8s的优点
1. 具有完备的集群管理能力
2. 提供了完善的管理工具,涵盖了开发,部署,测试及运维等各个环节
3. 对现有的编程语言、框架及中间件没有任何的侵入性,故易于迁移至k8s平台
4. 自动化容器的部署和复制
5. 高可用、容器自愈等等
1.3 使用k8s的好处
1. 大幅节省开发及维护成本
2. 可以将精力更加集中于业务本身
3. 解决了服务扩容与服务升级的问题
1.4 k8s的架构图
1.5 Kubernetes中的核心概念:
Service(2.6节介绍)、Label(2.4节介绍)、RC(2.5节介绍)
2 Kubernetes的基本概念及术语
2.1 Master
Master节点在Kubernetes中负责整个集群的管理和控制,接收和运行所有基本命令
在Master上运行的进程:
(1) 提供HTTP Rest接口的关键服务进程,是k8s中所有资源增删改查操作的唯一入口
(2) 管理所有资源对象的进程
(3) 资源调度的进程(Pod调度)
2.2 Node
Node是k8s中真正的工作负载节点,(通过docker工作) 当某个Node宕机时,,其上的工作会被Master调度到其他节点上面
在Node上运行的关键进程:
(1) kubelet 负责Pod对应容器的创建,启停,同时与Master密切合作,实现集群管理的基本功能
(2) kube-proxy 实现kube Service的通信与负载均衡机制的组件
(3) Docker Engine Docker引擎,负责本机的容器创建与管理
Node节点可以在运行期间动态注册到Kubernetes里面,默认方式是kubelet向Master注册自己,当Node被纳入集群管理范围,kubelet就会定时向Master汇报自身情况。若指定时间没有汇报情况,则会被Master判断为失联,Node状态会被变为不可用,之后会被Master进行工作迁移。
2.3 Pod
Pod是Kubernetes中最基本也是最重要的概念。Pod分为普通Pod与静态Pod。
普通Pod:创建之后,被放到etcd中,之后被Master调度到Node节点上。
静态Pod:存放在Node节点上的某个具体文件中,并且只在此Node节点上运行。静态Pod不关联任何RC,是由kubelet来进行监控。
一个Pod包括一个Pause的"根容器",和若干个与工作相关的容器。
Pause容器在创建Pod时在自动创建,作用:1. 代表整个Pod的状态 2.工作容器共享Pause的IP,和Pause容器挂载的Volume卷。
kubernetes的Service通过Label进行批量管理,与Node无关,举个例子:A公司下有一个小组在做k8s,这个组里面可能包含A的外包公司B,C,D的员工,但是他们都是为这个组服务的,这里面公司就类似Node,员工是Pod,这个工作组相当于Label。
2.4 Label
Label容器是kubernetes中的核心概念之一。一个label是通过key=value的键值对组成,key、value都由用户自己指定,Label可以被附加到任何资源上,比如Node,Pod,Service,RC等等,一个Label可以给对象创建多组标签,也可以给多个对象创建一个标签。
Label Selector是类似SQL中where语句的作用。可以查询出指定的label来进行控制操作。
Label与Label Selector共同构成了kubernetes最核心的应用模型,使得被管理的对象能被精细地分组管理,同时实现了整个集群的高可用性。
2.5 Replication Controller(RC)
Replication Controller(RC)是Kubernetes中的另一个核心概念,应用托管在Kubernetes之后,Kubernetes需要保证应用能够持续运行,这是RC的工作内容,它会确保任何时间Kubernetes中都有指定数量的Pod在运行。在此基础上,RC还提供了一些更高级的特性,比如滚动升级、升级回滚等。
RC通过Label与Pod进行关联。
RC的一些特性及作用:
(1) 定义一个RC实现Pod的创建过程及副本数量的自动控制
(2) RC里面包括完整的Pod定义模板
(3) RC通过Label Selector实现对Pod副本的自动控制
(4) 通过RC里的Pod副本数量,可以实现Pod的扩缩容功能 或命令: kubectl scale rc (Label) --replicas=(数量)
(5) 通过RC的Pod模板的镜像版本,可以实现Pod的滚动升级功能
(6) 删除RC不会影响到该RC已经创建好的Pod
滚动升级:比如旧版本有5个容器,先停止一个,启一个新版本容器,再将第二个停止,启动第二个新容器,直到5个旧版本容器全部停止并且启动5个新版本容器为止,滚动升级期间不影响正常工作。
2.6 Service
Service是kubernetes中最核心的资源对象之一,一个Service即一个"微服务",Pod、RC等资源都是为Service服务的
下面上一张关系图
Service定义了一个服务的访问入口,前端应用通过这个入口去访问后端工作的Pod。Service通过Label Selector来连接Pod,而RC的作用是保证Service的服务能力以及服务质量始终处于预期标准。
2.6.1 如何从外部访问Service
Service的Cluster ip是虚拟构造的IP,属于集群内部的ip,无法在外部直接使用这个地址。解决办法:
在Service的配置文件中定义出NodePort来绑定Node的端口,通过端口访问
例子:
(只写包含配置文件)
apiVersion:v1
kind:Service
ports:
-port:8080
nodePort:31000
这样就可以通过Nodeip的31000来访问Service。但是假设Service集群中有10个Node,那么我们需要加一个负载均衡器来解决。(请求过来后,通过算法来决定转发到哪个Node的Port上面)
2.7 Volume
Volume是Pod中能够被多个容器访问的共享目录,定义在Pod上,然后被被多个容器挂载在容器具体文件中。volume的生命周期与Pod相同,与容器无关。
2.8 Deployment
是Kubernetes1.2中新引入的概念,可以看作RC的升级版,Deployment与RC的最大不同是可以显示当前Pod部署进度。
2.9 Persistent Volume(PV)
PV是kubernetes集群中的某个网络存储中对应的一块存储。属于kubernetes集群,并不属于某个Pod,可在每个Pod上访问
某个Pod想要申请PV的话,需要先定义一个PersistentVolumeClaim(PVC)
PV的accessModes属性:
(1) ReadWriteOnce 读写权限,只能被单个Node挂载
(2) ReadOnlyMany 只读权限,允许被多个Node挂载
(3) ReadWriteMany 读写权限,允许被多个Node挂载
PV的状态:
(1)空闲状态 Available
(2)已经绑定到某个PVC上 Bound
(3)对应的PVC已经删除,但是资源还没有被集群收回 Released
(4)PV自动回收失败 Faild
2.10 NameSpace(命名空间)
NameSpace在很多情况下用于实现多租户的资源隔离,通过将集群内部资源对象"分配"到不同的NameSpace中,形成逻辑上分组的不同项目,小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
NameSpace的定义:
使用一个yaml文件定义,例如定义一个名为development的命名空间:
apiVersion:v1
kind:NameSpace
metadata:
name:development
注:
参考资料:Kubenetes权威指南及CSDN的博客
此文仅作为笔记供本人总结使用,有不正确的地方还请大牛们多指正。