K8s简介
Kubernetes是一个全新的基于容器技术的分布式架构领先方案,Kubernetes(k8s)是Google开源的容器集群管理系统。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性
K8s特性
-
自动装箱
基于资源依赖及其约束能够自动完成容器的部署且不影响 -
自我修复
一旦容器崩了,可以自动启动一个新的容器替代从而实现自我修复 -
自动实现水平扩展
一个容器不够,再启动一个,可以不断的进行扩展,只要物理平台的资源足够支撑 -
自动进行服务发现和负载均衡
-
自动发布和回滚
-
密钥和配置管理
- 容器化应用程序的最大问题在于我们配置容器内的应用程序比较困难。基于镜像启动一个容器后,如果期望容器中的应用程序换一个配置该怎么办呢?如果我们定义一个entrypoint的脚本,而这个脚本可以接受用户传入的变量参数,把变量的值转换为容器内的应用程序可读取的配置,从而能完成容器化应用程序的配置
- 之所以这么麻烦是因为早期的应用程序不是面向云原生而开发的,所以那些应用程序要通过读取配置文件来获取配置,而云原生开发的应用程序可以基于环境变量来获取配置
- 这种配置方式使得一个镜像能满足用户在不同环境下运行同一个镜像为不同配置的容器的需求
- 但是在编排工具当中,这种配置方式会存在一些问题,比如配置信息保存到哪里?如果我们用编非平台让容器启动自动化了,但每次启动容器时我们还要手工去传递环境变量的值,这是一个很麻烦的事,所以我们需要一个外部的组件保存这些配置信息于外部,当镜像启动为容器时,只需要让镜像去加载外部的配置中心中的配置信息,就能完成应用程序的配置
-
存储编排
把存储卷实现动态供给,当容器需要存储卷时,根据容器自身的需求创建能够满足其需要的存储卷
-
任务批量处理运行
K8s架构
K8s集群架构
k8s就是一个组合多台主机的资源整合成一个大的资源地,并统一对外进行计算、存储等能力的集群
masters
k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成
- kube-apiserver (负责接受并处理请求)
kube-apiserver用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。请参阅构建高可用群集。 - ETCD(调度容器创建的请求)
etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。 - kube-controller-manager(确保后端节点上的控制器处于健康状态)
kube-controller-manager运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。这些控制器包括:
1、节点(Node)控制器
2、副本(Replication)控制器:负责维护系统中每个副本中的pod
3、端点(Endpoins)控制器:填充Endpoints对象(即连接Seevices&pod)
4、Service Account和Token控制器:为新的Namespace创建默认账户访问API Token - kube-scheduler (调度容器创建的请求)
kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node
nodes
-
Kubelet (与master通信的集群代理)
kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:
1、安装Pod所需的volume。
2、下载Pod的Secrets。
3、Pod中运行的 docker(或experimentally,rkt)容器。
4、定期执行容器健康检查。
5、通过创建一个 Pod(如果需要的话),向系统的其余部分报告 Pod 的状态。
6、向系统的其他部分报告节点的状态。 -
容器引擎(docker)
k8s专业术语
pod
- K8s的最小调度逻辑单元
- pod可以理解为是容器的外壳,它为容器做了一层抽象的封装
- pod内部主要是用来放容器的
- pod的特点是可以将多个容器加入到同一个网络名称空间中
- 一个pod中可以包含多个容器同一个pod中的不同容器可以共享存储卷
- 一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某node上运行时,这一个pod内的所有容器只能运行在同一个node上
node
- node是k8s集群中的工作节点,负责运行由master指派的各种任务。而最核心的任务就是以pod形式运行容器
- node可以是任何形式的计算设备,只要此设备上能够有传统意义上的CPU、内存、存储空间,并且能装上k8s的集群代理程序,它都可以作为整个k8s集群一个成员
标签选择器
- 当大量的pod运行在一个集群当中时,如何实现分类管理?比如想删除某一类pod,比如想让控制器去管理一部分pod,它怎么进行管理?如何挑选、检测出来这些pod呢?值得肯定的是,这么多的pod,我们不能通过pod的名称来识别容器,因为pod随时都会被创建和删除,当一个pod发生故障被删除后,重新生成的pod的名称与被删除的pod名称肯定是不一样的,只不过其内部运行的程序是一样的,所以我们不能靠pod的名称来识别。同时我们有可能要将一类pod归组,比如创建4个nginx的pod,期望使用一个控制器对其进行统一管理,删除一个控制器就把这4个pod都删了,控制器还要保证这4个pod都处于运行状态,缺—个要补一个,多一个要多杀一个,精确符合我们期望的4个pod才行
- 为了能够实现pod识别,需要在pod之上附加一些元数据,类似dockerfile中的label标签的方式,比如在创建pod时为其附加—个名为app的key,然后将其值设为nginx,那么当我们在批量进行pod调度管理时,可以检查pod中是否有app这个key,且其佶具不头nainv通业种方十立
- 为了能够实现pod识别,需要在pod之.上附加一些元数据,类似dockerfile中的label标签的方式,比如在创建pod时为其附加一个名为app的key,然后将其值设为nginx,那么当我们在批量进行pod调度管理时,可以检查pod中是否有app这个key,且其值是否为nginx,通过此种方法来识别pod是否是我们想要控制的pod
- 标签是在k8s上管理大规模pod资源并且能够分类识别和管理的一个非常重要的途径
- 那么怎么从众多的pod中筛选出我们想要的pod呢?通过标签选择器组件我们可以实现这个功能
- 标签选择器就是一种根据标签来过滤符合条件的资源对象的机制