一、需求背景
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,Kubernetes 提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。本人也有幸于今年考过了CKA,今天就给大家分享一下Kubernetes的一些基础,都是自己总结的,我现在只有CKS环境,后续可以给大家分享一下CKA环境搭建,Kubernetes 集群部署实战。 二、Kubernetes 的特性 (1)自动完成容器部署:构建于容器之上,比如docker,最新的CKS现在是contained,只要有基础资源,就能完成容器部署。 (2)自我恢复:容器出现异常后,容器会自动重启、Kubernetes集群重新调度容器。 (3)水平扩展:基础硬件资源、负载足够,可以进行水平扩展。 (4)负载均衡:实现内部负载均衡可以实现服务访问负载。 (5)回滚自由:可以实现不同版本的回滚,就像超融合加载补丁可以回滚一样。 (6)存储编排:支持多种不同类型的存储,包括本地存储、云存储、网络存储等,现在EDS也可以挂载存储给K8S使用。 (7)批量处理:除服务型应用,还支持批处理,就像结合windows写的批处理程序一样。 三、Kubernetes的组成部分 Kubernetes集群的话。可以部署两个节点,一个是master主节点,一个node节点工作节点。他们的主要组成部分和功能介绍如下 3.1 主节点(Master) Master是集群的控制节点,每个Kubernetes集群中至少需要一个Master节点来维护整个集群的管理和控制,几乎所有的控制命令都是发给它,它负责执行具体的动作。它很重要,如果它不可用,那么我们所有的控制命令都会失效。Master节点上运行一组关键进程:API Server API服务器(kube-apiserver):提供HTTP Rest接口的关键服务,是Kubernetes集群里所有资源的增删查改等操作的唯一入口,也是集群控制的入口进程。并提供认证、授权、访问控制、API注册和发现等机制Controller Manager控制管理器(kube-controller-manager):k8s里所有资源对象的自动化控制中心,可以理解为资源对象的“大总管”。运行着所有处理集群日常任务的控制器。包括节点控制器、副本控制器、端点控制器及服务账号和令牌控制器。负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。Scheduler调度器(kube-scheduler):负责资源调度(Pod调度)的进程,相当于“调度室”。按照预定的调度策略将Pod调度到相应的机器上etcd:集群的数据存储,他存储着集群中所有的资源对象。数据存储采用的是键值对存储。保存了整个集群的状态。 3.2 工作节点(Node/Worker) Node是集群的工作节点,运行具体的Pod,当某个Node宕机时,其工作负载会被Master自动转移到其他Node节点上。默认情况下kubelet会向Master注册自己。一旦Node被纳入集群管理,kubelet进程就会定时向Master节点汇报自身的情况,比如操作系统等信息,这样Master就可以获取每个Node节点的资源使用情况合理的进行调度。如果Node节点在指定时间不上报,那么Master就会认为它“失联”,标记成“Not Ready”状态。Node节点上运行一组关键进程:kubelet:主节点代理,负责Pod对应的容器的创建启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。kube-proxy:它负责节点的网络,在主机上维护网络规则并执行连接转发。它还负责对正在服务的pods进行负载平衡。比如一个服务可能会运行多个副本(Pod),由他来控制具体由哪个Pod提供服务。为Service提供cluster内部的服务发现和负载均衡。Docker Engine(docker):docker引擎,负责本机的容器创建和管理工作。 四、Kubernetes集群涉及常用基本概念和术语介绍 4.1 Pod Pod 是一组紧密关联的容器集合, 它们共享 PID、 IPC、 Network 和 UTS namespace,是 Kubernetes 调度的基本单位。 Pod 内的多个容器共享网络和文件系统, 可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。 pod分两种:普通pod和静态pod(static pod, 普通pod:一旦被创建,会被放到etcd中存储,随后被Kubernetes master调度到某个具体的node上并进行绑定,随后该pod被对应的node上的kubelet进程实例化成一组相关的docker容器并启动起来。默认情况下,当pod中的某个容器停止时, Kubernetes会自动检测到这个问题并重新启动这个pod(重启pod里面的所有容器),如果pod所在的node宕机,则会将这个node上的所有pod重新调度到其他节点上。静态pod:不存储在etcd中,而是存放在某个具体的node上的一个具体文件中,并只在此node上启动运行。 4.2 pod的生命周期 (1)Pending。这个状态意味着,Pod 的 YAML 文件(或通过kubectl命令创建Pod)已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功。 (2)Running。这个状态下,Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至少有一个正在运行中。 (3)Succeeded。这个状态意味着,Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最为常见。 (4)Failed。这个状态下,Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。这个状态的出现,意味着你得想办法 Debug 这个容器的应用,比如查看 Pod 的 Events 和日志。 (5)Unknown。这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。 4.2 Label Lable是一个key-value键值对,由用户自己制定。可以附加在各种资源上,比如node 、pod、svc、rc等,一个对象资源可以定义任意数量的Lable,同时一个lable也可以被添加到任意数量的资源对象上去,Lable可以在资源对象定义时确定,也可以在对象创建后动态添加和删除。我们可以使用指定的资源对象绑定一个或者多个不同的lable来实现多维度的资源分组管理功能,以便于灵活、方便的对资源进行分配、调度、配置、部署等工作。Lable就是给资源对象打一个标签,然后通过Label Secletor(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SQL的简单和通用的对象查询机制。 4.3 Deployment Deployment部署是一个比RS(Replica Set)应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。以Kubernetes的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。 4.4 Volume Kubernetes集群中的存储卷跟Docker的存储卷有些类似,只不过Docker的存储卷作用范围为一个容器,而Kubernetes的存储卷的生命周期和作用范围是一个Pod。每个Pod中声明的存储卷由Pod中的所有容器共享。Kubernetes支持非常多的存储卷类型,特别的,支持多种公有云平台的存储,包括AWS,Google和Azure云;支持多种分布式存储包括GlusterFS和Ceph;也支持较容易使用的主机本地目录hostPath和NFS。Kubernetes还支持使用Persistent Volume Claim即PVC这种逻辑存储,使用这种存储,使得存储的使用者可以忽略后台的实际存储技术(例如AWS,Google或GlusterFS和Ceph),而将有关存储实际技术的配置交给存储管理员通过Persistent Volume来配置。Persistent Volume,PV(持久存储卷)和 Persistent Volume Claim,PVC(持久存储卷声明):PV和PVC使得Kubernetes集群具备了存储的逻辑抽象能力,使得在配置Pod的逻辑里可以忽略对实际后台存储技术的配置,而把这项配置的工作交给PV的配置者,即集群的管理者。存储的PV和PVC的这种关系,跟计算的Node和Pod的关系是非常类似的;PV和Node是资源的提供者,根据集群的基础设施变化而变化,由Kubernetes集群管理员配置;而PVC和Pod是资源的使用者,根据业务服务的需求变化而变化,由Kubernetes集群的使用者即服务的管理员来配置。 4.5 NameSpace 命名空间用于实现多租户的资源隔离。Namespace通过将集群内部的资源对象分配到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。命名空间为K8s集群提供虚拟的隔离作用,Kubernetes集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以创建新的名字空间满足需要。 五、Kubernetes使用工具kubectl kubectl是Kubernetes客户端CLI工具,可以让用户通过命令行的方式对Kubernetes集群进行操作。kubectl命令行语法:kubectl [command] [TYPE] [NAME] {flags}command:子命令,用于操作Kubernetes集群的资源对象的命令,例如create、delete、describe、get、apply等。TYPE: 资源对象的类型,区分大小写,能以单数、复数或者简写形式表示。比如Pod可以使用pod、pods、pdNAME:资源对象的名称,区分大小写,如果不指定名称,则系统返回属于TYPE的全部对象列表,比如kubectl getpods将返回所有Pod的列表Flags:kubectl子命令的可选参数,例如使用“-s”指定apiserver的URL地址而不用默认值。 六、总结 今天给大家总结了Kubernetes一些常用的基础知识,可以有一个大概了解。 |