k8s概述
用于自动部署,自动扩展和管理“容器化应用程序”的开源系统。k8s是google基于go语言开发的自动化运维管理容器。
k8s的全称:kubernetes
k8s的版本:1.20------------用的最多的版本,1.18-1.21(1.24------------>k8s的镜像不再使用docker,containerd)。
k8s优势
1、docker是单机模式,不能实现跨主机部署,无法实现集群化
2、docker不能实现高可用和负载均衡。docker没有自愈机制(docker应用一旦报错,就会进入停止状态,不能自动恢复)。
3、随着容器数量的上升,管理成本也跟着一起攀升。
4、docker没有预设模板,无法实现快速,大规模的容器的调度。
5、docker没有生命周期的管理工具,没有图形化工具。
k8s是管理容器化部署的微服务管理工具。
k8s的组件和功能
架构
采用主从架构模式
主节点master:所有的操作都在主节点。
从节点node:工作节点,主节点发出的指令,在工作节点完成和实施。
主节点也可以作为工作节点,也可以进行容器应用程序的部署。(一般不用)
核心组件
master组件
1、kube-apiserver:是集群的核心的核心,所有的操作都是由apiserver调用集群内其他组件实现,apiserver也是整个集群的入口,访问apiserver来访问集群,apiserver一旦故障,整个集群都将无法使用。
所有对象和资源的增删改查和监听都是由apiserver来实现的,所有的信息的变更,都是由apiserver处理,处理完之后交给etcd进行保存。
2、etcd:是k8s集群自己的存储服务,类似于数据库,etcd是一个分布式键值存储系统,集群的所有信息都保存在etcd,k8s的配置信息也保存在这里。etcd只能是奇数台,只有apiserver可以访问etcd,读写权限。其他组件只能通过apiserver的接口才能够获取etcd的数据。——配置存储中心。
3、kube-scheduler:调度控制器,根据用户设置的调度算法,为新创建的pod选择一个合适的node节点。k8s所有node节点的调度器,用户要部署应用时,scheduler会根据调度算法选择一个最合适的节点部署pod。(先预选策略,再优先策略
4、kube-controller-manager:运行管理控制器,在k8s集群中,一个资源对应一个控制器,controller-manager就是来管理这些控制器。
控制器的类型
1、node controller:节点控制器,节点出现故障时发现和响应。
2、replication controller:副本控制器,k8s集群中,一个资源对象可以创建多个副本,也就是有多个pod。pod的数量定义好之后,副本控制器来进行管理(pod的数量可以动态的变化)
3、endpoints controller:端点控制器,service和pod之间的对应关系,负载监听service和pod之间的变化关系。访问指定的服务,必须要知道对应的endpoint。
4、service account & token controller:账户和令牌控制器,为新的命令空间内创建默认账户和api访问的令牌。
5、resourcequota controller:资源配额控制器,pod可以在配额的情况下使用系统资源。
6、namespace controller:命令空间控制器,管理namespace的生命周期。
7、service controller:服务控制器,k8s集群和外部的云平台之间的接口控制器。
node组件
1、kubelet: node节点的监视器,以及于master节点的通讯器。node节点上的信息,kubelet会定时向master汇报节点的情况(apiserver)并且接受来自master节点的指示,采取调整措施。
在k8s集群中,每个node节点都会有一个kubelet,用来管理从节点的服务状态,信息等等,定时发送给master。
2、kube-proxy:在每个node节点上实现pod的网络代理。是service实现的载体,负责网络的规划和四层负载,写入iptables的数据包转发的规则,ipvs实现流量的分发。
3、docker: 容器引擎,拉去镜像,运行容器,都是由docker自己完成的。
数据流向图
pod
pod里面包含有容器,一个pod可以有多个容器,但是k8s集群管理的最小单位就是pod。
pod中的容器共享网络,存储,资源配额。
pod控制器
pod启动的模板,也属于controller-manager的一部分,当我们定义好模板之后(YAML文件),定义好之后,所有的pod都会按照这一模板创建。
pod控制器的类型
deployment:无状态应用部署,最常用的方式
replicaset:确保pod的数量。受控于deployment。
daemonset:确保所有节点都会运行一个pod。无法设置副本数。
statefulset:有状态部署,pod是按照序号排列,可以设定副本数。
job:一次性任务,根据用户的设置,任务执行完毕,pod就自动退出
cronjob:pod会按照定时任务执行,执行完毕退出。
k8s对外提供访问基本概念
label:标签,k8s特有的管理方式,分类管理资源对象。
pod service node replica label是一个键值对形式,key和value由用户来自行定义。
service-------------pod 1 2 3
k8s对外提供访问的方式
service:只要创建好了pod,集群一定会为pod分配一个全局独立的ip地址。但是pod的生命周期有限,pod的ip地址会发生变化。
service可以通过标签匹配pod的标签,就可以直接访问到对象pod的资源,无需再关联。
每个service都有一个固定的虚拟ip地址。cluster ip,只能局域网访问,自动的而且是动态的绑定后端的pod。
service有多种类型,都是基于四层的转发,ip+端口。通过kube-proxy,来实现网络的转发,转发的形式:iptables,ipvs(主流转发模式,性能最好)。适合内网使用。
ingress:对外提供访问,可以使用7层代理,可以使用域名。
namespace:命名空间,k8s集群做一个人为的划分,逻辑上的一种隔离方式,每个项目都在自己的命名空间内部署,互相隔离,互不干扰。