一、Kubernetes简介
1、由google公司开发,google有10年容器化基础架构经验,自身的borg容器在公司内部使用,对外开源的是Kubernetes,由go语言开发,基于http协议的C/S架构,是一种资源管理器
2、特点
(1)go语言为静态编译性语言,因此k8s特点之一轻量级:消耗资源小
(2)开源
(3)弹性伸缩
(4)负载均衡:ipvs
二、组件说明
1、K8S架构
2、MASTER节点
(1)scheduler:任务发起角色,选择合适的节点进行分配任务,它将任务交给api server,api server将请求写入etcd,它并不会与etcd直接交互
(2)replication controller manager:rc,副本管理器,根据设置的pod数,使整个k8s一直保持这个pod数
(3)api server:一切服务访问的入口,为避免api server过于繁忙,各服务组件在本地生成一定的缓存,同样的访问需求读取缓存
(4)etcd:键值对数据库,存储K8S的参数信息,是一种可信赖的分布式存储服务,有自己的集群化方案,扩容方便,实现了k8s整个框架的持久化方案。V2将数据写入内存,V3会将数据写入磁盘,类似于redis,K8S v1.11已经弃用V2,对于仍在使用V2版的etcd,需要注意备份操作
etcd结构图
<2>etcd基于http协议
<3>Raft:存放etcd的读写信息
<4>WAL:预写日志,当对数据产生更改,产生日志放入Entry进行存储记录,并且利用Snapshot对这些日志定时的进行完整备份
<5>Store:Raft会将数据以及日志,实时的写入本地磁盘Store,进行持久化设置
3、NODE节点
(1)container:容器,现大多数使用docker作为容器平台
(2)kubelet:会与docker进行交互,操作docker创建对应的容器,维持pod生命周期
(3)kube proxy:负责写入规则至iptables或者IPVS,实现服务映射访问
4、其他插件
(1)CoreDNS:为急群众的SVC创建一个域名-IP的对应关系解析
(2)Dashboard:给K8S集群提供一个B/S结构访问体系
(3)INGRESS CONTROLLER:官方只能实现四层代理,INGRESS可以实现七层代理
(4)FEDETATION:提供一个可以跨集群中心多K8S统一管理功能
(5)Prometheus:提供一个K8S集群的监控能力
(6)ELK:提供K8S集群日志统一分析介入平台
5、高可用集群副本数据最好是>=3奇数个
6、有状态服务和无状态服务
(1)有状态服务:需要数据存储功能的服务、或者指多线程类型的服务,队列等,每个实例都需要自己独立的持久化存储,比如说mysql数据库
(2)无状态服务:是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。多个实例可以共享相同的持久化数据,例如nginx、tomcat
三、POD
1、Pod分为两种:
自主式Pod:不被控制器管理的POD,POD挂掉后不会被重启
控制器管理的Pod
2、同一个POD中,容器之间的端口不能冲突,它们既共用同一个网络栈,又共享同一个存储卷
3、POD控制器类型
(1)ReplicationController、ReplicaSet、Deployment、HPA,前三种控制器具有一定组合性而放在一起,HPA仅适用于ReplicaSet和Deployment
<1>ReplicationController:RC,用来确保容器应用的副本数,始终保持在用户定义的副本数,如果有容器异常退出,会自动创建新的Pod来替代,如果异常多出来的容器也会自动回收,在新版本的K8S中建议使用ReplicaSet来取代该项
<2>ReplicaSet:RS,与ReplicationController没有本质不同,只是名字不一样,并且ReplicaSet支持集合式的selector,新版本中已经抛弃了RC
<3>Deployment:一般建议用Deployment自动管理ReplicaSet,这样无需担心跟其他机制的不兼容问题,比如RS不支持rolling-update滚动更新,但Deployment支持。本项不支持POD创建,但它可以定义RS
滚动更新:假设Deployment下有个RS,RS下有3个POD,需要将POD中的内容进行更新
现在开始更新,在Deployment下会生成一个新的RS
由于我们设置一共有3个pod,所以升级的过程是RS1去掉一个V1,在RS2处新加一个V2,保持总数不变
以此类推,最后所有pod升级完成
<4>HPA:Horizontal Pod Auto scal,在V1版本中仅支持根据Pod的CPU利用率扩缩容,即根据CPU使用率的多少,增加或减少容器,个数不会超过最大最小值。在valpha版本中,支持根据内存和用户自定义的阈值扩缩容。
(2)StatefulSet:是为了解决有状态服务的问题,是对应Deployment和ReplicaSets的无状态服务而设计
<1>稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
<2>稳定的网络标志,即Pod重新调度后,PodName和HostName都不变,基于Headless Service来实现
<3>有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要根据定义的顺序依次进行,即从0到最后一个,在下一个Pod运行之前的所有Pod,都必须是Running和Ready状态,基于init containers来实现
<4>有序收缩,有序删除,即从倒数第一个到0
(3)DaemonSet:确保全部或者部分Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod;当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它所创建的所有Pod。典型用在每个Node上运行日志收集daemon,比如说logstash,或者在每个Node上运行监控daemon,比如和Prometheus Node Exporter
(4)Job,CronJob
<1>Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
<2>Cron Job管理基于时间的Job,即在给定时间点只运行一次、周期性地在给定时间点运行
4、服务发现
(1)当客户端访问一组Pod时,即该组Pod提供的是同样的服务,即被同一个Deployment创建,或者拥有同一组标签,才会被这个service选到。选到以后该service拥有自己的ip和端口,此时客户端便可以通过访问这个service的ip和端口,间接地访问到这些Pod,并存在RR轮循调度算法
(2)Pod与Pod之间的访问,可以通过访问service方式,或者ingress
四、网络通讯方式
1、K8S的网络模型假定了所有Pod都在一个可以直接连通的扁平网络空间中,也就是说,所有的pod之间都可以依靠ip到达。但如果在私有云里搭建K8S集群,需要实现这个连通的网络空间,将不同节点上的docker容器之间的互相访问先打通,然后再运行K8S
2、通讯方式
(1)同一个Pod内的多个容器之间:lo
(2)各Pod之间的通讯:FlannelOverlay Network,覆盖网络
<1>在同一台主机上,由docker0网桥直接转发请求即可,不需要经过
<2>不在同一台主机上,pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的统信只能通过宿主机的物理网卡进行,将Pod的IP和所在Node的IP关联起来,通过这个关联可以互相访问
(3)Pod与Service之间的通讯:各节点的iptables规则、LVS
(4)pod到外网:pod向外网发送请求,查找路由表,转发数据包到宿主机网卡,宿主机网卡完成路由选择后,iptables执行masquerade,把源IP更改为宿主机网卡的IP,然后向外网发送请求
(5)外网访问Pod:service
3、网络解决方案:K8S+Flannel,不同主机Pod之间的访问过程
(1)Flannel:让集群中的不同节点主机创建的docker容器都具有全集群唯一的虚拟ip地址,而且它还能在这些ip地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不懂地传递到目标容器内
(2)不同主机pod之间访问过程说明:
<1>图中若web app2访问web app1,可以直接走docker0网卡即可,即走了pod内的docker之间访问使用lo方式
<2>图中若web app2访问backend,首先自身ip地址10.1.15.2/24经过docker0,进入Flannel0,Flanneld中有etcd配置的路由表信息,之后对数据包进行封装:
mac
Pod源ip,Pod目标ip(图中destination有错)
利用udp协议在内部局域网更快的特性
源容器的ip和目标容器的ip
数据包实体
进入目标pod后,Flanneld会拆封数据包,将请求转发到Flannel0,Flannel0再转发到docker0,之后进入backend。
(3)etcd与flannel提供的说明
<1>存储管理Flannel可分配的IP地址段资源,避免ip冲突
<2>监控etcd中每个pod的实际地址,并在内存中建立维护Pod节点路由表
3、K8S有3层网络,分别是service网络、pod网络和节点网络
真实的物理网络为节点网络,service网络和pod网络为虚拟网络
节点网络:构造K8S需要一张物理网络就可以