Top Banner
云原生技术框架与设计模式(1Cloud Native Technic Framework & Design Pattern 中山大学 数据科学与计算学院 潘茂林 [email protected]
45

云原生技术框架与设计模式( · 2020. 12. 27. · •Ansible –通过ssh 自动化执行脚本的工具 –容器仓库(Registry) •docker tag! •Docker hub...

Jan 26, 2021

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 云原生技术框架与设计模式(1)Cloud Native Technic Framework & Design Pattern

    中山大学数据科学与计算学院

    潘茂林[email protected]

  • 目录

    • 容器云原理与概念• 云计算架构模式

    – REST风格模式• Workload Balanced Pattern• Cached Pattern

    – 微服务入口模式• API Gateway Pattern• Ingress Pattern

    – 微服务安全模式• STS• 一次性密钥与授权

    – 微服务通讯模式– 微服务数据模式

  • 云原生技术栈与容器

    供给层配置自动化容器仓库安全服务

    运行层网络存储

    编排层

    应用层

  • 原理与概念

    Provisioning layer– 自动化部署与配置

    • ssh 证书登陆– ssh 客户端是公钥、私钥?Why?

    • Ansible– 通过 ssh 自动化执行脚本的工具

    – 容器仓库(Registry)• docker tag!• Docker hub 在线构建(获得墙后容器)• Local Registry(加速镜像下载)

    – 安全与密钥• 生成私钥、公钥对,X509 证书,CA证书,Token• 加密:用公钥加密消息• 解密:用私钥解密消息• 签名:用私钥签名文档• 验证:用公钥验证文档(非常快)

    证书相关文件:https://www.cnblogs.com/guogangj/p/4118605.html

    https://www.cnblogs.com/guogangj/p/4118605.html

  • 原理与概念

    Runtime Layer– 容器接口

    • 你必须知道 google 肢解 docker 的决心!

    • Docker 17.03.02 ce 是目前最兼容的版本

    – 网络接口• Cni 标准(谷歌),cnm标准(docker)

    • Flannel(法兰绒,CoreOS)

    • Calico(印花布)

    • 依赖:配置数据库(etcd 或 zookeeper)

    – 存储接口• 分布式存储方案

    • 外部高可靠存储方案

    Docker网络方案初探, https://sdk.cn/news/4060如何评估Kubernetes持久化存储方案,https://www.kubernetes.org.cn/5128.html

    https://sdk.cn/news/4060https://www.kubernetes.org.cn/5128.html

  • 原理与概念

    Orchestration & Management Layer• 分布式强一致性配置数据库

    – 运行时层、调度层都依赖的集群配置– 主要功能

    • 记录了集群内各类对象及其关系信息• 实现集群配置信息,如服务的注册、查询服务• 实现配置信息的变更的订阅服务

    – 常见的方案• etcd,consul,zookeeper• 以etcd为例:REST服务(v2)、BoltDB底层存储

    – 强一致性实现• Raft 一致性算法• Raft 原理动画,• 通常1,3,5,7个服务部署在不同的主机节点

    Etcd解析,https://jimmysong.io/kubernetes-handbook/concepts/etcd.html

    https://jimmysong.io/kubernetes-handbook/concepts/etcd.html

  • 原理与概念

    • 容器云主要概念– 资源和资源池(Resource & Resource Pool)

    • 可管理,具有生命周期的对象,如主机、容器、服务等

    – 集群(cluster):一组可共享、可管理的资源集合

    • 主机集群:由物理机或虚拟机构成的资源集群

    • 容器集群:由容器构成的资源集群

    – 节点(Node):特指云原生栈中承载容器的主机

    – 角色(Role):资源的权限集合

    • 管理(Master):承担管理集群角色的节点

    • 工人(Worker):承担承载计算负载的节点

    • 一个节点可同时拥有管理角色、工人角色

    – 标签(Label):资源的标注,用key-value表示

  • 原理与概念

    • 容器云主要概念– 容器(Container):良好隔离的进程– 服务实例(Service Instance)

    • Kubernetes 命名为 Pod:一个容器或具有相同生命周期、共享网络、存储、环境上下文的容器集合。类似“进程组”

    • 在docker swarm等中就是容器– SiderCar:附加在主容器中的子进程

    – 服务(Service)• 多个服务实例组成的集群• 通过服务发现,自动分派请求负载到实例

    – 命名空间(Namespace)• 组织服务的空间,例如:

    – kube-system 系统管理服务空间(访问该空间服务需要配证书!)– default 其他服务空间。

  • 原理与概念

    • 服务应用基础组件– 服务发现

    • CoreDNS

    – 远程调用(RPC)– 服务代理

    • Envoy

    – API 网关– 服务网格

    • LINKERD• Istio• Traefik(网关起步)

  • 原理与概念

    Foundation application layer• 数据库(集群,Scalable)

    – 关系数据库(兼容MySQL)• TiDB,Vitess,Ignite,… …

    – 非关系数据库• KV数据库(Redis),图数据库( Neo4j ),时序数据库(LevelDB)• 对象存储(Object Storage),文档,数据仓库

    • 消息与流(集群)– Kafka,RabbitMQ

    • 应用程序管理– Helm

    • CI/CD– PipeLine(Drone,Wercker)– Testing(Jenkins,Travis CI)

  • Kubernetes的概念

    • 参见:

    – Kuber 官方文档

    – https://kubernetes.io/docs/concepts/

    – Kubernetes中文指南/云原生应用架构实践手册

    – https://jimmysong.io/kubernetes-handbook/

    • 师兄推荐(实践)

    – K3S,单机上可以跑的Kubernetes(2019.2发布)

    https://kubernetes.io/docs/concepts/https://jimmysong.io/kubernetes-handbook/

  • Kubernetes的概念

    • 什么是Kubernetes?Kubernetes is a portable, extensible, open-source platform for managing containerized workloads and services, that facilitates both declarativeconfiguration and automation.

    • 能做什么?Kubernetes provides you with a framework to run distributed systems resiliently. It takes care of scaling and failover for your application, provides deployment patterns.– Service discovery and load balancing– Storage orchestration– Automated rollouts and rollbacks– Automatic bin packing– Self-healing– Secret and configuration management

    • Kubernetes = Containerized Application Operation System?– 运行容器化程序的集群,管理容器、CPU、存储、网络、安全等

    https://kubernetes.io/docs/concepts/overview/

    https://kubernetes.io/docs/concepts/overview/

  • Kubernetes的概念

    • Kubernetes的部件(Control Plane)

    https://kubernetes.io/docs/concepts/overview/components/

    https://kubernetes.io/docs/concepts/overview/components/

  • Kubernetes的概念

    • 系统部件

    • Master角色– 1,3,5,7 个节点

    – 集群管理 API 服务(REST)

    – 配置数据库(etcd REST/gRPC)

    – 集群控制服务

    – 调度服务

    • 外围客户端– 集群管理命令(kubectl)

  • Kubernetes的概念

    • 工人角色– 任意节点数

    – 节点与容器管理 kubelet 集成 cAdvisor 收集节点与容器的指标

    – 网络代理 Proxy 用于实现 Service 概念

    • 辅助部件– DNS服务

    – Ingress服务

    – Logging 服务

    – Dashboard

  • Kubernetes的概念

    • Kubernetes 基本对象– Pod 一组容器,共享存储、网络等(进程组)– Service 一个接口资源,由一组 pod 实现– Volume 卷(容器外挂文件系统)– Namespace 命名空间,虚拟的 pod 网络集群(default,

    kube-system,kube-public)

    • Kubernetes 控制基本对象的抽象概念– Deployment 部署,修改 pod 等的申明– DaemonSet 每个worker Node 的单实例(每个节点必须有且

    仅能有一个的 pod 申明)– ReplicaSet 可复制的服务– StatefulSet 有状态的服务– Job 执行结束就退出的 pod

    https://kubernetes.io/docs/concepts/overview/working-with-objects/

    https://kubernetes.io/docs/concepts/overview/working-with-objects/

  • Kubernetes的概念

    • Kubernetes 对象的申明与身份(Spec & Status)= 配置

  • Kubernetes的概念

    • Service 的定义

    – selector : 一般情况必须的 Label,除非为多个应用提供服务– ports :服务端口

    https://kubernetes.io/docs/concepts/services-networking/service/

    https://kubernetes.io/docs/concepts/services-networking/service/

  • Kubernetes的概念

    • 云原生服务发现(IPVS)技术

    https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

    注意:Kubernetes 有三种服务发现模式(按版本):用户空间代理;iptable 代理;IPVS代理(stable)

    2. 为什么不用动态 DNS 发现服务?

    1. 服务的虚拟IP称为 clusterIP

    3. 它是 L4 ,L7 路由?

    4. 每一代解决了上一代哪些问题?

    https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

  • Kubernetes的概念

    • 服务的 EndPoint 与端口– Port:容器(container)内部端口

    – Target Port :服务实例(pod)暴露的端口

    – Cluster IP :服务的虚拟 IP,仅能集群内访问。一般不需要指定值

    NodePort,LoadBalancer还是Ingress?我该如何选择,https://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg

    https://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg

  • Kubernetes的概念

    • 服务的 EndPoint 与端口– NodePort服务:服务暴露在主机端口

    • 一个端口只能一个服务,范围只能在 30000-32767

  • Kubernetes的概念

    • 服务的 EndPoint 与端口– Ingress服务:它是特殊的服务,在多个服务前面充当“智能路由”

    的角色,或者是集群的入口。(7层路由)

  • REST 风格架构与应用模式

    • 面向资源的分层系统– 易理解、易使用、易管理

    – 易标准化、易扩展

    – 高可靠、高弹性

    • 易于云上部署– 丰富的客户端支持

    – 天生微服务架构

  • REST 风格架构与应用模式

    • Simplest RESTful Multi-Tier Application

    – 经典的三层应用

    – 简单,实用

    部署云上技术选择:• 虚拟机(IaaS,Go)或容器• MVC框架(nodejs,VUE)• 关系数据库 MySQL

  • REST 风格架构与应用模式

    • 负载均衡模式(Workload Balanced Pattern )

    部署云上技术选择:• 虚拟机(IaaS,Go)

    • 服务是无状态的• k 是常数

    • MVC框架(nodejs,VUE)• 关系数据库 MySQL• 负载均衡器 L4/L7(F5,nginx,haproxy,LVS)• 对象存储(S3, Redis)

    • 限制:• 无状态服务• 流量预知

    • 优势:• 简单

    • 劣势• 巨石应用(都是S1)• 数据库访问负载大• 网络流量大

  • REST 风格架构与应用模式

    • L4/L7 负载均衡技术– 基本原理

    • L4负载均衡:使用 Virtual IP 作为入口,在 TCP 连接请求时选择负载节点构建 TCP 连接

    • L7负载均衡:可以根据应用内容,制定策略选择节点

    – 实现方法

    • 动态DNS负载均衡

    • 反向代理负载均衡(L7)

    – 会话

    • IP负载均衡(LVS-NAT)

    • 直接路由(LVS-DR)

    • http重定向

    L4和L7负载均衡原理,https://blog.csdn.net/AhhSong/article/details/80900489

    https://blog.csdn.net/AhhSong/article/details/80900489

  • REST 风格架构与应用模式

    • 缓存模式(Cached Pattern)

    • 静态网页、图片缓存• 对象缓存(Jcache,Guava,boltDB……)• 对象数据分布式缓存/Session存储/共享缓存(Redis)

    经典的web应用三层架构模型

  • REST 风格架构与应用模式

    • 合理缓存设计可以数倍提升系统整体性能– 缓存特指数据放在内存,以提升访问速度

    – 不会对系统产生侵入式影响

    • Balancer端缓存(网页/图片缓存,详情页90%流量)

    图:淘宝图片服务多层负载均衡与缓存机制的设计与实现

    揭秘淘宝286亿海量图片存储与处理架构,http://storage.it168.com/a2010/0829/1096/000001096373_all.shtml

    http://storage.it168.com/a2010/0829/1096/000001096373_all.shtml

  • REST 风格架构与应用模式

    • Balancer端负载均衡与缓存设计要点– CDN,使得不同区域用户就近访问

    – L4均衡高效,但无法缓存网页或图片

    – L7均衡

    • 本身具有一定缓存能力

    • 根据协议内容实现内容调度

    • 擅长路由管理的均衡器,构成 L1 Cache

    – 例如:让同一图片不同 snap 分派在同一 L2 缓存

    • 擅长缓存管理的缓存服务器,构成 L2 Cache

    – 协议 URL 和 head 设计对于 L7 策略设计至关重要

    – 问题:容器镜像服务如何均衡与缓存?

  • REST 风格架构与应用模式

    • 理解 Browser 缓存行为– 强缓存

    • Browser如果未命中缓存,向服务器请求资源• 返回 Expires 或者 Cache-Control ,资源加入缓存

    – 协商缓存• 协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-

    None-Match】• 资源返回 Last-Modified 或 Etag• 资源不是强缓存且在缓存中,请求带f-Modified-Since 或 If-None-Match• 服务器返回 304 Not Modified,缓存有效• 坑,要点!

    – 分布式系统尽量关闭掉ETag(每台机器生成的ETag都会不一样)– 利用刷新网页跳过缓存

    – 网页静动资源分离设计• 按资源生命周期分离资源• 使用 JavaScript 或异步脚本(Ajax)加载动态资源

    浏览器缓存知识,http://web.jobbole.com/84888/

    http://web.jobbole.com/84888/

  • REST 风格架构与模式

    • 对象缓存– 用 DAO(Data Access Objects) 模式访问实体对象

    • 将实体对象的 CRUD 操作逻辑封装在对应的DAO对象中,以屏蔽复杂的数据操作,如连接、SQL、ORM等技术细节

    – 用代理(proxy)模式处理缓存• 使用透明代理访问资源• 即:添加缓存并保持资源 DAO 接口不变

    – Local 缓存和 shared 缓存• 一般来说,local 缓存使用强制策略,即过期时间• Shared 缓存采用 write through 等写策略

    – 对象缓常见问题• 一个对象在REST风格应用中会存在多个副本,会产生不一致• 如果对象生存周期由客户端决定,需要扩展 http 协议

  • 微服务架构应用模式

    • 微服务架构来源(早期微服务架构唯一的选择)– Netflix OSS (Java)框架

    – Spring Cloud (Java)框架

    • 什么是 Spring Cloud?Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state).

    • Spring Cloud 与 kubernetes– 早期微服务应用部署在虚拟机集群上,必须自己实现基础服务

    – 云原生就是容器化分布式应用,大部分基础模式平台实现了

  • 微服务架构 API 网关

    • API Gateway ,鸡肋?– 来源与 Netflix OSS 框架的一个组件

    • Eureka(Service Registry)

    • Netflix Zuul(API Edge Service)

    • Hystrix(Latency and Fault Tolerance Service)

    • Ribbon(Inter Process Communication With Built in software load balancers )

  • 微服务架构 API 网关

    • API Gateway 原理

    • API Gateway 的缺陷– 集中太多功能,成为新的中心

    – 太重!不利于扩展新服务

    – 许多服务与云平台基础服务重叠,如服务发现、弹性控制器,入口控制器

  • 微服务架构入口模式

    • 入口模式(Ingress/Gateway-Routing* Pattern)– 问题描述

    • 客户端需要与多个服务交互,每个服务设置入口会使用大量集群资源(端口),也带来管理的复杂性。 例如,电子商务客户端可以提供搜索、评价、购物车、结账和订单历史记录等服务。

    – 解决方案• 使用 L7 负载均衡器,按URL分配流量(Traffic)到对应的服务

    • 云平台需要提供一个入口规则控制器,告知 L7负载均衡器

    • 入口控制器(Ingress Controller)通过Manage API 收集服务的配置与健康状态,动态修改负载均衡器的配置

    – 优势• 支持多个域名(Http1.1,Http2)

    • 支持 TLS

    • 支持服务不停机更新

    * 术语来源:微软云设计模式,https://docs.microsoft.com/zh-cn/azure/architecture/patterns/

    https://docs.microsoft.com/zh-cn/azure/architecture/patterns/

  • 微服务架构入口模式

    • Ingress原理与Kubernetes的配置

    • Balancer与Ingress Controller 的实现– 除了 Nginx ,traefik, Envey,Amazon LBS,… …

  • 微服务架构入口模式

    • 一个简单Ingress资源配置

    https://kubernetes.io/docs/concepts/services-networking/ingress/

    https://kubernetes.io/docs/concepts/services-networking/ingress/

  • 微服务架构入口模式

    • Ingress 控制器– 由第三方厂商开发的入口服务与使用资源的服务

    • 例如:traefik(go 语言, https://docs.traefik.io/ )

    https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

    https://docs.traefik.io/https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

  • 入口模式 pk API网关

    • Ingress 入口– 路由与负载均衡– HTTPS & TLS– 与集群集成

    • API 网关– 基本认证(内部、授信的应用认证的方法)– 断路管理– 缓存,流量限制– 压缩,内容过滤– 监控数据采集

    • 商业 API 网关(是交智商税吗?)– 阿里云,API 网关,

    • https://help.aliyun.com/product/29462.html

    – 华为云,API网关 APIG• https://support.huaweicloud.com/intl/zh-cn/productdesc-apig/zh-

    cn_topic_0080101651.html

    https://help.aliyun.com/product/29462.htmlhttps://support.huaweicloud.com/intl/zh-cn/productdesc-apig/zh-cn_topic_0080101651.html

  • 微服务架构安全模式

    • Token– 由可信的授权方或服务签发的证书

    • HTTP 认证框架(RFC 7235)– https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication

    – Bearer 方式(RFC 6750)• https://tools.ietf.org/html/rfc6750#section-2.1

    • 优势:CORS,CSRF,无状态,分布式验证,SSO,一次性授权

    • Token 实现技术之一– JWT(JSON Web Token)– 用于双方申明式安全的开放、工业标准(RFC7519)

    • https://jwt.io/introduction

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Authenticationhttps://tools.ietf.org/html/rfc6750#section-2.1https://jwt.io/introduction

  • 微服务架构安全模式

    • STS认证模式(STS Authority/ Federated Identity Pattern)– 问题描述

    • 为了支持微服务动态扩展,急需安全、单点的分布式用户认证与授权

    – 解决方案• STS(安全令牌服务/Security Token Service)

  • 微服务架构安全模式

    • STS认证模式优势– 客户端一次认证,证书在同一App的服务中都有效– 一个集群可以利用认证,逻辑上划分若干安全的端口安全的应用– 一个STS可以服务多个应用,也可以一个应用一个STS

    • 需要注意的问题– 一个证书必须有短的有效期– 客户端能必须存储这个证书– 注意证书是明文,生产系统必须使用https协议– 由于客户端与服务之间存在 Https->http转换

    • 请正确设置 Nginx• 设置强制使用https访问

    • STS实现技术– JWT– RSA

    https访问遇到“已阻止载入混合活动内容” https://segmentfault.com/a/1190000015722535

    https://segmentfault.com/a/1190000015722535

  • 微服务架构安全模式

    • Valet Key pattern(附属密钥模式)

    – 与STS身份认证的区别

    – 如何实现?

  • 微服务架构基本模式练习

    • 案例研究

    – 请在 docker(单机)或 Kubernetes 上实现如下应用

  • 微服务架构安全模式

    • 阿里云,应用身份服务– 应用身份服务IDaaS是阿里云为企业用户提供的一套集中式身份、权限、应用管理服务,帮助您整合部署在本地或云端的内部办公系统、业务系统及三方SaaS系统的所有身份,实现一个账号打通所有应用服务。

    – https://help.aliyun.com/product/111120.html

    • 华为云,统一身份认证服务– 统一身份认证(Identity and Access Management,简称

    IAM)是华为云提供权限管理的基础服务,可以帮助您安全地控制华为云服务和资源的访问权限。

    – IAM无需付费即可使用。– https://support.huaweicloud.com/iam/index.html

    https://help.aliyun.com/product/111120.htmlhttps://support.huaweicloud.com/iam/index.html