1、定义:是一种开源的容器集群管理系统,在docker 容器技术的基础之上,为容器化的集群提供部署、运行、资源调度、服务发现、动态伸缩等一系列完整的功能的大规模容器管理
2、功能
(1)对docker的容器技术应用的包,部署、运行、停止、销毁,全生命周期管理
(2)集群方式运行,跨机器的容器管理
(3)解决docker的跨机器运行的网络问题
(4)k8s可以自动修复,使得整个容器集群可以在用户期待的状态下运行
3、作用:自动部署、自动扩展和管理容器化部署的应用程序
负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。以分布式和容器化的方式进行容器管理
4、常用版本:K8s 1.20(支持容器,1.23版本后不再支持容器)
5、k8s以google的borg系统作为原型,后期经由go语言编写的开源软件
官网:Kubernetes
源码包:https://github.com/kubernetes/kubernetes
6、传统部署、容器部署、k8s部署的区别
(1)传统部署方式:一般意义上的二进制部署,安装、运行、运行维护需要专业人员,若出现故障,需要人工重新拉起来,若业务量增大,只能水平拓展,再部署一台
(2)容器化部署:用dockerfile方式,编写好自定义容器,基于镜像,随时都可以运行。数量少,还可以管理,数量一旦增多,管理复杂,而且docker一般是单机运行,没有高可用
(3)k8s部署:简单、高效的部署容器化的应用
①可以解决docker单机部署和无法集群化的问题
②可以解决随着容器数量的增加,对应增加的管理成本的问题
③可以解决容器的高可用问题,提供一种容器的自愈机制
④可以解决容器没有预设模板,以及无法快速、大规模部署,以及大规模容器调度的问题
⑤提供集中化配置管理的中心
⑥可以解决容器生命周期的管理工具的问题
⑦提供图形化工具对容器进行管理
7、k8s特性
(1)弹性伸缩:基于命令或图形化界面基于CPU的使用情况,自动对部署的程序进行扩容和缩容,以最小成本运行服务
(2)自我修复:出现节点故障时,自动重新启动失败的容器,也可以手动替换和重新部署
(3)服务发现和负载均衡:k8s为多个容器提供一个统一的访问入口(内部地址,需要暴露才能访问。和内部的DNS名称),自动负载均衡关联的所有容器
nginx-1 | 10.244.0.10:3000 | DNS服务名称:nginx |
nginx-2 | ||
nginx-3 |
(4)自动发布和回滚:k8s采用滚动的策略更新应用,若更新过程中出现问题,可以根据回滚点进行回滚到上一个老版本
nginx-1 | 先更新1 | 最新版本 |
nginx-2 | 再更新2 | 1和2若有问题,自动回滚到上一个版本 |
nginx-3 | 老版本 |
(5)集中化的配置管理和密钥管理:k8s集群内的各个组件都需要进行密钥对验证,但k8s的安全性不高,核心组件不建议部署在k8s上,适合部署一些自定义应用
(6)存储编排
①可以自动化的把容器部署在节点上
②可以通过命令行或者yml文件(自定义pod)实现指定节点部署
③可以通过网络存储、NFS、GFS实现指定节点部署
(7)批次处理任务:提供一次性任务、定时任务,满足需要批量处理和分析的场景
8、master组件(核心组件)【重要】
(1)kube-apiserver—所有请求的入口服务:k8s集群中每个组件都靠密钥对进行验证,组件之间通信靠kube-apiserver
API是应用接口服务,在k8s的所有资源请求和调用操作都是通过kube-apiserver来完成。所有对象资源的增删改查和监听操作,都是kube-apiserver处理完后交给etcd来存储。apiserver接收k8s的所有请求(命令行和图形化界面的操作),然后根据用户的具体请求通知对应的组件,展示或运行命令。apiserver相当于整个集群的大脑
(2)kube-controller-manger:运行管理控制器,k8s集群中处理常规任务的后台线程,是集群中所有资源对象的自动化控制中心,一个资源对应一个控制器,kube-controller-manger负责管理所有控制器
控制器 | ||
node controller节点控制器 | 负责节点的发现,以及节点故障的发现和响应 | |
replication controller副本控制器 | 控制关联pod的副本数,可以随时扩、缩容(手动、自动) | |
endpoints controller端点控制器 | 监听service和对应pod的副本变化端点就是服务暴露出的访问点,要访问这个服务必须要知道endpoint,就是内部每个服务的IP地址+端口 | |
service account和 roken controllers服务账户和令牌控制 | 为命名空间创建默认账户和API访问令牌。访问不同的命名空间 | |
resourcequota controller资源控制器 | 可以对命名空间的资源使用进行控制,也可以对pod的资源进行控制 | |
namespace controller命名空间控制器 | 管理命名空间的生命周期 | |
service controller服务节点控制器 | k8s集群和外部的主机之间的接口控制器。控制集群的IP | |
(3)kube-scheduler:资源调度组件,根据调度算法为新创建的pod选择一个合适的node节点。可理解为k8s所有node节点的调度器,部署和调度node
策略 | |
预先策略 | 人工定制,指定node节点部署 |
优先策略 | 限制条件,根据调度算法先择合适node 怎么选择合适node呢?根据node节点的资源情况、选择一个资源最富裕、负载最小的节点来部署 |
(4)etcd:k8s的存储服务,etcd分布键值存储系统,存储k8s的关键配置和用户配置。先通过apiserver调用etcd中的存储信息,然后再实施(在整个集群中,能对etcd存储进行读写权限的只有apiserver)
9、node组件
(1)kubelet:node节点的监视器与master节点的通信器。可理解为master在node节点上的眼线
作用:
①kubelet会定时向apiserver汇报自己的node上的运行服务的状态,apiserver会把节点状态保存在etcd存储中
②接受来自master节点的调度命令。若发现自己的状态和master节点的状态不一致,会调用docker的接口同步数据
③对节点上容器的生命周期进行管理,保证节点上的镜像不会占满磁盘空间,对退出的容器资源进行回收
(2)kube-proxy:实现每个node节点上pod的网络代理,负责节点上的网络规划和四层的负载均衡工作,负责写入iptables(快淘汰)和ipvs实现服务映射。kube-proxy本身不直接给pod提供网络代理,proxy只是service资源的载体,proxy实际上代理的是pod的集群网络(虚拟网络)(proxy代理的是service地址,service地址是所有pod对外提供的一个统一的IP地址)
注:pod不是容器
在k8s中不直接和容器打交道,真正和容器打交道的是pod
http-dn1是基于deployment创建的资源对象,既不是pod名称,也不是容器名称
80:30394是容器和主机之间的映射
(3)docker:容器引擎,运行容器,负责本机的容器创建和管理
k8s创建pod上,kube-scheduler调度到node节点上,节点上的kubelet指示docker启动特定的容器,kubelet把容器的信息收集、发送到主节点。在主节点发布指令,节点上的kubelet就会指示docker对容器进行拉取、启动、停止容器
pod:运行在节点上的,k8s中创建、部署最小、最简单的基本单位,一个pod代表正在集群上运行的一个进程。同一个pod内的每个容器就是一颗豌豆
pod由一个或多个容器组成,pod中的容器共享网络、存储和计算资源,可以部署在不同的docker主机上
一个pod里面可以运行多个容器,也可以是一个容器,在生产环境中,一般都是单个容器或者有关联关系的多个容器组成一个pod
deployment | 无状态应用部署,管理和控制pod以及replicaset(运行几个容器),管控其运行状态 |
replicaset | 保证pod的副本数量,受控于deployment |
在k8s中,部署服务实际上就是pod,deployment部署的服务就是pod,replicaset就是定义pod的容器数量,可以保证pod在当前命名空间中不可重复,不同命名空间可以重复,官方推荐使用deployment进行服务部署 | |
daemonset | 确保所有节点运行同一类的pod |
statefulset | 有状态应用部署(很少用) |
job | 可以在pod中设置一次性任务,运行完即退出 |
cronjob | 一直在运行的周期性任务 |
10、service★★★
(1)作用:在k8s整个集群中,每创建一个pod都会为其中运行的容器分配一个集群内的IP地址,由于业务变更,容器数量可能会发生变化,容器的IP地址也会随之变化,不便于管理,service提供整个pod对外统一的IP地址。可理解为service是一个网关(路由器),通过访问service可以访问pod内部的容器集群
service能实现负载均衡和代理,核心载体是kube-proxy来实现负载均衡,service是k8s微服务的核心,屏蔽服务的细节,统一的对外暴露端口,真正实现“微服务”
(2)service的流量调度
①userspace(用户空间。淘汰)
②iptables(即将废弃)
③ipvs(目前1.20版本使用的)
11、label标签
k8s的特色管理方式,用于分类管理资源对象,可自定义node、pod、service、namespace
label选择器:等于、不等于,使用定义的标签名
12、ingress(非常重要)
k8s集群对外暴露提供访问的接口,属于应用层,七层代理,转发http/https请求
service是四层转发,转发的是流量
ingress和service的区别【重要】
ingress是七层代理,转发http请求
service是四层代理,转发的是流量
转发过程:
http://www.yyy.com:80→ingress→service→pod→容器
13、namespace命名空间
在k8s上可以通过namespace来实现资源隔离、项目隔离,通过namespace可以把集群划分为多个资源不可共享的虚拟集群组,不同命名空间里面的资源名称可以重复
14、数据架构图(重要)