OpenShift 4 - Knative教程 (3) 了解Knative Serving的核心对象
《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.10环境中验证
文章目录
- Knative Serving的核心对象
- 创建Knative Serving应用
- 通过Configuration和Route实现蓝绿部署
- 通过Service部署应用
Knative Serving的核心对象
一个 Knative 应用主要包括四类对象:Service(不同于Kubernetes的Service)、Route(类似但不是OpenShift的Route)、Configuration、Revision。
- Service(不同于Kubernetes的Service):它是一个集合,可以在Service中通过Template定义Knative的Route和Configuration对象。
- Configuration(类似OpenShift的DeploymentConfig): 创建并记录所有Revision的情况。用kn命令更新Service的时候实际就是在更新Configuration,而每次更新Configuration都会生成一个新的Revision。
- Revision:是一个特定的应用和配置环境的快照。该对象一旦生成就不可更改了(Immutable)。一个Revision对象对应一个Kubernetes Deployment对象。由于每次更新Configuration对象都会生成一个新的Revision,因此要不然每次都指定一个不同的Revision名称,要不就让Knative自动生成一个Revision名称。
- Route(类似但不是OpenShift的Route对象):Knative的Route是运行在也是用来做请求分发路由的,它是用Istio VirtualRoute实现,它定义了请求如何通过Traffic策略发给指定的Revision。蓝绿部署和金丝雀发布都是通过Route实现的。
无服务器应用的特点就是当没有外部请求的时候服务器是不需要运行Pod,只有在有请求的时候在启动Pod运行应用处理请求。在Knative中,这种按需的运行应用的效果是通过Activator和Autoscaler实现的。我们可以在OpenShift中的knative-serving项目中看到相关的支撑环境。
- 当首次通过Route访问Knative应用(假设此时还没有运行应用的Pod)的时候,请求将会先被Route发给Activator,Activator会激活目标Revision环境,Revision在通过Kubernetes Deployment启动Pod运行应用。这个过程完成了从无服务器到有服务器的过程,当有服务器运行Pod后就可以处理请求了。
- 当已经有运行应用的Pod的情况下,Route会直接将请求发给和Revsion对应的Pod。
- Autoscaler会监控Revision中的Pod运行其情况并收集Metrics数据,然后根据策略决定是扩展还是收缩Pod的数量。而扩展或收缩的动作是Revision通知Kubernetes的Deployment完成的。
创建Knative Serving应用
一个Knative Serving应用包括Service、Route、Configuration、Revision对象。他们的关系是Service=Route+Configuration,因此可以通过分别操作Route和Configuration或操作Service实现对Knative Serving应用的配置。
通过Configuration和Route实现蓝绿部署
- 创建新项目。
$ oc new-project kn-blue-green
- 创建内容如下的blue-config.yaml文件,其中定义了名为blue-green-demo的Configuration对象,该对象使用的镜像是“gcr.io/knative-samples/knative-route-demo:blue”。
apiVersion: serving.knative.dev/v1
kind: Configuration
metadata:name: blue-green-demo
spec:template:spec:containers:- image: gcr.io/knative-samples/knative-route-demo:blue env:- name: T_VERSIONvalue: "blue"
- 根据blue-config.yaml创建名为blue-green-demo的Configuration。
$ oc apply -f blue-config.yaml
configuration.serving.knative.dev/blue-green-demo created
- 查看项目中的对象,可以看到伴随Configuration还生成了Revision、Deployment、Replicset和Pod。其中Revision名为自动生成的blue-green-demo-jvtg7。
$ oc get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/blue-green-demo-00001 ClusterIP 172.30.196.112 <none> 80/TCP 6m18s
service/blue-green-demo-00001-private ClusterIP 172.30.38.4 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP,8012/TCP 6m18sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/blue-green-demo-00001-deployment 0/0 0 0 6m18sNAME DESIRED CURRENT READY AGE
replicaset.apps/blue-green-demo-00001-deployment-79867d6f57 0 0 0 6m18sNAME LATESTCREATED LATESTREADY READY REASON
configuration.serving.knative.dev/blue-green-demo blue-green-demo-00001 blue-green-demo-00001 TrueNAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON ACTUAL REPLICAS DESIRED REPLICAS
revision.serving.knative.dev/blue-green-demo-00001 blue-green-demo 1 True 0 0
- 创建以下内容的blue-route.yaml文件,其中定义了Route对象。注意:需要将文件中的"revisionName"名称中的“blue-green-demo-XXX”替换为上一步创建的名为“blue-green-demo-00001”的Revision。
apiVersion: serving.knative.dev/v1
kind: Route
metadata:name: blue-green-demo # The name of our route; appears in the URL to access the app
spec:traffic:- revisionName: blue-green-demo-00001 # replace XXX with your RevisionNamepercent: 100 # All traffic goes to this revision
- 执行blue-route.yaml文件创建Route对象。
$ oc apply -f blue-route.yaml
route.serving.knative.dev/blue-green-demo created
- 访问通过blue-green-demo的Route访问应用。确认返回页面中有“
App v1
”。
$ curl $(kn route list blue-green-demo --no-headers | awk '{print $2}')
<!DOCTYPE html>
<html lang="en">
<head> <title>Knative Routing Demo</title> <link rel="stylesheet" type="text/css" href="/css/app.css" />
</head>
<body> <div class="blue">App v1</div> </div>
</body>
- 创建内容如下的green-config.yaml文件,其中定义了名为blue-green-demo的Configuration对象,该对象使用的镜像是“gcr.io/knative-samples/knative-route-demo:green”。
apiVersion: serving.knative.dev/v1
kind: Configuration
metadata:name: blue-green-demo # Configuration name is unchanged, since we're updating an existing Configuration
spec:template:spec:containers:- image: gcr.io/knative-samples/knative-route-demo:green # URL to the new version of the sample app docker imageenv:- name: T_VERSIONvalue: "green" # Updated value for the T_VERSION environment variable
- 执行green-config.yaml文件,更新名为blue-green-demo的Configuration。
$ oc apply -f green-config.yaml
configuration.serving.knative.dev/blue-green-demo configured
- 查看项目中对象的变化情况,确认已经有2个revision了。
$ oc get all
NAME READY STATUS RESTARTS AGE
pod/blue-green-demo-00002-deployment-8548c46d87-m4589 2/2 Running 0 11sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/blue-green-demo ExternalName <none> kourier-internal.knative-serving-ingress.svc.cluster.local 80/TCP 14m
service/blue-green-demo-00001 ClusterIP 172.30.196.112 <none> 80/TCP 32m
service/blue-green-demo-00001-private ClusterIP 172.30.38.4 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP,8012/TCP 32m
service/blue-green-demo-00002 ClusterIP 172.30.248.78 <none> 80/TCP 11s
service/blue-green-demo-00002-private ClusterIP 172.30.28.28 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP,8012/TCP 11sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/blue-green-demo-00001-deployment 0/0 0 0 32m
deployment.apps/blue-green-demo-00002-deployment 1/1 1 1 11sNAME DESIRED CURRENT READY AGE
replicaset.apps/blue-green-demo-00001-deployment-79867d6f57 0 0 0 32m
replicaset.apps/blue-green-demo-00002-deployment-8548c46d87 1 1 1 11sNAME LATESTCREATED LATESTREADY READY REASON
configuration.serving.knative.dev/blue-green-demo blue-green-demo-00002 blue-green-demo-00002 TrueNAME URL READY REASON
route.serving.knative.dev/blue-green-demo https://blue-green-demo-kn-blue-green.apps.cluster-jzmgb.jzmgb.sandbox866.opentlc.com TrueNAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON ACTUAL REPLICAS DESIRED REPLICAS
revision.serving.knative.dev/blue-green-demo-00001 blue-green-demo 1 True 0 0
revision.serving.knative.dev/blue-green-demo-00002 blue-green-demo 2 True 1 1
- 创建以下内容的green-route.yaml文件,其中更新了Route对象。注意:需要将文件中的2个"revisionName"名称中的“blue-green-demo-00001”和““blue-green-demo-00001””按照对应替换为上一步创建的名为“blue-green-demo-tfrnt”和“blue-green-demo-5hr8j”的Revision。
apiVersion: serving.knative.dev/v1
kind: Route
metadata:name: blue-green-demo # Route name is unchanged, since we're updating an existing Route
spec:traffic:- revisionName: blue-green-demo-00001percent: 0 - revisionName: blue-green-demo-00002percent: 100 tag: v2 # A named route
- 执行green-route.yaml文件,更新名为blue-green-demo的Route。
$ oc apply -f green-route.yaml
configuration.serving.knative.dev/blue-green-demo configured
- 访问通过blue-green-demo的Route访问应用。确认返回页面中有“
App v2
”。
$ curl $(kn route list blue-green-demo --no-headers | awk '{print $2}')
<!DOCTYPE html>
<html lang="en">
<head><title>Knative Routing Demo</title><link rel="stylesheet" type="text/css" href="/css/app.css" />
</head>
<body><div class="green">App v2</div></div>
</body>
- 还可进一步编辑blue-green-route.yaml文件中的Traffic比例,从而从green回退到blue版本,同时还可实现金丝雀发布。
通过Service部署应用
- 创建定义Service的greeter-service.yaml文件,为以下内容。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:name: greeter
spec:template:metadata:name: greeter-v1spec:containers:- image: quay.io/rhdevelopers/knative-tutorial-greeter:quarkus
- 执行命令创建Service对象。
$ oc apply -f greeter-service.yaml
service.serving.knative.dev/greeter created
- 确认名为greeter的Knative Route已经是READY为True的状态。
$ kn route list greeter
NAME URL READY
greeter https://greeter-kn-blue-green.apps.cluster-jzmgb.jzmgb.sandbox866.opentlc.com True
- 通过Knative Route访问greeter应用。
$ curl $(kn route list greeter --no-headers | awk '{print $2}')
Hi greeter => '9861675f8845' : 1
OpenShift 4 - Knative教程 (3) 了解Knative Serving的核心对象相关推荐
- OpenShift 4 - Knative教程 (1) 创建Serverless运行环境
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 说明 客户端环境 配置Knative环境 安装OpenShift Serv ...
- Knative 实战:基于 Knative Serverless 技术实现天气服务-下篇
上一期我们介绍了如何基于 Knative Serverless 技术实现天气服务-上篇,首先我们先来回顾一下上篇介绍的内容: 通过高德天气 API 接口,每隔 3 个小时定时发送定时事件,将国内城市未 ...
- 尚硅谷大数据技术Spark教程-笔记02【SparkCore(核心编程,map、mapPartitions、mapPartitionsWithIndex、flatMap、glom、groupBy)】
视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...
- OpenShift 4 - Knative教程 (7) Eventing之Broker和Trigger
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 概念 操作说明 部署Broker 部署Service作为Sink 部署Ev ...
- OpenShift 4 - Knative教程 (6) Eventing之Channel和Subscription
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 概念 操作 参考 概念 Knative Eventing中的Channel ...
- OpenShift 4 - Knative教程 (5) Eventing之Source和Sink
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 创建 Knative Eventing 环境 配置Source和Sink ...
- OpenShift 4 - Knative教程 (4) 自动扩展和收缩
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 自动扩展和收缩功能说明 配置自动扩展收缩 配置扩展收缩上下限 自动扩展和收 ...
- OpenShift 4 - Knative教程(2) 基于Revision/Tag/Traffic实现蓝绿部署和恢复发布
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 基于Revision/Tag/Traffic实现蓝绿部署和恢复发布 基于R ...
- OpenShift 4 - 使用教程和免费试用环境
<OpenShift 4.x HOL教程汇总> 红帽在 "https://developers.redhat.com/learn" 为开发人员提供了大量的产品使用教程以 ...
最新文章
- java jtable 单元格合并_JTable 单元格合并 【转】
- 搭架SSH服务器学习笔记
- thinkPhp 3.1.3的验证码无法显示的问题
- MySQL中的SQL Mode及其作用
- MVC一个action对应多个视图的写法
- 【转】JAVA错误:The public type *** must be defined in its own file***
- poj 3630 Phone List(字典树)
- lesson 040 —— 面向对象简介
- python 代码封装为webservice_python实现soaplib搭建webservice详细步骤和实例代码
- 要计算机桌面,科幻再次要成真:你的办公桌面很快也会变成计算机
- Nifi 常用Processor
- 安徽农业大学计算机考研分数线,安徽农业大学历年考研分数线汇总[2012-2021]
- 计算机内打不开小米路由器,小米路由器登录界面打不开怎么办?
- 【老生谈算法】matlab实现模糊K-均值算法——均值算法
- 《电子商务与企业经营管理》
- 数据库基础_关系与关系模式
- 书论49 蔡襄《论书》
- bom成本分析模型_BOM成本估算表
- linux shell 判断一个文件是不是链接文件
- [转]李战大师-悟透delphi-第二章 DELPHI与WIN32时空
热门文章
- python 单链表查找元素_如何在python中一次找到链表的中间元素?
- java当前月份减一个月_Java获取当前时间的上一个月和下一个月,第一天和最后一天,任意时间的第一天和最后一天,任意时间上一个月和下一个月...
- linux网络协议栈 转发组播,Linux 网络协议栈开发基础篇(十)—— 组播(Multicast)基础...
- UI设计灵感|有声读物APP界面设计
- 美食海报设计技巧?有机轻食饮食新趋势!
- (秋季)秋天海报设计素材模板
- w10自动删除文件怎么关了_清理win10系统垃圾方法,自动更新文件删除介绍
- Python学习心路历程
- Python使用yagmail库实现发送邮件功能
- 深入理解 Docker 架构 | 图文