分布式引用程序的需求

image.png

  • 生命周期
  • 网络
  • 状态
  • 绑定

    多运行时微服务

    image.png

  • 生命周期管理: kubernetes

  • 网络: serviceMesh
  • 绑定: Knative(并非FAAS)
    • 专注于ServerLess,同时兼顾了服务编排和事件驱动的绑定需求
  • 状态: Dapr
    • 建立在kubernetes,knative和服务网格的思想之上,并深入应用程序运行时已解决状态化工作负载,绑定和集成的需求,充当现代分布式中间件

image.png

Serverless

  1. 众所周知的云计算模型

image.png

场景模拟

  • 如今,大多数公司在开发应用程序并将其部署、运行在服务器上的时候(无论是选择公有云还是私有的数据中心),都需要提前完成如下步骤
    • 容量规划:提前了解究竟需要多少台服务器、多大容量的存储和数据库的功能等
    • 部署运行应用程序和依赖的软件
  • 概括来说,需要构建一个新的软件项目时,在编写代码之前,在IaaS或CaaS云环境下,需要完成

    • 准备Server
      • 登录云控制台
      • 创建实例
      • 启用实例
      • 选择操作系统
      • 确定实例规格和类型
      • 配置实例详细信息:数量、网络、IP地址、监控和其它扩展
      • 添加持久存储
      • 安全设置
    • 设定中间件和数据库等支撑系统
      • 选择云供应商提供的服务或自行部署及管理

        serverless基础

  • Serverless的基础概念

    • 云原生开发模型的一种,可使开发人员专注于构建和运行应用,而无需管理服务器
    • Serverless方案中仍然需要服务器,但它们已从应用开发人员的关注中抽离了出来
      • 云提供商负责置备、维护和扩展服务器基础架构等例行工作
      • 开发人员可以简单地将代码打包到容器中进行部署
      • 部署之后,无服务器应用即可响应需求,并根据需要自动扩容
    • 用户为实际占用的资源付费,而不再是固定的带宽或者服务器数量
  • Serverless与其它云计算模型的核心区别
    • 由云服务商负责管理基础架构和应用扩展
    • 应用部署于容器中,这些容器在被调用时将会自动按需启动
      • 出现能够触发应用代码运行的事件时,云架构才会为这一代码分配资源
      • 代码执行结束后,占用的大部分资源便即释放
      • 帮助公司避免服务器等资源的过渡采购,提高资源效益
    • 操作系统、文件系统、安全补丁、负载均衡、容量管理、扩展、日志和监控等例行任务都由底层的云服务完成,从而将开发人员从应用扩展和服务器置备相关的琐碎日常任务中解放出来
  • 现代应用架构通常是Serverless、Microservices和传统分布式应用的混合模式

  • Serverless产品通常可分为两类

    • BaaS(Backend as a Service)
    • FaaS(Function as a Service) BaaS
    • 云服务端将后端需要的各种服务,例如认证服务、数据库、消息队列、文件存储、代码构建等各种后端功能封装为API提供给用户
    • 用户只需要根据BaaS的API编写并提交代码即可自动完成应用构建、部署、运行、扩缩容等功能
  • FaaS

    • 由事件驱动计算执行的应用架构模型
    • 开发人员编写逻辑代码,并将其部署到完全由平台(云服务商)管理的容器中,然后按需执行
      • 开发人员通过API调用Serverless应用
      • FaaS服务商通过API网关来处理API调用请求
    • 运行Serverless代码的容器的特点
      • 无状态 - 让数据集成变得更加简单
      • 寿命短 - 可以只运行非常短的时间
      • 由事件触发 - 可在需要时自动运行
      • 完全由云提供商管理

        BAAS模型

  • 较之PaaS,BaaS能够为用户实现更多的价值

    • IaaS=数据中心+服务器+存储+网络
    • PaaS=IaaS+部署+管理+扩展
    • BaaS=PaaS+自动化构建
  • 缺点
    • 供应商锁定

image.png

  • BAAS与FAAS的区别与联系
    • BaaS处理整个后端功能,而FaaS仅处理应用程序中支持响应的事件

image.png

