① 轻量级
一些解释性语言:例如Python/JavaScript / Perl /Shell,效率较低,占用内存资源较多
使用go语言编译型语言,语言级别支持进程管理,不需要人为控制,所以以go开发的资源消耗占用资源小
② 开源
③ 自我修复(控制器控制pod,保证pod可以维持我们所期望的副本数量3)在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
对异常状态的容器进行重启或重建(再创建、再删除),目的是保证业务线不中断
④ 弹性伸缩
手动弹性伸缩,当nginx读、磁盘、内存的压力(单个pod)>80%,修改replicasets:3->4 更新一下nginx
Yml 阈值 cpu使用率 > 80% 触发扩容pod (CPU使用上限,docker-cgroup k8s 1、limit 2、configmap-配置文件 )
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
伸缩:扩容和缩容(节点 应用类型nginx)
弹性:人为只要指定规则,满足条件时,就会自动触发 扩容或缩容的操作
⑤ 自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
⑥ 服务发现()和负载均衡
K8S为多个pod(容器)提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
使用IPVS(章文嵩)框架“替代”iptables
kube-proxy 3种模式:①userspace、②iptables、③ipvs
⑦ 机密和配置管理(secret——》安全/认证加密性的数据 )
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
⑧ 存储编排(静态、动态)
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
⑨ 批处理
提供一次性任务(job),定时任务(crontab);满足批量数据处理和分析的场景
K8S 目标是为了让部署容器化应用、管理容器集群资源更加简单高效
1、pod(最小的资源的单位)
一个pod 会封装多个容器组成一个子节点的运行环境 (最小单元,容器的数量2+)
最小部署单元
一组容器的集合(基础容器+ 主应用容器+挂斗/副容器)
一个Pod中的容器共享网络命名空间(基础容器提供的pause)
Pod是短暂的 (叙述的是其生命周期)
1、pod中跑几个容器:3个(pod中基础容器+运维容器+主应用)
2、pod中多个容器之间怎么通讯:localhost
3、相同node节点中pod之间怎么通讯:docker 0
4、不同node节点pod之间怎么通讯:借助于cni 插件,我们使用的是flannel
首先,定义两个节点 主机A POD-A 主机B POD-B
① POD-A首先会发送给docker 0 网桥
② docker 0会转发给flannel0网桥
PS:详细话术docker 0(网桥会被flannel 0 网桥以钩子函数的方式获取到转发信息)
③ flannel 0 会转发给flanneld (后台进程),flanned会到ETCD中查看ETCD维护的路由表条目/信息,确认往哪去发送
ETCD-路由表有哪些flanneld需要知道的信息
获取到pod-b所在的node节点 ——》主机B
获取到主机A如何到主机B,从哪个物理网卡通过 (宿主机)
④ flanned 会在转发给宿主机的物理网卡
⑤ 物理网卡会以UDP的方式转发数据包
(数据包中除了主机A和主机B的源IP和目标IP之外,还会将POD-A和POD-B的源/目标IP封装在UDP协议中)
① 首先解封装,发现源IP地址是找自己的(主机IP地址)
② UDP 转发过来,解封装之后,发现了封装在UDP内部的 POD-IP(源/目标)
③ 主机B的物理网卡就会发送给flanned进行处理
④ 而flanned会查询ETCD中维护的路由表信息,发现是自己的pod(需要确认找的是哪个docker网桥)
⑤ flanned 会发送给自己的flannel0网桥,flannel网桥再发送给对应的docker (0)网桥
⑥ docker 网桥(网关),会把这个数据包发送给对应的POD-B
pod不仅仅是tomcat或nginx或者其他的应用服务
还可以是services:L4pod形式表现的
ingress-nginx:L7层的代理 管理的是http流量,使用控制器管理一组pod资源来进行的
pod如何通过网络交互,如何暴露出去
管理pod的方法(控制器)
服务发现如何实现(service)
pod:首先,最小组成单元,是一组容器的集合,应用容器跑在pod资源中的
##1、资源清单:
① K8S中资源的概念
② 资源清单格式(资源清单/配置文件):Yaml/语法
③ Pod 生命周期()
InitC
Pod phase
容器探针---》 liveness Probe 、readnessProbe
Pod hook
重启策略
2、Pod 控制器(维护Pod状态,期望值)
什么是控制器 对不同的对象及其特性使用不同的方式控制管理
控制器说明:
ReplicaSet 确保预期的Pod副本数量
**Deployment 无状态应用部署
**StatefulSet 有状态应用部署
DaemonSet 确保所有Node运行同一种Pod
Job 一次性任务
Cronjob 定时任务
有状态应用:有特殊状态:需要存储--->Apache,MySQL
无状态应用:无特殊状态:不需要存储--->Tomcat,Nginx
通过service这个统一入口/定义的访问策略对外暴露服务
K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问
可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)
服务分类:
① 无状态服务:LVS
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。在一个封闭的系统中,只存在一个数据闭环。通常存在于单体架构的集群中。
② 有状态服务:例如数据库(需要持久化)
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。一个请求只能被某个节点(或者同等状态下的节点)处理。存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。通常存在于分布式架构中。
无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息。
有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等
有状态:需要持久化,多次请求之间需要共享一些信息
无状态:一次性,不需要持久化,每次请求都是一条新的数据
多种存储类型:
configmap(配置管理中心),主要存储配置文件
Secret:用户密码、需要加密的文件
volume:基本数据(网页文件)
⭐⭐PV,PVC:动态创建过程
configmap
k8s 期望的是 所有应用均可跑在POD里面
虚拟化——》不适合跑极度吃资源的(对于资源的使用要求特别高的)
调度器(Scheduler)
K8S会自动完成把一个新的pod 调度到对应的节点(预选/优选算法)
对于生产环境上,我们往往会需要将pod创建的过程(比如创建到的节点位置)进行管理,
例如:
指定节点位置创建Pod(指定调度)
将不同的Pod创建在一个节点上(亲和)
将不同的Pod 创建在不同的节点上(反亲和)
根据自己的需要,对pod进行节点组装等
创建一个POD
1、编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:nginx
2、把pod 暴露出去,Service——》通过yml文件定义 label:nginx
通过同一个label标签,进行关联,组合在一起