1.云原生技术
- 何为云原生?
云原生技术: 以k8s和为核心的一套云原生架构体系叫做云原生技术; 软件的架构设计遵循kubernetes软件架构设计思想,云原生架构;
云原生:
1)架构思想:软件架构开发思想
2)应用: 让开发的软件或者服务(MySQL,es,mq,nacos………)都必须运行在容器中,容器编排技术使用kubernetes;这样的架构就叫做云原生架构- 云原生特点:
1)容器化 : 所有的应用都必须部署在容器中
2)微服务 : 按照function拆分,拆分的很细致;适合在容器中运行,实现云原生架构模式;
3)DevOps : 开发+运维结合体,DevOps是一种敏捷开发的思想,一种组织形式,实现项目流水线生产模式;
4)CI/CD : 可持续集成,可持续部署- CNCF(云原生组织)对云原生定义扩展:
ServiceMesh 服务网格架构(ServiceMesh + Istio) ------------ 云原生架构
2.云原生架构理念
* iaas 【Infrastructure as a service 基础设施即服务】
# 用户:购买服务器,建设机房,DNS,交换机,路由,网络... (硬件环境)
# 云计算提供商:提供 网络、存储、dns、服务器..服务,用户只需要租用云主机即可,不需要关系硬件建设。
# 网络、存储、dns、服务器,操作系统 这样服务就叫做基础设施即服务。
思考: 用户购买一台iaas服务? 就相当于买了一台空的服务器。
* paas 【platform as a service】
# 在iaas基础上安装一些软件:基础服务软件---MYSQL,RocketMQ,ElasticSearch...作为基础服务
思考:用户购买这样的服务后,此时用户只需要关系项目业务代码开发,基础软件服务不需要自己安安装。
* caas 【container as a service】
# 容器就是一个服务。软件,服务都运行在容器中。
* saas 【software as a service】
# OA(多租户)
# 钉钉 (多租户)
# 财务 (多租户)
* faas 【function as a service】,baas 【backend as a service】
# 视频服务提供商(直播)---- 函数收费 (函数运行,收费)
# CDN服务商 (视频缓存服务)---- 函数收费
# 短信服务 --- 发一条短信
# 支付服务 --- 函数收费
* service mesh
# 客户端 --> proxy代理服务--> 服务(集群)
# 客户端+proxy(集成在一起:服务治理--降级,限流、监控..)--> 服务+proxy(集成在一起:服务治理--降级,限流、监控..)(集群)
注意:
# 一般企业直接使用 proxy代理模式就ok,至于服务治理:springcloud
# service mesh 不建议使用,落地非常困难,中小型企业玩不起,技术能力
* serverless
# server 服务器,less 无 ---> 无服务器
# 未来开发境界:程序员只需要关心代码业务开发即可,服务器环境不需要关心,所有的服务都上云。
# 未来:
公有云: 阿里云,腾讯云、网易云,百度云,滴滴云...
私有云: k8s 自己公司构建自己的私有云 ------ 很多公司在使用私有云
3.容器编排
1)应用部署变迁
* 物理机
操作系统
* 虚拟机
OpenStack
* 云原生
kubernetes
思考:微服务架构,服务拆分成千上万个服务,就需要非常多的容器来进行部署,那么这些容器怎么管理?
怎么横向扩容?
服务宕机了,怎么恢复,你是如何知道的?
版本更新,上线,更新容器后,线上业务如何不受影响?
监控容器?
调度问题?
安全问题?
window系统:海量的文件,如何管理??
资源管理器(管理文件:调度)2)容器管理
* 解决问题
怎么横向扩容?
服务宕机了,怎么恢复,你是如何知道的?
版本更新,上线,更新容器后,线上业务如何不受影响?
监控容器?
调度问题?
安全问题?
以上问题,容器编排技术来说,一个指令,一个按钮就可以搞定一切。
* docker-compose
非常轻量级容器编排技术,可以通过yaml文件方式,对容器进行批量管理,不能实现复杂容器编排
* rancher
可视化的容器管理工具,v2版本提供对k8s兼容。中小型使用,性能非常差,不能实现复杂的容器编排。
* swarm
docker公司自己研发的容器编排技术,docker也在使用kubernetes.
* mesos
apache软件基金会提供开源的容器编排技术。
* borg
google研发一套容器编排技术,这套技术没有对外公开,强大,稳定。
* kubernetes
google研发一套容器编排技术,使用go开发。性能非常强大、稳定、通过指令、yaml编程方式管理容器,非常灵活。
4.kubernetes -- k8s 基本认识
- borg系统
Borg. Google的Borg系统运行几十万个以上的任务,来自几千个不同的应用,跨多个集群,每个集群 (cell)有上万个机器。它通过管理控制、高效的任务包装、超售、和进程级别性能隔离实现了高利用 率。它支持高可用性应用程序与运行时功能,最大限度地减少故障恢复时间,减少相关故障概率的调度 策略。以下就是Borg的系统架构图。其中Scheduler负责任务的调度。
- kubernetes
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是 存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对 Docker及容器进行更高级更灵活的管理。就在这个时候,K8S出现了。 *K8S*,就是基于容器的集群管理平台,它的全称,是kubernetes*
- k8s主要功能
Kubernetes是docker容器用来编排和管理的工具,它是基于Docker构建一个容器的调度服务,提供资 源调度、均衡容灾、服务注册、动态扩缩容等功能套件。Kubernetes提供应用部署、维护、 扩展机制 等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:
1)数据卷: Pod中容器之间共享数据,可以使用数据卷。
2)应用程序健康检查: 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
3)复制应用程序实例: 控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
4)弹性伸缩: 根据设定的指标(CPU利用率)自动缩放Pod副本数。
5)服务发现: 使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。
6)负载均衡: 一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部 其他Pod可通过这个ClusterIP访问应用
7)滚动更新: 更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。
8)服务编排: 通过文件描述部署服务,使得应用程序部署变得更高效。
9)资源监控: Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。
10)提供认证和授权: 支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略。
5.k8s 集群 -- 分布式架构(一个master-主节点,一群node节点-计算节点)
* master
* Api Server 网关 ,所有的请求指令都必须经过 ApiServer 转发
* scheduler 调度器,把请求指令(crud)调用到合适的node节点上。把调度请求发送给apiserver,apiserver将会把请求指令存储在etcd. node节点有kubelet监控etcd,
监控到本node节点的指令,就会获取指令,在node节点执行。
* controllers 控制器(十几个控制器),每一个控制器对应相应的资源,控制器对这些资源进行管理(curd)
* etcd nosql,存储一些指令,用来做服务注册与发现* node节点
* pod 是k8s最小的管理单位,pod内部有一个或者多个容器,pod是一个用来封装容器的容器。
一个node节点可以多个pod,理论上是无限制的,取决于硬件环境。
* docker 容器引擎(程序),k8s管理容器,容器由docker进行创建,k8s底层必须有docker引擎。
* kubelet 监听etcd,获取指令管理pod,kubelet是真正管理pod的组件。
* kube-proxy 代理服务,主要用来做负载均衡。设置iptables负载规则,更新service虚拟endpoints
* fluentd 日志收集组件
* dns 域名解析服务器
6.controllers ---- 控制器
* replication controller : 副本控制器,控制副本数量与预期设定的数量保持一致。
* Node Controller : 检查node节点监控状况;由k8s本身内部实现的。
* namespce controller : 创建pod,会把pod分配在不同命名空间下,定期清理无效的namespace
* service controller : 虚拟服务控制器,维护虚拟ip,提供负载均衡。
* endpoints controller : 提供了pod,service关联服务。
* service Account controller : 安全认证
* persistent volume controller : 持久化存储控制器-有状态服务部署,数据持久化存储 PVC
* daemon set controller : 让每一个服务器都具有一个相同的服务,管理维护Daemon Set,负责创建Daemon Pod,保证指定的Node上正 常的运行Daemon Pod
* deployment controller : 部署控制器,支持滚动更新,发版
* Job controller : 定时任务控制器
* pod autoscale controller : 自动更新控制器,cup利用率>=80% ,自动扩容。
7.etcd
etcd 是一个分布式的、可靠的 key-value 存储系统,它用于存储分布式系统中的关键数据,这个定义非 常重要。
etcd是一个第三方服务,分布式键值存储系统。用于保持集群状态,比如Pod、Service等对象信息 etcd是一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于 Go语言实现。Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象 的状态信息。整个kubernetes系统中一共有两个服务需要用到etcd用来协同和存储配置,分别是: 1)网络插件flannel、对于其它网络插件也需要用到etcd存储网络的配置信息 2)kubernetes本身,包括各种对象的状态和元信息配置
8.scheduler调度器
根据调度算法为新创建的Pod选择一个Node节点。 scheduler在整个系统中承担了承上启下的重要功 能,承上是指它负责接收controller manager创建新的Pod,为其安排一个落脚的目标Node,启下是指 安置工作完成后,目标Node上的kubelet服务进程接管后继工作。
也就是说scheduler的作用是通过调度算法为待调度Pod列表上的每一个Pod从Node列表中选择一个最 合适的Node。
* podQueue (即将要创建的pod进行排队)
* nodeList (存储pod的节点的集合)
* scheduler通过调度策略算法把pod 和 某一个node进行配对,存储在etcd,node节点kubelet监控到数据,把pod获取到在本地创建pod.
* 调度算法
* 预选调度
判断pod是否存在冲突
pod名称是否重复
* 最优节点
cpu利用率最小的节点
9.kubelet
kubelet是Master在Node节点上的Agent(代理),每个节点都会启动 kubelet进程,用来处理 Master 节点下 发到本节点的任务,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、 下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kubelet 是 k8s 在node节点上的代理服务。pod的CRUD的是有node节点上kubelet来进行操作。kubelet实际上就相当于链式调用,上游服务是master(scheduler,apiserver),有node记得kubelet接受请求,执行具体操作。
1)kubelet 默认监听四个端口,分别为 10250 、10255、10248、4194
- 10250(kubelet API):kubelet server 与 apiserver 通信的端口,定期请求 apiserver 获取自己 所应当处理的任务,通过该端口可以访问获取 node 资源以及状态。
- 10248(健康检查端口):通过访问该端口可以判断 kubelet 是否正常工作, 通过 kubelet 的启动 参数 --healthz-port 和 --healthz-bind-address 来指定监听的地址和端口。
- 4194(cAdvisor 监听):kublet 通过该端口可以获取到该节点的环境信息以及 node 上运行的容 器状态等内容,访问 http://localhost:4194 可以看到 cAdvisor 的管理界面,通过 kubelet 的启动参 数 --cadvisor-port 可以指定启动的端口。
- 10255 (readonly API):提供了 pod 和 node 的信息,接口以只读形式暴露出去,访问该端口 不需要认证和鉴权。
10.kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作,kube-proxy 本质上,类似一个反 向代理. 我们可以把每个节点上运行的 kube-proxy 看作 service 的透明代理兼LB.
kube-proxy 监听 apiserver 中service 与Endpoint 的信息, 配置iptables 规则,请求通过iptables 直接转 发给 pod
kube-proxy 反向代理,但是kube-proxy不执行具体的代理任务,设置iptables/ipvs路由规则,serviceVIP & iptables来实现的路由规则