serverless的优缺点

  • 优点
    • 较低的运维成本
    • 较低的开发成本
    • 自动化弹性扩展
    • 较高的计算资源利用率
  • 缺点

    • 仅支持无状态服务
    • 延迟问题
      • 高度分布式导致延迟增大
      • 冷启动存在延迟
    • 尚未形成统一标准
    • 存在厂商锁定的可能性

      serverLess主流产品

  • 云厂商的FaaS产品

    • AWS Lambda
    • Google Cloud Functions
    • Microsoft Azure Functions (open source)
    • Aliyun Function Compute
    • Huawei Cloud FunctionGraph(函数工作流)
    • ……
  • 开源解决方案

    • Apache OpenWhisk
    • OpenFaaS
    • Fission
    • Kubeless
    • Knatvie

      Knative

      简介

      基于 Kubernetes 平台,用于部署和管理现代 serverless 工作负载是Serverless平台,而非Serverless的实现
      image.png
      若能够把Kubernetes看作是一个分布式的内核,则Knative也可被类比为该内核之上的分布式的libc
      image.png
  • Knative项目简介

    • 读音为“kay-nay-tiv”,由Google于2018年7月正式发布
    • Kubernetes平台的原生扩展组件,让其能够轻松地部署、运行和管理Serverless类型的云原生应用
    • 由RedHat、Google和IBM等公司,以及各种初创公司组成的开源社区共同维护
    • 目标在于Serverless技术标准化
  • Knative的组件
    • Serving
      • 部署、管理及扩展无状态应用
      • 支持由请求驱动计算
      • 支持缩容至0
    • Eventing
      • 以声明的方式创建对事件源的订阅,并将事件路由到目标端点
      • 事件订阅、传递和处理
      • 基于pub/sub模型连接Knative的工作负载
    • Build
      • 从源代码构建出应用镜像
      • 已经由独立的Tekton项目取代

image.png

knative架构体系

image.png

  • 遵照Kubernetes的范式,以扩展的方式,通过自定义API资源类型支持
    • 自动化完成服务的部署和扩缩容(Serving)
    • 标准化事件驱动基础设施(Eventing)
  • Serving
    • Serving Controller
    • Resources API
      • Service
      • Configuration
      • Revision
      • Route
  • Eventing

    • Eventing Controller
    • Resources API
      • Broker
      • Trigger
      • EventType

        Serving

        相关的资源API定义在“serving.knative.dev”群组中
        image.png
  • 主要包括四个CRD

    • Service
      • 对自动编排Serverless类型应用的功能的抽象,负责自动管理工作负载的整个生命周期
      • 它能自动控制下面三个类型的资源对象的管理
    • Configuration
      • 反映了Service当前期望状态(Spec)的配置
      • Service对象的更新,也将导致Configuration的更新
    • Revision
      • Service的每次代码或配置变更都会生成一个Revision
      • 快照型数据,不可变
    • Route
      • 将请求流量路由到目标Revision
      • 支持将流量按比例切分并路由到多个Revision

        Eventing

        关于“事件”
  • 事件是一个不可变的小段数据,记录了系统在特定时间内的特定行为,或状态的转变

  • 通过读取系统的事件流(序列),可以重建系统的运行历史
  • 事件的格式
    • 事件的格式完全可由开发者自行决定
    • CNCF的CloudEvents规范至力于事件格式的标准化
    • 目前,众多云服务商都开始支持该规范
  • 关于“事件驱动”
    • 不存在一个规范、严格的定义,任何使用事件通知范式(pub/sub)的系统都是事件驱动的系统
    • 事件驱动的系统大体分为两类
      • 响应式(reactive):本质上是非同步性质的函数调用(或HTTP RESTful/RPC调用)
      • 流处理(stream processing):密集式、面向数据式使用事件,订阅者通常是流处理器,它从事件流中提取状态,并将状态传递给相关方
  • 关于“事件源(Event Sourcing)”

    • 事件数据的持久化模式
    • 通常基于事件日志保存不可变的事件信息

      Knative Eventing

  • 负责为事件的生产和消费提供基础设施,可将事件从生产者路由到目标消费者,从而让开发人员能够使用事件驱动架构

  • 各资源者是松散耦合关系,可分别独立开发和部署
  • 遵循CloudEvents规范

image.png

需要说明的几个问题

Knative是FaaS解决方案吗?

  • Knative并未提供FaaS
  • 用户可在Knative和Kubernetes之上,借助于第三方项目自行构建FaaS系统,例如Kyma Project

