谈谈对云原生应用的理解
微服务后时代是什么?炒得最火的就是Cloud Native。顾名思义,云原生就是面向云设计的应用,自从2013年Matt Stine提出概念后,更多是一套技术体系和方法论,官方定义一直在演变,但核心还是通过基础云平台、云中间件、微服务、容器编排调度、Devops的优化整合,来帮助企业提高研发效率,做到业务更快交付。
抽空读完《未来架构-从服务化到云原生》,结合笔记也谈谈对云原生的一些简单理解
目录
- 云原生诞生背景是什么?
- 云原生能帮助研发解决什么问题?
- 云原生应用的定义是什么?
- 云原生当前生态圈是怎么样的?
- 云原生生态的基石 kubernetes
云原生诞生背景是什么?
- 信息技术3个阶段:软件 -> 开源 -> 云服务
- 后台架构演进:3层MVC -> 分布式服务SOA -> 云原生架构
- 当前互联网业务核心挑战:业务快速迭代、业务组合复杂、海量用户、流量突增、7*24小时高可用(云原生必须擅长解决这些问题)
- 新技术促进分水岭:容器docker,编排调度 kubernetes
云原生能帮助研发解决什么问题?
- 参考来自Matt Stine:https://pivotal.io/cn/cloud-native
云原生应用的定义是什么?
- 云计算本质:按需分配资源和弹性计算
- 云原生应用特点:核心是利用按需分配和弹性伸缩来设计的应用,让应用更适合在云平台运行
- 云原生十二要素:Heroku团队提出的云应用设计理念
1、Codebase 基准代码:同一应用对应一份基准代码,可在各环境部署,推荐git管理
2、Dependencies 依赖:显示声明依赖组件,推荐Maven
3、Config 配置:将配置存储在环境变量,与语言和运行系统无关
4、Backing Services 后端服务:服务应作为松耦合资源,如修改配置就可把mysql切成tidb
5、Build/Release/Run 构建/发布/运行:应用发布基于基准代码的构建,保证运行和基准代码同步
6、Processes 进程:应用需作为无状态进程运行,确保水平伸缩
7、Port Build 端口绑定:通过端口绑定对外服务,而非共享内存等
8、Concurrency 并发:应用可通过水平伸缩来实现提高并发
9、Disposability 已处理:可快速启动和优雅关闭,确保云调用的服务可用性
10、Dev/Prod parity 开发和线上环境等价:保持开发、测试、现上环境等价,通过Jenkins工具规避差异
11、Log 日志:使用日志流处理,不用本地日志,推荐ELK
12、Admin Processes 管理进程:定时任务脚本也应准守这些规则 - 云原生十二要素进阶:新增3个要素
1、API first:设计出合理并且高兼容的应用接口是首要任务
2、Telemetry:可通过遥测感知应用运营状态,而不用登陆机器
3、Authentication and Authorization:建议用Oauth2.0和RBAC授权来保证应用安全
云原生当前生态圈是怎么样的?
- CNCF:2015年Google牵头创立云原生计算基金会(www.cncf.io),致力于云原生技术普及和可持续发展,发布了标志性作品k8s,也维护云原生全景图
- CNCF Landscape:https://github.com/cncf/landscape
- App Definition and Development 应用定义开发层
1、Database & Data Analytics:关系型数据oracle、mysql.. ,Nosql数据库mongodb、redis...,NewSql数据库tidb...,大数据处理hadoop、spark...
2、Streaming:消息中间件kafka、rabbitmq...,流式计算框架strom、flink....
3、SCM Software Config Management:推荐git主流
4、App Definition:解决怎么描述一个应用,没有Maven很意外
5、CI/CD:持续集成交付 jenkins、bamboo... - Orchestration & Management 编排与治理层
1、Scheduling & Orchestration:调度(资源自动合理分配)与编排(对容器内应用治理),核心就是Kubernetes...
2、Coordination & Service Discovery:提供高可用注册中心服务,zk、CoreDns、etcd...
3、Service Management:远程通信gRPC、Thrift...,反向代理Hginx、HAProxy,服务治理zuul,还有比较火的Istio Envoy也属于这个范畴 - Runtime 运行时层
1、Cloud-Native Storage:云服务分布式文件系统hdfs、ClusterFs.. 提供日志、图片、文档存放,弱化单机磁盘存储
2、Container Runtime:云原生应用选择容器作为轻量级运行载体,推荐docker主流
3、Cloud-Native Network:云原生网络解决每个容器独立IP问题,推荐CNI(Container Network Interface)容器网络接口标准 - Provisioning 供应保障层
1、Host Management / Tooling:对物理/虚拟机(Node)的管理,核心是运维工具Ansible、Puppet...
2、Infrastruction Automation:基础设施自动化工具,像Docker包管理Infrakit、简化k8s部署Helm...
3、Container Registries:容器仓库负责镜像存储分发(docker push/pull),推荐Harbor主流
4、Secure Images:提供保障镜像安全工具Clair、Twistlock...
5、Key Management:提供秘钥管理Confidant... - Cloud 云设施层
1、Public:公有云平台,像著名的AWS、Azure、阿里云、腾讯云...
2、Private:私有云方案,像vmware、openstack... - Observability and Analysis:对各层系统的监控分析
1、Monitoring:服务器指标Zabbix、容器指标CAdvisor、时序指标Prometheus、指标分析Garfana。采集->存储->分析->告警自动化流程
2、Logging:不应该写本地磁盘,推荐ELK(Elasticsearch、Logstash、Kibana)主流
3、tracing:调用链追踪,实践最有效的定位应用问题方案,推荐zipkin、jaeger...
云原生生态的基石 kubernetes
- CNCF整个技术栈都是围绕k8s建立,不仅是解决了容器的编排问题,更进一步可以说对云原生应用提供了定义规范
- kubernetes核心组件
1、K8s Master:管理配置中心
2、K8s Node:Pod运行的正真主机,一般为物理机、非k8s来管理。
3、API Server:为各角色配置和验证数据
4、etcd:配置管理
5、Controller Manager:操作管理
6、Scheduler:调度器
7、Pod:最小的操作单元,管理、创建、销毁等。对应逻辑主机,有独立ip和port。
8、Kube-Proxy:Node节点接入层
9、Kubectl:集群命令管理工具
10、cAdvisor:容器监控数据采集
11、Namespace:资源和对象操作集合,用来隔离对象: - kubernetes分层设计
1、Infrastruction:包括CRI(runtime)、CNI(network)、CSI(storage)、仓库镜像等
2、Nucleus:k8s核心api,对外构建应用,对内提供插件环境
3、Application Layer:负责部署路由,包含批处理任务、集群管理、DNS路由解析等
4、Governance Layer:负责自动化管理策略,如核心HPA等
5、Interface Layer:kubectl工具、客户端sdk - kubernetes相关原语
1、对象:在k8s中几乎一切都是对象,本质是一个持久化实体,k8s通过这些实体来描述集群(有哪些应用运行在哪些Node,使用什么资源,重启升级策略等)
2、对象描述(Spec):对象期望属性,通过.yaml文件描述,通过kubectl创建运行
3、对象状态(Status):对象实际属性,任何状况下,k8s会尽量确保Status和Spec一致
4、服务发现:解决Pod内应用寻址问题,核心Service、Ingress、Custom Load balancer3种方式
5、权限控制:k8s集群作为多租户平台,需提供网络隔离(CNI插件)、资源隔离(namespace/pod)、身份隔离(RBAC)等安全机制
6 Sidecar模式:通过松耦合Sidecar进程来辅助应用非功能需求,如流量控制、权限认证等