1、概念
希腊语,舵手、飞行员的意思
k8s可以理解成负责自动化运维管理多个容器化的应用集群。容器编排框架的工具,是谷歌基于go语言开发的
2、作用
用于自动部署、扩展、管理容器化部署的应用程序,是(半)开源的
k8s的底层是基于go语言
3、k8s的使用场景
docker部署了一个nginx,一旦访问量增大,nginx有可能占满了系统资源,cpu告警、内存告警
运维人员入场,要么对服务器扩容,要么就重亲部署服务,对cpu和内存做限制,防止再一次占满整个服务器
使用自动化运维管理:k8s
1、多节点部署,不再是单机部署
2、自动完成更新和部署
3、解决了跨节点容器之间的通信问题
4、k8s有自我修复的机制,使得整个容器集群可以在用户的期望状态下运行
4、k8s的特点
4.1自我修复
节点故障时会自动把该节点上的容器重新部署到其他节点;容器启动失败时,会自动重新启动容器,3次失败后,就认为该服务不可用;在容器启动时,也会有检测机制(探针),检测容器启动是否正常
确保集群内部的服务能够正常工作
4.2弹性伸缩
在一个容器占用机器的资源比较高时,k8s会自动的增加pod的数量,在资源占用下降的时候,会自动释放pod的数量。以最小的成本运行服务
4.3自动发布(滚动发布模式,默认模式)和回滚
k8s在更新的时候不是一次性更新所有,而是更新一部分,然后再更新剩余的部分,如果有问题可以随时回滚
4.4服务发现和负载均衡
多个容器有一个统一的访问入口,内部地址和统一的对外地址,自动负载均衡所有关联的容器,无需考虑容器的ip地址
4.5存储编排
支持外挂存储,内部挂载,内部存储卷;外部挂载,可以是本地存储,也可以是公有云。NFS、ceph都可以支持
4.6集中化配置和密钥管理
k8s所有的配置可以加密的形式保存在集群信息中,提高集群的安全
4.7任务的批量处理
5、架构
主从架构,master-slave模式,所有的操作、管理、运维都是在主节点完成
从节点:node节点、工作节点,负载工作的节点
6、主节点组件
6.1kube-apiserver
是整个集群的大脑,每个组件之间的资源请求和调用操作都是通过apiserver完成的,通过api接口发送到各个组件
api接口和端口之间的区别:
api接口:内部的组件和组件之间通信的接口,内部调用方法(代码)的接口。程序和程序之间的通信
端口:应用和应用之间,客户端和服务端之间的通信
所有的资源对象的增删改查和监听都是由apiserver来完成的,处理完之后交给etcd进行存储
6.2etcd
k8s内部的存储服务,分布式的键值存储系统,存储了k8s进群的配置和用户配置以及集群内部服务的信息。只有apiserver可以和etcd通信,读写权限,其他组件要想往etcd存储信息或者读取信息必须通过apiserver
etcd分布式必须是奇数
6.3kube-controller-manager运行管理控制器
k8s集群当中处理常规任务的后台的线程,是k8s集群当中所有资源对象自动化控制的中心
在k8s集群当中,一个资源对应一个控制器,controller-manager就是来管理这些控制器的
6.3.1控制器类型
6.3.1.1node controller节点控制器
节点出现故障时,发现和响应
6.3.1.2replication controller副本控制器
创建资源对象时,可以选择创建的个数(pod数),保证资源对象声明的副本数和创建的数量保持一致
6.3.1.3endpoint controller端点控制器
service对应的pod,service来匹配对应的pod,监听pod的变化,端点就是暴露出来用于对外访问的
6.3.1.4resourcequota controller资源配额控制器
确保创建的资源对象不会超过设定的系统资源量
6.3.1.5namespace controller命名空间控制器
项目上进行区分,每个命名空间都是独立的,来管理命名空间的生命周期
6.4kubu-scheduler
根据调度算法为pod选择一个合适的node节点
node节点的资源越富裕,负载越小,部署pod的排名就越高
7、node节点组件
7.1kubelet
主节点在node节点的监视器,与master节点通信。定时向apiserver报告服务在node节点上的运行情况
接受来自master的调整措施
kubelet负责节点上pod的生命周期
master的指令传给kubelet,kubelet完成之后传给apiserver,apiserver把node节点的更新信息保存到etcd
7.2kube-proxy
在每个node节点上实现pod的网络代理,是service的具体载体
负责网络规划和四层负载均衡工作
iptables和ipvs实现服务的映射访问
apiserver通过监控kube-proxy来完成对pod的更新和端点的维护。把变化的结果保存在etcd
内部服务的负载均衡是四层代理(ip+端口),实现内部pod的负载均衡
k8s的每个节点上都有kube-proxy
内部的ip地址:flannel、calico两个插件提供内部pod的ip地址
7.3docker
整个集群的最底层
分布式
8、k8s的核心概念
8.1pod
是k8s的最小单位,一个pod就是一个正在运行的进程
pod的里面包含着容器,可以是一个容器也可以是多个容器
部署在同一pod当中的容器共享网络、存储和计算资源
不同的pod之间只能通过集群分配的ip地址通信
8.2label
标签,是k8s的特色管理方式,对资源对象进行分类
通过标签把pod------service------资源对象------控制器,进行关联
8.3service
在集群当中,每个pod都会设定一个ip地址,可能会因为pod的消失导致ip地址也随之消失,service就是来解决这个问题的核心概念
service不是一个服务,是网关
8.4ingress
service用于集群内部访问
ingress是整个k8s集群的接入层,整个集群的外部通信
service是四层负载均衡,只能是ip+端口
ingress是七层转发
8.5namespace
资源隔离的方式,是逻辑上的隔离,项目越来越多,集群越来越大,通过命名空间把资源分配到各个命名空间,每个命名空间之间资源不共享,使用的是分配的资源
命名空间在集群当中是唯一的,名字不能重复
default:默认命名空间,不做特殊声明,所有的资源都在默认空间
kube-system:系统应用的命名空间
查询特定的资源一定要加上命名空间