k8s基础组件
容器资源控制器
MESOS(APACHE)
Docker Swarm(Docker)
Kubernetes (Goole)
Kubernetes架构组件
kubectl:K8s的命令行管理工具
Master节点属于K8s的大脑
API Server:所有服务的访问入口
scheduler:负责任务的节点选择和分配,关于多节点必要都需要调度器
controller-manager:属于Pod的控制器,目的是维持副本的期望数量,属于冗余方案
Etcd:键值对数据库,储存K8S集群所有重要信息(数据持久化)
Node节点由Master 管理,Node负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期
kubelet:实现容器的生命周期
kube-proxy:负责写入规则至 IPTABLES、IPVS 实现服务映射访问(实现集群外的访问Pod应用)
Container:docker,也可以是其他容器
Pod:容器的集合,K8s的最小操作单位
什么是POD?
POD类型分为自主式和控制器管理的POD,可以理解为非管理和被管理,那么自主式POD的缺憾是一旦进程死亡或重启无法满足期望值(RC,ReplicationController)而拉起。
传统模式下运行的docker都是独立方式运行的,每个容器都有自己的IP地址、挂载卷等,在Kubernetes进行移植时,很难迁移,由此产生了POD,首先定义一个POD,先启动第一个容器(pause网络栈、存储),且一个POD可以封装很多个容器。
POD 控制器类型:
RC,ReplicationController:假设有个POD死了,便会创建一个新的POD来满足这个期望值,在新版本Kubernetes中,建议使用RelicaSet取代。
RelicaSet:和RC没有本质上的区别,但是,RS支持集合式的selector,在创建POD的时候会被打上诸如app=nginx;version=v1.8此类标签,可以做一个集合方案来满足筛选条件。
Deployment:并不负责OPD的创建,一般使用进行管理RS,支持rolling-update滚动更新及回滚操作(RS并不会被删除,只是被停用),这是在生产环境中常用的。
HPA:Horizontal Pod Autoscaling,在V1版本中仅支持POD的CPU利用率扩容。
StatefulSet:主要解决有状态服务问题,docker主要面对的是无状态服务(没有对应的存储是需要实时的保留),无状态典型的服务有apache等,有状态服务mysql,mariadb等。
应用场景包括:
1、稳定的持久化存储:就是POD死亡以后调度一个新的来取代,他的存储用到的还是之前的存储并不会变,不会改写里面的数据,也不会丢失;
2、稳定的网络标识:主机名不变,防止在集群里面定义了一个POD名称去调用结果出现了一个新的POD顶替以后名称发生变化需要重新写入;
3、有序部署:分为扩展和回收阶段,当前一个POD处于Running和Ready的状态,第二个才可以被创建,按启动顺序来定义有序部署。
DaemonSet:确保全部或者一些node上运行一个POD副本,当有node加入集群,会为他们新增一个POD,通常用于运行 daemon守护进程。
Job,Cronjob:复杂批处理任务,仅执行一次,后者基于时间的job。
POD与POD之间的通讯及POD与外部之间的通讯
网络模型:假定了所有POD都在一个可以直接连通的扁平网络空间中,在k8s中扁平化的概念是所有的POD都可以通过对方的IP直接到达,如果想在自己的集群中构建k8s需要先解决扁平化的网络空间。
1、lo:同一个POD中的多个容器,他们之间要互相访问,共用pause的io,基于docker0网卡作为网关。
2、Overlay Network:各POD之间的通讯,Flannel是k8s中最常用的解决扁平化网络的方案,让集群的不同节点主机创建的Docker容器都具有一个唯一的IP地址,可以通过修改docker的配置文件,将docker分配的网段修改掉,最难就是容器A访问B和C。
3、POD到service是基于iptables的转发。
4、POD到外网是基于iptable的SNAT。