云原生技术概览
书籍:https://jimmysong.io/kubernetes-handbook/
从云计算到微服务再到云原生计算
下面将从云计算的发展历程引入云原生计算
云计算介绍
云计算演进历程
云计算就是一种配置资源的方式,根据资源配置方式的不同我们可以把云计算从宏观上分为以下三种类型:
- IaaS:这是为了想要建立自己的商业模式并进行自定义的客户,例如亚马逊的EC2、S3存储、Rackspace虚拟机等都是IaaS。
- PaaS:工具和服务的集合,对于想用它来构建自己的应用程序或者想快速得将应用程序部署到生产环境而不必关心底层硬件的用户和开发者来说是特别有用的,比如Cloud Foundry、Google App Engine、Heroku等。
- SaaS:终端用户可以直接使用的应用程序。这个就太多,我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务,有的服务是免费的,比如Google Docs,还有更多的是根据我们购买的Plan和使用量付费,比如GitHub、各种云存储。
微服务介绍
Microservices微服务是一种分布式架构设计理念,为了推动细粒度服务的使用,这些服务要能协同工作,每个服务都有自己的生命周期。一个微服务就是一个独立的实体,可以独立的部署在PAAS平台上,也可以作为一个独立的进程在主机中运行。服务之间通过API访问,修改一个服务不会影响其它服务。
要想了解微服务的详细内容推荐阅读《微服务设计》(Sam Newman著) 微服务设计读书笔记。
Kubernetes的service天生就适合于微服务。
云原生介绍
上云以后,效率并没有变得更高,故障也没有迅速定位。
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。
云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。云原生也很好地解释了云上运行的应用应该具备什么样的架构特性——敏捷性、可扩展性、故障可恢复性。
综上所述,云原生应用应该具备以下几个关键词:
- 敏捷
- 可靠
- 高弹性
- 易扩展
- 故障隔离保护
- 不中断业务持续更新
以上特性也是云原生区别于传统云应用的优势特点。
Kubernetes与云原生的关系
Kuberentes可以说是乘了Docker和微服务的东风,
Kubernetes设计时是按照十二因素应用法则
Kubernetes用户可以通过编写一个yaml或者json格式的配置文件,也可以通过工具/代码生成或直接请求Kubernetes API创建应用,该配置文件中包含了用户想要应用程序保持的状态,不论整个Kubernetes集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求Kubernetes API来改变应用程序的状态。
12因素应用
12因素应用提出已经有几年的时间了,每个人对其可能都有自己的理解,切不可生搬硬套,也不一定所有云原生应用都必须符合这12条法则,其中有几条法则可能还有点争议,有人对其的解释和看法不同。
不要孤立的看每一个因素,将其与自己软件开发流程联系起来,这12个因素大致就是按照软件从开发到交付的流程顺序来写的。
- 基准代码:每个代码仓库(repo)都生成docker image保存到镜像仓库中,并使用唯一的ID管理,在Jenkins中使用编译时的ID。
- 依赖:显式的声明代码中的依赖,使用软件包管理工具声明,比如Go中的Glide。
- 配置:将配置与代码分离,应用部署到Kubernetes中可以使用容器的环境变量或ConfigMap挂载到容器中。
- 后端服务:把后端服务当作附加资源,实质上是计算存储分离和降低服务耦合,分解单体应用。
- 构建、发布、运行:严格分离构建和运行,每次修改代码生成新的镜像,重新发布,不能直接修改运行时的代码和配置。
- 进程:应用程序进程应该是无状态的,这意味着再次重启后还可以计算出原先的状态。
- 端口绑定:在Kubernetes中每个Pod都有独立的IP,每个运行在Pod中的应用不必关心端口是否重复,只需在service中指定端口,集群内的service通过配置互相发现。
- 并发:每个容器都是一个进程,通过增加容器的副本数实现并发。
- 易处理:快速启动和优雅终止可最大化健壮性,Kuberentes优秀的Pod生存周期控制。
- 开发环境与线上环境等价:在Kubernetes中可以创建多个namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像的使用可以很方便的部署一个后端服务。
- 日志:把日志当作事件流,使用stdout输出并收集汇聚起来,例如到ES中统一查看。
- 管理进程:后台管理任务当作一次性进程运行,
<font style="color:#F5222D;background-color:#FADB14;">kubectl exec</font>
进入容器内部操作。
另外,Cloud Native Go 这本书的作者,CapitalOne公司的Kevin Hoffman在TalkingData T11峰会上的High Level Cloud Native的演讲中讲述了云原生应用的15个因素,在原先的12因素应用的基础上又增加了如下三个因素:
API优先
- 服务间的合约
- 团队协作的规约
- 文档化、规范化
- RESTful或RPC
监控
- 实时监控远程应用
- 应用性能监控(APM)
- 应用健康监控
- 系统日志
- 不建议在线Debug
认证授权
- 不要等最后才去考虑应用的安全性
- 详细设计、明确声明、文档化
- Bearer token、OAuth、OIDC认证
- 操作审计
详见High Level Cloud Native From Kevin Hoffman。
Kubernetes中的资源管理与容器设计模式
容器生态
关于 Docker 容器的更多内容请参考 Docker最佳实践。
容器的设计模式
Kubernetes提供了多种资源对象,用户可以根据自己应用的特性加以选择。这些对象有:
类别 | 名称 |
---|---|
资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaler |
配置对象 | Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、CustomResourceDefinition、 ServiceAccount |
存储对象 | Volume、Persistent Volume |
策略对象 | SecurityContext、ResourceQuota、LimitRange |
在 Kubernetes 系统中,Kubernetes 对象 是持久化的条目。Kubernetes 使用这些条目去表示整个集群的状态。
Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 期望状态。
详见Kubernetes Handbook - Objects。
资源限制与配额
两层的资源限制与配置
- Pod级别,最小的资源调度单位
- Namespace级别,限制资源配额和每个Pod的资源使用区间
请参考Kubernetes中的ResourceQuota和LimitRange配置资源限额
管理Kubernetes集群
手工部署Kubernetes是一个很艰巨的活,你需要了解网络配置、Docker的安装与使用、镜像仓库的构建、角色证书的创建、Kubernetes的基本原理和构成、Kubernetes应用程序的yaml文件编写等。
部署Kubernetes集群
使用二进制部署 kubernetes
集群的所有组件和插件,而不是使用 kubeadm
等自动化方式来部署集群,同时开启了集群的TLS安全认证,这样可以帮助我们了解系统各组件的交互原理,进而能快速解决实际问题。
详见在CentOS上部署Kubernetes集群。****
服务发现与负载均衡
Kubernetes中的负载均衡大致可以分为以下几种机制,每种机制都有其特定的应用场景:
- Service:直接用Service提供cluster内部的负载均衡,并借助cloud provider提供的LB提供外部访问
- Ingress:还是用Service提供cluster内部的负载均衡,但是通过自定义LB提供外部访问
- Service Load Balancer:把load balancer直接跑在容器中,实现Bare Metal的Service Load Balancer
- Custom Load Balancer:自定义负载均衡,并替代kube-proxy,一般在物理部署Kubernetes时使用,方便接入公司已有的外部服务
详见Kubernetes Handbook - 服务发现与负载均衡。
持续集成与发布
使用Jenkins进行持续集成与发布流程图
应用构建和发布流程说明:
- 用户向Gitlab提交代码,代码中必须包含
Dockerfile
- 将代码提交到远程仓库
- 用户在发布应用时需要填写git仓库地址和分支、服务类型、服务名称、资源数量、实例个数,确定后触发Jenkins自动构建
- Jenkins的CI流水线自动编译代码并打包成Docker镜像推送到Harbor镜像仓库
- Jenkins的CI流水线中包括了自定义脚本,根据我们已准备好的Kubernetes的YAML模板,将其中的变量替换成用户输入的选项
- 生成应用的Kubernetes YAML配置文件
- 更新Ingress的配置,根据新部署的应用的名称,在Ingress的配置文件中增加一条路由信息
- 更新PowerDNS,向其中插入一条DNS记录,IP地址是边缘节点的IP地址。关于边缘节点,请查看边缘节点配置
- Jenkins调用Kubernetes的API,部署应用
日志收集与监控
基于现有的ELK日志收集方案,稍作改造,选用filebeat来收集日志,可以作为sidecar的形式跟应用运行在同一个Pod中,比较轻量级消耗资源比较少。
filebeat日志收集架构图
详见Kubernetes Handbook - 应用日志收集。
安全性与权限管理
Kubernetes是一个多租户的云平台,因此必须对用户的权限加以限制,对用户空间进行隔离。Kubernetes中的隔离主要包括这几种:
- 网络隔离:需要使用网络插件,比如flannel, calico。
- 资源隔离:kubernetes原生支持资源隔离,pod就是资源隔离和调度的最小单位,同时使用namespace限制用户空间和资源限额。
- 身份隔离:使用RBAC-基于角色的访问控制,多租户的身份认证和权限控制。
如何开发Kubernetes原生应用步骤介绍
当我们有了一个kubernetes集群后,如何在上面开发和部署应用,应该遵循怎样的流程?
下面展示如何使用go语言开发和部署一个Kubernetes native应用,使用wercker进行持续集成与持续发布,我将以一个很简单的前后端访问,获取伪造数据并展示的例子来说明。
云原生应用开发示例
- 服务API的定义
- 使用Go语言开发Kubernetes原生应用
- 一个持续构建与发布工具与环境
- 使用traefik和VIP做边缘节点提供外部访问路由
两个示例用于演示,开发部署一个伪造的 metric 并显示在 web 页面上,包括两个service:
- k8s-app-monitor-test:生成模拟的监控数据,发送http请求,获取json返回值
- K8s-app-monitor-agent:获取监控数据并绘图,访问浏览器获取图表
定义API生成API文档
使用API blueprint
格式,定义API文档,格式类似于markdown,再使用aglio生成HTML文档。
详见:如何开发部署Kubernetes Native应用。
如何迁移到云原生应用架构
云原生应用架构适用于异构语言的程序开发,不仅仅是针对 Java 语言的程序开发。kubernetes 引领容器编排潮流,和 Service Mesh 技术(如 Linkerd 和 Istio) 的出现,Go 语言的兴起(参考另一本书 Cloud Native Go)等为我们将应用迁移到云原生架构的提供了更多的方案选择。
迁移到云原生应用架构指南
主要讨论的应用程序架构包括:
- 十二因素应用程序:云原生应用程序架构模式的集合
- 微服务:独立部署的服务,只做一件事情
- 自助服务的敏捷基础设施:快速,可重复和一致地提供应用环境和后台服务的平台
- 基于API的协作:发布和版本化的API,允许在云原生应用程序架构中的服务之间进行交互
- 抗压性:根据压力变强的系统
详见:迁移到云原生应用架构
迁移案例解析
迁移步骤示意图如下:
步骤说明:
- 将原有应用拆解为服务
- 定义服务的接口/API通信方式
- 编写启动脚本作为容器的进程入口
- 准备应用配置文件
- 容器化、制作镜像
- 准备Kubernetes YAML文件
- 如果有外置配置文件需要创建ConfigMap或Secret存储
详见:迁移传统应用到Kubernetes步骤详解——以Hadoop YARN为例。
Service Mesh基本原理和示例介绍
Service Mesh现在一般被翻译作服务网格,目前主流的Service Mesh有如下几款:
- Istio:IBM、Google、Lyft共同开源,详细文档见Istio官方文档
- Linkerd:原Twitter工程师开发,现为CNCF中的项目之一
- Envoy:Lyft开源的,可以在Istio中使用Sidecar模式运行
- Conduit:同样由Buoyant开源的轻量级的基于Kubernetes的Service Mesh
此外还有很多其它的Service Mesh鱼贯而出,请参考awesome-cloud-native。
什么是Service Mesh
如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关心服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。
service mesh架构图
详见什么是 Service Mesh - jimmysong.io。
Service Mesh使用指南
两款Service Mesh各有千秋
- 微服务管理框架Service Mesh——Linkerd安装试用笔记
- 微服务管理框架Service Mesh——Istio安装试用笔记
更多关于 Service Mesh 的内容请访问 ServiceMesher 社区网站。
使用案例--DevOps
真正践行DevOps,让开发人员在掌握自己的开发和测试环境,让环境一致,让开发效率提升,让运维没有堆积如山的tickets,让监控更加精准,从Kubernetes平台开始。
- 根据环境(比如开发、测试、生产)划分
<font style="color:#F5222D;background-color:#FADB14;">namespace</font>
,也可以根据项目来划分 - 再为每个用户划分一个
namespace
、创建一个serviceaccount
和kubeconfig
文件,不同namespace
间的资源隔离,目前不隔离网络,不同namespace
间的服务可以互相访问 - 创建yaml模板,降低编写Kubernetes yaml文件编写难度
- 在
kubectl
命令上再封装一层,增加用户身份设置和环境初始化操作,简化kubectl
命令和常用功能 - 管理员通过dashboard查看不同
namespace
的状态,也可以使用它来使操作更便捷 - 所有应用的日志统一收集到ElasticSearch中,统一日志访问入口
- 可以通过Grafana查看所有namespace中的应用的状态和kubernetes集群本身的状态
- 需要持久化的数据保存在分布式存储中,例如GlusterFS或Ceph中
- 使用Kibana查看日志:日志字段中包括了应用的标签、容器名称、主机名称、宿主机名称、IP地址、时间
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937178.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!