Kubernetes
k8s是什么
- k8s是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化。
- Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
- K8S用于容器化应用程序的部署,扩展和管理。
- K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
- Kubernetes目标是让部署容器化应用简单高效。
- 官方网站:https://kubernetes.io/
- 一个容器平台
- 一个微服务平台
- 便携式的平台
Kubernetes集群架构
一个简单架构图,不含dashboard,只有一个master(主控节点)和两个node(工作节点)
master组件
master本身是不做任何事情的,只提供一些调度等做用,负责管理Node, 控制Node 具体运行什么容器, 同时还承担外部数据访问的角色
master分为三个组件:
- API server:提供认证,授权,访问控制,API注册,发现等机制
- controller-manager:做集群中后台的统一的管理,处理集群中常规的任务,比如:故障检测、自动扩展、滚动更新。
- scheduler:选择合适的node节点来部署,起到节点调度的作用。
- etcd:算不上是组件,算是一个数据库,用来存储集群当中各种的资源,可以部署在任何能够访问到的地方
node
node分为两个组件:
- kubelet:master派到node节点的代表,管理本机容器的各种操作
- kube-proxy:实现Pod的网络代理,用来做服务发现、负载均衡。
- Docker Engin:docker引擎, 负责Node于和容器有关的操作, K8S原生支持Docker作为容器引擎, 如果要使用其他容器引擎则需要使用对应接口集成
- Pod:K8S不是直接运行的容器,而是操作Pod, 把Pod作为原子单元管理,一个Pod里面可能会运行多个容器, Pod里面运行的多个容器被捆绑在一起被统一调度不可分割. 一个Pod的所有容器只能同时运行在一个Node 上
Kubernetes优势
- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡
Kubernetes的特性
Kubernetes的特性主要有以下几种:
- 自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。 - 弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。 - 自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。 - 服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。 - 机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。 - 存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。 - 批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
K8s专业术语
pod
- 运行于Node节点上,若干相关容器的组合。
- K8s的最小调度逻辑单元
- pod可以理解为是容器的外壳,它为容器做了一层抽象的封装
- Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。
- 一个Pod可以包含一个容器或者多个相关容器。同一个pod中的不同容器可以共享存储卷
- 一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某node上运行时,这一个pod内的所有容器只能运行在同一个node上
可能还是不是挺明白,我举个例子:经常有人把pod比作豌豆荚,容器就是豌豆荚里的豌豆,那么豌豆有可能是一个,也有可能是多个,为什么不直接使用容器呢,而是用pod来封装一个或多个容器呢
我这里举个例子,如果有一套lnmp架构的系统,一般不会运行在一个容器中,而是在多个容器中,但是这样他们之间的相互连接就变得十分困难,而pod提供了共享网络和存储,所以他们可以通过localhost进行内部的通信,虽然网络和存储是共享的,但是cpu和内存就不是,也是就说我们可以单独对pod中的容器做资源使用的限制
node
- Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。
- Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。
- node可以是任何形式的计算设备,只要此设备上能够有传统意义上的CPU、内存、存储空间,并且能装上k8s的集群代理程序,它都可以作为整个k8s集群一个成员
- 只要能装上kunelet就能成为一个节点
标签
- 标签是附加到容器,复制控制器和服务的键值,标签也是k8s特色的管理方式,便于分类管理资源对象
- 一个Label是 一个key=value的键值对,其中key与value由用户自己指定。
- key:只能使用 字母 数字 _ - . (只能以字母数字开头,不能超过63给字符)
- value: 可以为空 只能使用 字母 数字开头
- 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
- 一个资源拥有多个标签,可以实现不同维度的管理。
- 可以使用标签选择器来指定能使用哪些标签。
标签选择器
- 标签选择器是Kubernetes中的核心分组原语。用户使用它们来选择一组对象。
- 标签选择器就是一种根据标签来过滤符合条件的资源对象的机制
- 用来控制pod
分别的作用
pod=调度和管理的最小单位,逻辑单元
node=是工作的,运行容器,运行Pod的服务节点的
标签=无非就是给他打个标签,便于分类管理资源
标签选择器=控制pod,根据标签来过滤符合条件的对象进行删除,停止