目录

1、云计算

2、微服务

3、云原生

3.1、思维导图

3.2、特点

3.3、云原生架构的四类设计原则

3.4、12个过程阶段

4、管理

4.1、服务发现与负载均衡

4.2、持续集成与发布

4.3、日志收集与监控

4.4、安全性与权限管理

5、云原生应用过程

6、迁移上云原生架构


1、云计算

云计算就是一种配置资源的方式,根据资源配置方式的不同

可以把云计算从宏观上分为以下三种类型:

IaaS:这是为了想要建立自己的商业模式并进行自定义的客户,例如亚马逊的EC2、S3存储、Rackspace虚拟机等都是IaaS。

PaaS:工具和服务的集合,对于想用它来构建自己的应用程序或者想快速得将应用程序部署到生产环境而不必关心底层硬件的用户和开发者来说是特别有用的,比如Cloud Foundry、GoogleApp Engine、Heroku等。

SaaS:终端用户可以直接使用的应用程序。我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务。

2、微服务

微服务是一种分布式架构设计理念,为了推动细粒度服务的使用,这些服务要能协同工作,每个服务都有自己的生命周期。

一个微服务就是一个独立的实体,可以独立的部署在PAAS平台上,也可以作为一个独立的进
程在主机中运行。服务之间通过API访问,修改一个服务不会影响其它服务。

3、云原生

3.1、思维导图

3.2、特点

为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题。云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。

敏捷
可靠
高弹性
易扩展
故障隔离保护
不中断业务持续更新

3.3、云原生架构的四类设计原则

  1. 服务化:通过将应用拆分为多个独立的、可复用的服务,实现服务的松耦合和独立部署。这有助于提高系统的可维护性和可扩展性。

  2. 弹性:系统能够根据负载情况自动调整资源分配,确保在高并发场景仍能保持稳定的性能。

  3. 可观测性:通过监控和日志收集等手段,实时了解系统的运行状态和性能指标,以便及时发现和解决问题。

  4. 自动化:利用自动化工具和流程,减少人工干预,提高系统的部署、升级和维护效率。

在项目中的应用
  1. 服务化改造:我们将平台拆分为用户服务、xx服务、xx服务等多个微服务。每个服务都独立部署在容器中,并通过服务网格进行通信。这种架构使得我们可以独立地对每个服务进行开发和部署,提高了开发效率。

  2. 弹性扩展:我们利用Kubernetes等容器编排工具,实现了系统的弹性扩展。当系统负载增加时,可以自动增加容器实例数,以提高处理能力;当负载减少时,则可以自动减少容器实例数,以节省资源。

  3. 可观测性实现:我们引入了Prometheus等监控工具,对系统的运行状态和性能指标进行实时监控。同时,我们还使用了ELK(Elasticsearch、Logstash、Kibana)日志收集和分析系统,对系统的日志进行收集、存储和分析。这些工具帮助我们及时发现和解决了系统中的问题。

  4. 自动化部署与运维:我们利用Jenkins等自动化工具,实现了代码的自动构建、测试和部署。同时,我们还引入了Ansible等自动化运维工具,实现了系统的自动化配置和管理。这些工具减少了人工干预,提高了系统的稳定性和可靠性。

3.4、12个过程阶段

1.基准代码
每个代码仓库(repo)都生成docker image保存到镜像仓库中,并使用唯一的ID管理,在
Jenkins中使用编译时的ID。

2.依赖
显式得声明代码中的依赖,使用软件包管理工具声明,比如Go中的Glide。

3.配置
将配置与代码分离,应用部署到kubernete中可以使用容器的环境变量或ConfigMap挂载到容器
中。

4.后端服务
把后端服务当作附加资源,实质上是计算存储分离和降低服务耦合,分解单体应用。

5.构建、发布、运行
严格分离构建和运行,每次修改代码生成新的镜像,重新发布,不能直接修改运行时的代码和配置。

6.进程
应用程序进程应该是无状态的,这意味着再次重启后还可以计算出原先的状态。

7.端口绑定
在kubernetes中每个Pod都有独立的IP,每个运行在Pod中的应用不必关心端口是否重复,只需在
service中指定端口,集群内的service通过配置互相发现。

8.并发
每个容器都是一个进程,通过增加容器的副本数实现并发。

9.易处理
快速启动和优雅终止可最大化健壮性,kuberentes优秀的Pod生存周期控制。

10.开发环境与线上环境等价
在kubernetes中可以创建多个namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像
的使用可以很方便的部署一个后端服务。

11.日志
把日志当作事件流,使用stdout输出并收集汇聚起来,例如到ES中统一查看。

12.管理进程
后台管理任务当作一次性进程运行, kubectl exec  进入容器内部操作。

13.API优先
服务间的合约
团队协作的规约
文档化、规范化
RESTful或RPC

14.监控
实时监控远程应用
应用性能监控(APM)
应用健康监控
系统日志
不建议在线Debug

15.认证授权
不要等最后才去考虑应用的安全性
详细设计、明确声明、文档化
Bearer token、OAuth、OIDC认证
操作审计

4、管理

4.1、服务发现与负载均衡

Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,
并通过kube-proxy配合cloud provider来适应不同的应用场景。随着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时使用,方便接入公司已有的外部服务

4.2、持续集成与发布

应用构建和发布流程:
1. 用户向Gitlab提交代码,代码中必须包含 Dockerfile

2. 将代码提交到远程仓库

3. 用户在发布应用时需要填写git仓库地址和分支、服务类型、服务名称、资源数量、实例数
确定后触发Jenkins自动构建

4. Jenkins的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库

5. Jenkins的CI流水线中包括了自定义脚本,根据我们已准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项

6. 生成应用的kubernetes YAML配置文件

7. 更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息

8. 更新PowerDNS,向其中插入一条DNS记录,IP地址是边缘节点的IP地址。关于边缘节
点,请查看边缘节点配置

9. Jenkins调用kubernetes的API,部署应用

4.3、日志收集与监控

基于现有的ELK日志收集方案,稍作改造,选用filebeat来收集日志,可以作为sidecar的形式跟
应用运行在同一个Pod中,比较轻量级消耗资源比较少。

4.4、安全性与权限管理

Kubernetes是一个多租户的云平台,因此必须对用户的权限加以限制,对用户空间进行隔离。
Kubernetes中的隔离主要包括这几种:
网络隔离:需要使用网络插件,比如calico。
资源隔离:kubernetes原生支持资源隔离,pod就是资源就是隔离和调度的最小单位,同时使
用namespace限制用户空间和资源限额。
身份隔离:使用RBAC-基于角色的访问控制,多租户的身份认证和权限控制。

5、云原生应用过程

1. 服务API的定义
2. 使用Go语言开发kubernetes原生应用
3. 一个持续构建与发布工具与环境
4. 使用traefik和VIP做边缘节点提供外部访问路由

6、迁移上云原生架构

1. 将原有应用拆解为服务
2. 容器化、制作镜像
3. 准备应用配置文件
4. 准备kubernetes YAML文件
5. 编写bootstarp脚本
6. 创建ConfigMaps

设计要点:

十二因素应用程序:云原生应用程序架构模式的集合
微服务:独立部署的服务,只做一件事情
自助服务的敏捷基础设施:快速,可重复和一致地提供应用环境和后台服务的平台
基于API的协作:发布和版本化的API,允许在云原生应用程序架构中的服务之间进行交互
抗压性:根据压力变强的系统

参考文章

Kubernetes 基础教程 · Jimmy Song

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