Knative为Kubernetes扩展出的功能

  • Serving
    • 替代Deployment控制器,负责编排运行基于HTTP协议的无状态应用
    • 额外提供的功能特性
      • Knative的Service对象,相当于Kubernetes上的 Service+Deployment 的功能
      • 基于单个请求进行负载均衡
      • 基于请求的快速、自动化扩缩容,并支持收缩至0实例
      • 通过在Pod扩展时缓冲请求来削峰填谷
      • 流量切分
      • ……
  • Eventing

    • 声明式事件配置接口

      knative适合运行的应用类型

  • Knative仅适合运行特定类型的应用:无状态、容器化的服务器应用

    • 监听于某套接字之上提供服务的应用,不适合运行批处理作业;
    • 仅支持无状态应用,同一服务的各实例间无差别,可简单进行扩容和缩容;
    • 仅支持通过HTTP/1、HTTP/2或gRPC通信的服务端应用;
    • 应用程序要能够构建为OCI容器镜像;

      部署Knative

      环境准备

  • 部署环境

    • Kubernetes:v1.23
    • Knative:v1.2
    • networking layer:
  • 可用部署方式
    • 基于YAML配置文档直接部署
      • Serving和Eventing需要分别进行部署
    • 借助Knative Operator进行部署
      • 首先部署Knative Operator
      • 通过Operator的KnativeServing部署Serving
      • 通过Operator的KnativeEventing资源部署Eventing
  • 需要部署的Knative组件

    • Serving
    • Eventing
    • kn (Knative CLI)

      环境要求

  • For prototyping purposes

    • 单节点的Kubernetes集群,有2个可用的CPU核心,以及4g内存;
  • For production purposes

    • 单节点的Kubernetes集群,需要至少有6个CPU核心、6G内存和30G磁盘空间
    • 多节点的Kubernetes集群中,每个节点至少有2个CPU核心,4G内存和20G磁盘空间
    • Kubernetes版本最低为v1.21

      安装步骤

  • 官方站点: https://knative.dev/docs/install/

  • 部署Serving核心组件
  • 部署网络层(networking layer)组件
    • Istio、Contour和Kourier三选一
  • (可选)配置DNS
  • (可选)部署Serving扩展

    • HPA:用于支持Kubernetes的HPA
    • Cert Manager:用于为工作负载自动签发TLS证书
    • Encrypt HTTP01:用于为工作负载自动签发TLS证书

      部署Serving

      | 主机ip | hostname | 备注与属性 | | —- | —- | —- | | 10.168.56.110 | k8s-ha | external IP,与宿主机和k8s节点能通信 | | 10.168.56.200 | k8s-deploy | kubeasz3.2.0 ,用于部署k8s集群 | | 10.168.56.201 | k8s-master1 | k8s v1.23.1 master,etcd 2c4g | | 10.168.56.202 | k8s-master2 | k8s v1.23.1 master,etcd 2c4g | | 10.168.56.203 | k8s-master3 | k8s v1.23.1 master,etcd 2c4g | | 10.168.56.204 | k8s-node1 | k8s v1.23.1 node 4c8g | | 10.168.56.205 | k8s-node2 | k8s v1.23.1 node 4c8g | | 10.168.56.206 | k8s-node3 | k8s v1.23.1 node 4c8g |
  • 参考代码: https://github.com/iKubernetes/knative-in-practise/tree/main/knative-deploy-v1.2/serving

  • 参考文档: https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/
  • k8s执行如下操作

serving-core.yamlserving-crds.yaml

  1. kubectl apply -f serving-crds.yaml
  2. kubectl api-versions | grep serving
  3. kubectl api-resources --api-group=serving.knative.dev
  4. kubectl apply -f serving-core.yaml
  5. kubectl get ns
  • 部署network layer

istio.yamlnet-istio.yaml

  1. kubectl apply -l knative.dev/crd-install=true -f istio.yaml
  2. kubectl apply -f istio.yaml
  3. kubectl apply -f net-istio.yaml
  • 调整外网service(external IP: ) ``` root@k8s-deploy:~# kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.68.134.87 15021:61145/TCP,80:37658/TCP,443:51054/TCP 32m istiod ClusterIP 10.68.12.199 15010/TCP,15012/TCP,443/TCP,15014/TCP 32m knative-local-gateway ClusterIP 10.68.77.117 80/TCP 32m

root@k8s-deploy:~# kubectl edit svc istio-ingressgateway -n istio-system clusterIPs:

  • 10.68.134.87 externalIPs:
  • 10.168.56.110 externalTrafficPolicy: Cluster

root@k8s-deploy:~# kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.68.134.87 10.168.56.110 15021:61145/TCP,80:37658/TCP,443:51054/TCP 34m istiod ClusterIP 10.68.12.199 15010/TCP,15012/TCP,443/TCP,15014/TCP 34m knative-local-gateway ClusterIP 10.68.77.117 80/TCP 34m

  1. - 安装可选拓展
  2. - HPA: [https://github.com/knative/serving/releases/download/knative-v1.2.0/serving-hpa.yaml](https://github.com/knative/serving/releases/download/knative-v1.2.0/serving-hpa.yaml)
  3. - certmanager: [https://github.com/knative/net-certmanager/releases/download/knative-v1.2.0/release.yaml](https://github.com/knative/net-certmanager/releases/download/knative-v1.2.0/release.yaml)
  4. [release.yaml](https://www.yuque.com/attachments/yuque/0/2022/yaml/2391625/1647104343901-9f2b1fb9-ade1-43e4-ba5d-876f8ed496f6.yaml?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2022%2Fyaml%2F2391625%2F1647104343901-9f2b1fb9-ade1-43e4-ba5d-876f8ed496f6.yaml%22%2C%22name%22%3A%22release.yaml%22%2C%22size%22%3A13126%2C%22type%22%3A%22%22%2C%22ext%22%3A%22yaml%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22uddcb3463-2522-443e-b605-c974d007946%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u7d309c38%22%2C%22card%22%3A%22file%22%7D)[serving-hpa.yaml](https://www.yuque.com/attachments/yuque/0/2022/yaml/2391625/1647104343902-cdd21f87-c576-42ca-81d7-2ddc98219548.yaml?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2022%2Fyaml%2F2391625%2F1647104343902-cdd21f87-c576-42ca-81d7-2ddc98219548.yaml%22%2C%22name%22%3A%22serving-hpa.yaml%22%2C%22size%22%3A3601%2C%22type%22%3A%22%22%2C%22ext%22%3A%22yaml%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22uc7cb7a5f-cfb6-481b-9629-46260905f79%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u9d92d17a%22%2C%22card%22%3A%22file%22%7D)

kubectl apply -f serving-hpa.yaml kubectl apply -f cert-manager.yaml

  1. - kn 客户端的安装
  2. - 官方文档: [https://knative.dev/docs/install/client/install-kn/](https://knative.dev/docs/install/client/install-kn/)

root@k8s-master1:~# wget https://github.com/knative/client/releases/download/knative-v1.2.0/kn-linux-amd64 root@k8s-master1:~# mv kn-linux-amd64 kn root@k8s-master1:~# chmod +x kn root@k8s-master1:~# mv kn /usr/bin/ root@k8s-master1:~# kn version Version: v1.2.0 Build Date: 2022-01-26 03:13:06 Git Revision: 5030b5df Supported APIs:

  • Serving
    • serving.knative.dev/v1 (knative-serving v0.29.0)
  • Eventing
    • sources.knative.dev/v1 (knative-eventing v0.29.0)
    • eventing.knative.dev/v1 (knative-eventing v0.29.0)

```

  • Knative CLI

    • kn不支持读取YAML配置文件,其所有参数均要通过命令行选项提供
    • 支持Serving和Eventing中的核心资源管理
    • 支持插件化扩展,目前可用的主流插件
      • kn-plugin-admin:管理Kubernetes集群上部署的knative
      • kn-plugin-quickstart:帮助用户快速设定本地可用的Knative环境
      • kn-plugin-source-kafka:管理由eventing-kafka安装的Kafka Source
      • kn-plugin-source-kamelet:管理由Camel-K安装的Kamelet Sources
      • kn-plugin-event:于集群上或集群外部生成CloudEvents

        serving组件介绍

  • Serving依赖于几个关键的组件协同其管理能力

    • Activator:Revision中的Pod数量收缩至0时,activator负责接收并缓存相关的请求,同时报告指标数据给Autoscaler,并在Autoscaler在Revision上扩展出必要的Pod后,再将请求路由至相应的Revision;
    • Autoscaler:Knative通过注入一个称为queue-proxy容器的sidecar代理来了解它部署的Pod上的请求,而Autoscaler会为每个服务使用“每秒请求数”来自动缩放其Revision上的Pod;
    • Controller:负责监视Serving CRD(KService、Configuration、Route和Revision)相关的API对象并管理它们的生命周期,是Serving声明式API的关键保障;
    • Webhook:为Kubernetes提供的外置Admission Controller,兼具Validation和Mutation的功能,主要作用于Serving专有的几个API资源类型之上,以及相关的ConfigMap资源上;
    • Domain-mapping:将指定的域名映射至Service、KService,甚至是Knative Route之上,从而使用自定义域名访问特定的服务;
    • Domainmapping-Webhook:Domain-mapping专用的Admission Controller
    • net-certmanager-controller:与Cert Manager协同时使用的专用的控制器;
    • net-istio-controller:与Istio协同时使用的专用控制器

      Serving有如下几个专用的CRD

  • serving.knative.dev群组

    • Service
    • Configuration
    • Revision
    • Route
    • DomainMapping
  • autoscaling.internal.knative.dev群组
    • Metric
    • PodAutoscaler
  • networking.internal.knative.dev群组

    • ServerlessService
    • ClusterDomainClaim
    • Certificate

      运行knative应用

      在Serving上,可通过创建Knative Service对象来运行应用;该Service资源会自动创建
      image.png
  • 一个Configuration对象,它会创建一个Revision,并由该Revision自动创建如下两个对象

    • 一个Deployment对象
    • 一个PodAutoscaler对象
  • 一个Route对象,它会创建
    • 一个Kubernetes Service对象
    • 一组Istio VirtualService对象
      • {kservice-name}-ingress
      • {kservice-name}-mesh
  • Knative Service资源(简称kservice或ksvc)的资源规范主要有两个字段
    • template:用于创建或更新Configuration,任何更新,都将创建新的Revision对象
    • traffic:用于创建或更新Route对象